多くの条件を設定する必要はありません。次の例をご覧ください。
_keys = new Object();
_keys[Keyboard.D] = false;
_keys[Keyboard.A] = false;
_keys[Keyboard.W] = false;
_keys[Keyboard.S] = false;
this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyInteraction);
this.stage.addEventListener(KeyboardEvent.KEY_UP, keyInteraction);
//---Key events
function keyInteraction(evt:KeyboardEvent){
if( _keys.hasOwnProperty(evt.keyCode) ){
_keys[evt.keyCode] = Boolean( evt.type == KeyboardEvent.KEY_DOWN );
}
}
A、W、Dまたはキーを押すか放すとS、それぞれの _keysObject
プロパティが からtrue
に変わりますfalse
。
さて、そのhitTest
部分。この最後のメソッドは、両方のオブジェクトの境界が接触しているかどうかのみをチェックするため、hitTestPoint
メソッドよりもメソッドの方が優れている可能性があります。メソッドは、が のいずれかのピクセルに接触してhitestObject
いるhitTestPoint
かどうかをチェックします。point
Object
プレーヤーを 5 ピクセルごとに移動すると、オブジェクトに触れない正しい位置にプレーヤーを復元する必要があります (while
この目的のためにサイクルを作成しました)。ゲームのデザインによっては、コードを変更する必要がありますが、これはあなたの目的をガイドします:
は触れられないmaze
オブジェクトです。player
プレーヤーの getPoint メソッド
public function getPoint(corner:uint){
var point:Point = this.parent.localToGlobal( new Point( this.x, this.y ) );
if(corner == 1 || corner == 2) point.x += _w;
if(corner == 2 || corner == 3) point.y += _h;
return point;
}
HitTest コード (ゲームティック)
//---Move the player
private function gameTick(evt:Event):void{
var hit:Boolean = false;
//---Sum the vars horizontal
if( _keys[Keyboard.D] ) _player.x += 5;
if( _keys[Keyboard.A] ) _player.x -= 5;
//---Check if the point is inside the scene in the horizontal
if(_player.x < 0) _player.x = 0;
if(_player.x > this.stage.stageWidth - _player.width) _player.x = this.stage.stageWidth - _player.width;
var TL:Point = _player.getPoint(0);
var TR:Point = _player.getPoint(1);
var BR:Point = _player.getPoint(2);
var BL:Point = _player.getPoint(3);
//---Hittest in the horizontal
if(
_maze.hitTestPoint(TL.x, TL.y, true)
||
_maze.hitTestPoint(TR.x, TR.y, true)
||
_maze.hitTestPoint(BR.x, BR.y, true)
||
_maze.hitTestPoint(BL.x, BL.y, true)
){
var sumX:int = 0;
if( _keys[Keyboard.D] ) sumX = -1;
if( _keys[Keyboard.A] ) sumX = 1;
hit = true;
while(hit){
TL.x += sumX;
TR.x += sumX;
BR.x += sumX;
BL.x += sumX;
if(
!_maze.hitTestPoint(TL.x, TL.y, true)
&&
!_maze.hitTestPoint(TR.x, TR.y, true)
&&
!_maze.hitTestPoint(BR.x, BR.y, true)
&&
!_maze.hitTestPoint(BL.x, BL.y, true)
){
hit = false;
_player.x = TL.x;
}
}
}
//---Sum the vars vertical
if( _keys[Keyboard.S] ) _player.y += 5;
if( _keys[Keyboard.W] ) _player.y -= 5;
//---Check if the point is inside the scene in the vertical
if(_player.y < 0) _player.y = 0;
if(_player.y > this.stage.stageHeight - _player.height) _player.y = this.stage.stageHeight - _player.height;
TL = _player.getPoint(0);
TR = _player.getPoint(1);
BR = _player.getPoint(2);
BL = _player.getPoint(3);
if(
_maze.hitTestPoint(TL.x, TL.y, true)
||
_maze.hitTestPoint(TR.x, TR.y, true)
||
_maze.hitTestPoint(BR.x, BR.y, true)
||
_maze.hitTestPoint(BL.x, BL.y, true)
){
var sumY:int = 0;
if( _keys[Keyboard.S] ) sumY = -1;
if( _keys[Keyboard.W] ) sumY = 1;
hit = true;
while(hit){
TL.y += sumY;
TR.y += sumY;
BR.y += sumY;
BL.y += sumY;
if(
!_maze.hitTestPoint(TL.x, TL.y, true)
&&
!_maze.hitTestPoint(TR.x, TR.y, true)
&&
!_maze.hitTestPoint(BR.x, BR.y, true)
&&
!_maze.hitTestPoint(BL.x, BL.y, true)
){
hit = false;
_player.y = TL.y;
}
}
}
}
サンプルをダウンロード