0

私は自分の Flash ゲームを作成していますが... 衝突は私の非常に大きな問題です。すべてのウェブサイトを試しましたが、何も機能しません。

プレーヤーのコードは次のとおりです。

    onClipEvent(enterFrame){
        if(Key.isDown(Key.RIGHT)) {
            this._x+=3
        }
            if(Key.isDown(Key.LEFT)) {
            this._x-=3
        }
            if(Key.isDown(Key.UP)) {
            this._y-=3
        }
            if(Key.isDown(Key.DOWN)) {
            this._y+=3
        }

    }

Collision:

    if(cityhallLeftWall.hitTest(Player._x+Player._width/2, Player._y, true)){
    Player._x -=0
    }
    if(cityhallRightWall.hitTest(Player._x-Player._width/2, Player._y, true)){
    Player._x +=0
    }
    if(cityhallTopWall.hitTest(Player._x, Player._y+Player._height/2, true)){
    Player._y +=0
    }
    if(cityhallBottomWall.hitTest(Player._x, Player._y-Player._height/2, true)){
    Player._y -=0
    }

プレーヤーのムービークリップには「Player」という名前が付けられます。建物のムービー クリップは「cityhall」と名付けられています。たとえば、ムービークリップ プレーヤーがムービークリップの市庁舎に触れたときに、y と x の速度が 0 になるようにしたいと考えています。解決策を見つけることは不可能なので、ここで助けを求めることにしました。

ありがとう :)

4

4 に答える 4

0

+= はプレーヤーの速度と等しい反発力にする必要があります。つまり、プレーヤーがフレームあたり 5 ピクセルの x 速度で壁にぶつかった場合、壁は反対方向にプレーヤーに 5 ピクセルの速度を追加する必要があります。ゼロの純移動。

于 2016-06-23T22:32:21.653 に答える
0

AS2 で何かをしたのは久しぶりですが、これをやってみます。

まず、プレーヤーの速度の変数を設定します。次のようになります。

var speedX:Number = 0;

次に、enterFrame 関数で、これを追加します。

Player._x += speedX; //

次に、各 hitTest メソッドで、次のようにします。

if(cityhallLeftWall.hitTest(Player._x+Player._width/2, Player._y, true)){
    speedX = 0;
}

y 方向についても同様に行う必要があります。きっとここからわかると思います。乾杯!

于 2016-07-11T01:53:28.520 に答える
0

最初にコード。ほとんどの人はそれなしでは読む気になりません (私のテストでは、これはムービークリップ プレーヤーに配置されました。または、私にとってはムービークリップ P のみに配置されました)。

    onClipEvent(enterFrame){
    if(Key.isDown(Key.RIGHT)) {
        this._x+=3
    }
        if(Key.isDown(Key.LEFT)) {
        this._x-=3
    }
        if(Key.isDown(Key.UP)) {
        this._y-=3
    }
        if(Key.isDown(Key.DOWN)) {
        this._y+=3
    }
if(_root.cityhallLeftWall.hitTest(this._x-this._width/2, this._y, true)){
this._x +=3;
}
if(_root.cityhallRightWall.hitTest(this._x+this._width/2, this._y, true)){
this._x -=3;
}
if(_root.cityhallTopWall.hitTest(this._x, this._y-this._height/2, true)){
this._y +=3;
}
if(_root.cityhallBottomWall.hitTest(this._x, this._y+this._height/2, true)){
this._y -=3;
}
}

このコードをテストして、問題を解決しました。これは言葉では理解しにくいので、ご容赦ください (画像を投稿するための評判ポイントがありません)。

1.右の壁ヒット テストのテストでは、Player._x+Player._width/2 を使用しませんでしたが、Player._x-Player._width/2 を使用しませんでした。文字の左端と右端をテストしたためです。プレイヤーが押し出されるまでに壁の「内側」にいるようにします。

2.左の壁に同じ間違いをして、右の端を壁に当ててテストしました。

3.他の回答で言及されているように、プレーヤーから速度を差し引くことはありませんが、プレーヤーの現在の位置から0を差し引いても、これは何もしません。この場合、プレーヤーが移動している量を差し引く必要があります。この場合、すべての方向に3 (上下左右)。

4.あなたの衝突チェック行はフレーム開始ブラケット内にないため、すべてのフレームではなく、swf 起動時に一度だけチェックされます。

5.これは間違いではありませんが、現在の「if」のように while ループを使用するヒントです。プレイヤーが壁の端に行き、何とか中に入ることができ、方向キーを押すまでは中にいることができます。壁ですが、これは起こり得ません。

while ループのコード:

     onClipEvent(enterFrame){
     if(Key.isDown(Key.RIGHT)) {
        this._x+=3
     }
        if(Key.isDown(Key.LEFT)) {
        this._x-=3
    }
        if(Key.isDown(Key.UP)) {
        this._y-=3
    }
        if(Key.isDown(Key.DOWN)) {
        this._y+=3
    }

while(_root.cityhallLeftWall.hitTest(this._x-this._width/2, this._y, true)){
this._x +=3;
}
while(_root.cityhallRightWall.hitTest(this._x+this._width/2, this._y, true)){
this._x -=3;
}
while(_root.cityhallTopWall.hitTest(this._x, this._y-this._height/2, true)){
this._y +=3;
}
while(_root.cityhallBottomWall.hitTest(this._x, this._y+this._height/2, true)){
this._y -=3;
}
}

これがうまくいくことを願っています。

于 2016-08-01T18:30:54.523 に答える