2017-01-25 18 views
0

これは私が取り組んでいるフラッシュゲーム用です。私はLevelOnePlayerとWall11間の衝突検出を改善しようとしています。しかし、壁ヒット検出の変数を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

あなたはピクセル完璧な衝突検出を探しているなら、あなたは少しあなたの方法を変更し、あなたが好きな場合は、2つの機能/実装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なしで次のことを書いたことに注意してくださいので、構文エラーまたは2があるかもしれませんしてください。

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