私は現在、自分のゲームのダメージ メカニックを構築しています。これは、'hurt' クラスと 'collision' クラスの 2 つのクラスで処理されます。衝突クラスは、それ自体のインスタンスを衝突クラスの「hurtCollision」メソッドに渡します。これにより、衝突クラスは、プレーヤーとその傷のインスタンス (表示オブジェクト) との間の衝突を検出できます。ただし、その関数にアクセスしようとすると、次のエラーが発生します。
1061: Call to a possibly undefined method hurtCollision through a reference with static type Class.
以下に 2 つのクラスを示します。
コリジョン クラス (ctrl f で hardCollision を実行できます):
package
{
import flash.display.MovieClip;
public class Collision extends MovieClip
{
private var e:*;
static public var _playerX:*;
static public var _playerY:*;
private var HIT_BOTTOM_1X:Number;
private var HIT_BOTTOM_2X:Number;
private var HIT_BOTTOM_3X:Number;
private var HIT_TOP_1X:Number;
private var HIT_TOP_2X:Number;
private var HIT_TOP_3X:Number;
private var HIT_R_1X:Number;
private var HIT_R_2X:Number;
private var HIT_R_3X:Number;
private var HIT_L_1X:Number;
private var HIT_L_2X:Number;
private var HIT_L_3X:Number;
private var HIT_BOTTOM_1Y:Number;
private var HIT_BOTTOM_2Y:Number;
private var HIT_BOTTOM_3Y:Number;
private var HIT_TOP_1Y:Number;
private var HIT_TOP_2Y:Number;
private var HIT_TOP_3Y:Number;
private var HIT_R_1Y:Number;
private var HIT_R_2Y:Number;
private var HIT_R_3Y:Number;
private var HIT_L_1Y:Number;
private var HIT_L_2Y:Number;
private var HIT_L_3Y:Number;
public function Collision(enginePass:*)
{
e = enginePass;
}
public function detectCollisions(object:*):void
{
_playerX = e._player.x;
_playerY = e._player.y;
HIT_BOTTOM_1X = object.x - object.width/2;
HIT_BOTTOM_2X = object.x;
HIT_BOTTOM_3X = object.x + object.width/2;
HIT_TOP_1X = object.x - object.width/2;
HIT_TOP_2X = object.x;
HIT_TOP_3X = object.x + object.width/2;
HIT_R_1X = object.x + object.width/2;
HIT_R_2X = object.x + object.width/2;
HIT_R_3X = object.x + object.width/2;
HIT_L_1X = object.x - object.width/2;
HIT_L_2X = object.x - object.width/2;
HIT_L_3X = object.x - object.width/2;
HIT_BOTTOM_1Y = object.y + object.height/2;
HIT_BOTTOM_2Y = object.y + object.height/2;
HIT_BOTTOM_3Y = object.y + object.height/2;
HIT_TOP_1Y = object.y - object.height/2;
HIT_TOP_2Y = object.y - object.height/2;
HIT_TOP_3Y = object.y - object.height/2;
HIT_R_1Y = object.y + object.height/2 - object.height/4;
HIT_R_2Y = object.y;
HIT_R_3Y = object.y - object.height/2 + object.height/4;
HIT_L_1Y = object.y + object.height/2 - object.height/4;
HIT_L_2Y = object.y;
HIT_L_3Y = object.y - object.height/2 - object.height/4;
if(e._ground.hitTestPoint(HIT_BOTTOM_1X,HIT_BOTTOM_1Y,true) || e._ground.hitTestPoint(HIT_BOTTOM_2X,HIT_BOTTOM_2Y,true)
|| e._ground.hitTestPoint(HIT_BOTTOM_3X,HIT_BOTTOM_3Y,true))
{
e._touchGround = true;
if(e._vy < 0)
{
e._vy = 0;
}
}
if(e._ground.hitTestPoint(HIT_TOP_1X,HIT_TOP_1Y,true) || e._ground.hitTestPoint(HIT_TOP_2X,HIT_TOP_2Y,true)
|| e._ground.hitTestPoint(HIT_TOP_3X,HIT_TOP_3Y,true))
{
e._jump = false;
e._vy = -(e._vy) - 5;
}
if(e._ground.hitTestPoint(HIT_R_1X,HIT_R_1Y,true) || e._ground.hitTestPoint(HIT_R_2X,HIT_R_2Y,true)
|| e._ground.hitTestPoint(HIT_R_3X,HIT_R_3Y,true))
{
if(e._vx > 0)
{
e._vy += e._vx;
}
if(e._ground.hitTestPoint(HIT_TOP_3X, HIT_TOP_3Y, true))
{
if(e._vx > 0)
{
e._vx = -(e._vx) *2;
}
}
}
if(e._ground.hitTestPoint(HIT_L_1X,HIT_L_1Y,true) || e._ground.hitTestPoint(HIT_L_2X,HIT_L_2Y,true)
|| e._ground.hitTestPoint(HIT_L_3X,HIT_L_3Y,true))
{
if(e._vx < 0)
{
e._vy += Math.abs(e._vx);
}
if(e._ground.hitTestPoint(HIT_TOP_1X, HIT_TOP_1Y, true))
{
if(e._vx < 0)
{
e._vx = -(e._vx) *2;
}
}
}
if(e._ground.hitTestPoint(HIT_TOP_3X, HIT_TOP_3Y, true) && e._ground.hitTestPoint(HIT_BOTTOM_3X, HIT_BOTTOM_3Y, true))
{
e._vy += 20;
}
if(e._ground.hitTestPoint(HIT_TOP_1X, HIT_TOP_1Y, true) && e._ground.hitTestPoint(HIT_BOTTOM_1X, HIT_BOTTOM_1Y, true))
{
e._vy += 20;
}
if(e._ground.hitTestPoint(e._player.x,e._player.y, true))
{
e._vy = -(e._vy);
e._vx = -(e._vx);
}
else
{
if(!(e._ground.hitTestPoint(HIT_BOTTOM_1X,HIT_BOTTOM_1Y,true) || e._ground.hitTestPoint(HIT_BOTTOM_2X,HIT_BOTTOM_2Y,true)
|| e._ground.hitTestPoint(HIT_BOTTOM_3X,HIT_BOTTOM_3Y,true)))
{
e._vy -= 1;
e._touchGround = false;
}
}
}
public function hurtCollision(hurtObject:*)
{
if(hurtObject.hitTestPoint(HIT_BOTTOM_1X,HIT_BOTTOM_1Y,true) || hurtObject.hitTestPoint(HIT_BOTTOM_2X,HIT_BOTTOM_2Y,true)
|| hurtObject.hitTestPoint(HIT_BOTTOM_3X,HIT_BOTTOM_3Y,true))
{
e.hurtPlayer();
}
if(hurtObject.hitTestPoint(HIT_TOP_1X,HIT_TOP_1Y,true) || hurtObject.hitTestPoint(HIT_TOP_2X,HIT_TOP_2Y,true)
|| hurtObject.hitTestPoint(HIT_TOP_3X,HIT_TOP_3Y,true))
{
e.hurtPlayer();
}
if(hurtObject.hitTestPoint(HIT_R_1X,HIT_R_1Y,true) || hurtObject.hitTestPoint(HIT_R_2X,HIT_R_2Y,true)
|| hurtObject.hitTestPoint(HIT_R_3X,HIT_R_3Y,true))
{
e.hurtPlayer();
}
if(hurtObject.hitTestPoint(HIT_L_1X,HIT_L_1Y,true) || hurtObject.hitTestPoint(HIT_L_2X,HIT_L_2Y,true)
|| hurtObject.hitTestPoint(HIT_L_3X,HIT_L_3Y,true))
{
e.hurtPlayer();
}
}
}
}
傷ついたクラス:
package
{ import flash.display.MovieClip; インポート flash.events.Event; 衝突をインポートします。
public class Hurt extends MovieClip
{
public function Hurt()
{
addEventListener(Event.ENTER_FRAME, enterFrame);
}
private function enterFrame(e:Event)
{
Collision.hurtCollision(this);
}
}
}
編集: 皆さんにお知らせしておくと、e.hurtPlayer は、プレーヤーの健康状態を制御する単なるドキュメント クラス メソッドです。