私と私の友人は、キャラクターを上から見る 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;
}
}
}