0

私と私の友人は、キャラクターを上から見る RPG スタイルのゲームを作ろうとしていますが、オブジェクトの衝突で問題が発生しました。これは、Flash CS6 のオブジェクト指向 AS3 プロジェクトで行っていることに言及する価値があるかもしれません。

これが何百万回も聞かれて申し訳ありませんが、私たちは一日中解決策を探していましたが、これまでに見つかったのは、box2d/nape のような少し高度すぎるものか、単純な衝突検出でした。私たちはすでに知っています。

私たちが抱えている問題は、衝突を検出し、メイン キャラクターがフリーズしたり動かなくなったりすることなく、シーン内のオブジェクトと重ならないようにする便利な方法が必要だということです。これまでのところ、問題を解決するためのすべての試みを破棄しましたが、現在の状況を理解するのに役立つ場合に備えて、残りのコードを次に示します (読みにくい場合は申し訳ありません)。関連するチュートリアルへのあらゆる種類の提案や紹介を歓迎します。

メインクラス

package {

import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.Event;

public class Engine extends MovieClip
{
    private var hero:Hero;
    private var box1:Box1;

    public function Engine()
    {
        box1 = new Box1();
        stage.addChild(box1);
        box1.x = stage.stageWidth / 4;
        box1.y = stage.stageHeight / 2;

        hero = new Hero(stage, box1);
        stage.addChild(hero);
        hero.x = stage.stageWidth / 2;
        hero.y = stage.stageHeight / 2;
    }

}
}

文字クラス

package 
{

import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Stage;

public class Hero extends MovieClip
{
    private var box1:Box1;
    private var stageRef:Stage;
    private var vy:Number = 0;
    private var vx:Number = 0;
    private var limit:Number = 30;
    private var rad:Number;
    private var bounce:Number = 0.125;
    private var _max:Number = 8;

    public function Hero(stageRef:Stage, box1:Box1)
    {
        //box variable was used in previous experiments with hit tests
        this.box1 = box1;
        this.stageRef = stageRef;
        Input.initialize(stageRef);
        stageRef.addEventListener(Event.ENTER_FRAME, moveHero);
    }
    private function moveHero(e:Event):void
    {
        if (Input.kd("W","UP"))
        {
            vy = vy < 1 - _max ? _max * -1:vy - 1;
        }
        if (Input.kd("S","DOWN"))
        {
            vy = vy > _max - 1 ? _max:vy + 1;
        }
        else if (!Input.kd("W", "UP", "S", "DOWN"))
        {
            if (vy > 1)
            {
                vy = vy < 1 ? 0:vy - 1;
            }
            else
            {
                vy = vy > -1 ? 0:vy + 1;
            }

        }
        if (Input.kd("A","LEFT"))
        {
            vx = vx < 1 - _max ? _max * -1:vx - 1;
        }
        if (Input.kd("D","RIGHT"))
        {
            vx = vx > _max - 1 ? _max:vx + 1;
        }
        else if (!Input.kd("A", "LEFT", "D", "RIGHT"))
        {
            if (vx > 1)
            {
                vx = vx < 1 ? 0:vx - 1;
            }
            else
            {
                vx = vx > -1 ? 0:vx + 1;
            }

        }
        if (x < limit)
        {
            x = limit;
            vx *=   -  bounce;
        }
        if (x > stage.stageWidth - limit)
        {
            x = stage.stageWidth - limit;
            vx *=   -  bounce;
        }
        if (y < limit)
        {
            y = limit;
            vy *=   -  bounce;
        }
        if (y > stage.stageHeight - limit)
        {
            y = stage.stageHeight - limit;
            vy *=   -  bounce;
        }

        x +=  vx;
        y +=  vy;
        rad = (Math.atan2(stage.mouseY - y,stage.mouseX - x)) * 180 / Math.PI;
        this.rotation = rad;


    }
}
}
4

1 に答える 1

0

衝突検出を行う簡単な方法は次のとおりです。

1)オブジェクトXを新しい位置に移動しようとします

2)ゲームY内の他のオブジェクトごとに、YとXが重なるかどうかを計算します(円の長方形、長方形の長方形、円の円などに異なるアルゴリズムを使用します)

3)重なっている場合は、手順1に戻りますが、半分まで動かしてみてください。別の方法:衝突したオブジェクトが丸い場合は、移動角度を変更して、オブジェクトを回転させた量に応じて小さくしながら、オブジェクトに接するようにします(角度の変化の正弦、つまり90度の変化の場合は0x、(sqrt2 / 2)45度の変化の場合はx、0度の変化の場合は1x、私の頭の中では理にかなっています。)

4)移動が成功した場合は、それを保持します。動きの長さが信じられないほど小さくなり、それでも拒否されている場合は、休息していると想定して諦めます。

より複雑なアルゴリズムでは、衝突したものの中心から離れるように排出されるため、湾曲したオブジェクトに足を踏み入れるなどしてカーブしますが、排出が3番目のオブジェクトと衝突しないように注意する必要があります。オブジェクトZ、そしてそれはトリッキーになる可能性があります。(物理ライブラリの使用を検討しましたか?それらは正当な理由でコーディングされています-物理を正しく理解するのは困難です。)

于 2013-01-22T03:20:11.537 に答える