2017-01-25 2 views
0

이것은 내가 진행하고있는 플래시 게임을위한 것입니다. LevelOnePlayer와 Wall11 사이의 충돌 감지 기능을 개선하려고합니다. 그러나 Wall Hit Detection 변수를 0.1 픽셀 씩 변경하더라도 플레이어가 벽에 너무 가깝거나 너무 멀면 충돌을 계속 감지합니다. 어쨌든 충돌 감지 픽셀을 완벽하게 만들 수 있습니까?Actionscript 3.0. 충돌 감지를 보정하는 방법?

const LEFT_WALL_HIT_DETECTION: Number=5.5; 
const RIGHT_WALL_HIT_DETECTION: Number=5.5; 
const UP_WALL_HIT_DETECTION: Number=5.5; 
const DOWN_WALL_HIT_DETECTION: Number=5.5; 
const ENEMY_HIT_DETECTION: Number=5.5; 

var left:Boolean = false; 
var right:Boolean = false; 
var up:Boolean = false; 
var down:Boolean = false; 

var leftBumping:Boolean = false; 
var rightBumping:Boolean = false; 
var upBumping:Boolean = false; 
var downBumping:Boolean = false; 



var Onespeed: Number=3.5; 
var LevelOneStartFrame: Number=1010; 
addEventListener(Event.ENTER_FRAME, LevelOne); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); 
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); 
    function keyPressed(event:KeyboardEvent): void{ 
     if(event.keyCode == Keyboard.LEFT || event.keyCode == 65){ 
      left=true; 
     } 
     if(event.keyCode == Keyboard.RIGHT || event.keyCode == 68){ 
      right=true; 
     } 
     if(event.keyCode == Keyboard.UP || event.keyCode == 87){ 
      up=true; 
     } 
     if(event.keyCode == Keyboard.DOWN || event.keyCode == 83){ 
      down=true; 
     } 
    } 
    function keyReleased(event:KeyboardEvent): void{ 
     if(event.keyCode == Keyboard.LEFT || event.keyCode == 65){ 
      left=false; 
     } 
     if(event.keyCode == Keyboard.RIGHT || event.keyCode == 68){ 
      right=false; 
     } 
     if(event.keyCode == Keyboard.UP || event.keyCode == 87){ 
      up=false; 
     } 
     if(event.keyCode == Keyboard.DOWN || event.keyCode == 83){ 
      down=false; 
     } 
    } 
    function LevelOne(event:Event){ 
     if(left){ 
      LevelOnePlayer.x-=Onespeed; 
     } 
     if(right){ 
      LevelOnePlayer.x+=Onespeed; 
     } 
     if(up){ 
      LevelOnePlayer.y-=Onespeed; 
     } 
     if(down){ 
      LevelOnePlayer.y+=Onespeed; 
     } 
     if(Wall11.hitTestPoint(LevelOnePlayer.x-LEFT_WALL_HIT_DETECTION,  LevelOnePlayer.y, true)) 
     leftBumping=true; else leftBumping=false; 
     if(Wall11.hitTestPoint(LevelOnePlayer.x+RIGHT_WALL_HIT_DETECTION, LevelOnePlayer.y, true)) 
     rightBumping=true; else rightBumping=false; 
     if(Wall11.hitTestPoint(LevelOnePlayer.x, LevelOnePlayer.y+DOWN_WALL_HIT_DETECTION, true)) 
     downBumping=true; else downBumping=false; 
     if(Wall11.hitTestPoint(LevelOnePlayer.x, LevelOnePlayer.y-UP_WALL_HIT_DETECTION, true)) 
     upBumping=true; else upBumping=false; 

     if(leftBumping) LevelOnePlayer.x+=Onespeed; 
     if(rightBumping) LevelOnePlayer.x-=Onespeed; 
     if(downBumping) LevelOnePlayer.y-=Onespeed; 
     if(upBumping) LevelOnePlayer.y+=Onespeed; 
    } 
+0

또한 WASD 키가 완벽하게 작동하지 못했습니다. 거기에 어쨌든 해결할 수 있습니까? –

+1

게시 된 답변이 작동하면 '✔'아이콘을 사용하여 해결 된 것으로 표시하십시오. –

+0

이 문제를 해결하는 데 여전히 어려움이 있습니다. 이미 무비 클립을 그렸기 때문에 무비 클립을 코드없이 비트 맵으로 변환 할 수도 없습니다. LevelOnePlayer를 삭제하고 LevelOnePlayer와 똑같이 보이는 비트 맵 (코드 포함)을 만들려고 시도했지만 LevelOnePlayer라는 이름을 사용했지만 게임의 작동 방식이 크게 달라지기 때문에 도움이되지 않았습니다. 무비 클립을 코드없이 비트 맵으로 변환하는 방법이 있습니까? –

답변

1

당신이 완벽한 픽셀 충돌 감지를 찾고 있다면, 당신은 약간 방법을 변경하고 당신이 좋아하는 경우에 당신은이 개 기능/구현 here의 차이점에 대해 읽을 수 있습니다 대신 MovieClip.hitTestPoint();BitmapData.hitTest();를 사용해야합니다.

이것을 구현하려면 adobe docs으로 넘어갈 수 있지만 제공하는 스 니펫은 다음과 같습니다 (confusingggggg). 귀하의 경우에는

import flash.display.BitmapData; 
import flash.geom.Rectangle; 
import flash.geom.Point; 

var bmd1:BitmapData = new BitmapData(80, 80, true, 0x00000000); 
var rect:Rectangle = new Rectangle(20, 20, 40, 40); 
bmd1.fillRect(rect, 0xFF0000FF); 

var pt1:Point = new Point(1, 1); 
trace(bmd1.hitTest(pt1, 0xFF, pt1)); // false 
var pt2:Point = new Point(40, 40); 
trace(bmd1.hitTest(pt1, 0xFF, pt2)); // true 

, 당신은 다음을 수행하지만, IDE를하지 않고 다음 내가 쓴 점에 유의하시기 바랍니다, 그래서 구문 오류 또는 두 가지가있을 수 있습니다 :

var Wall1Rect:Rectangle = Wall1.getBounds(this); 
var Wall1BmpData = new BitmapData(Wall1Rect.width, Wall1Rect.height, true, 0); 

var playerRect:Rectangle = LevelOnePlayer.getBounds(this); 
var playerBmpData = new BitmapData(playerRect.width, playerRect.height, true, 0); 

if(playerBmpData.hitTest(new Point(LevelOnePlayer.x, LevelOnePlayer.y), 255, Wall1BmpData, new Point(Wall1.x, Wall1.y),255)) 
{ 
    trace("hit"); 
} 

또 다른 좋은 tutorial.