0

ゾンビが画面の端からランダムにスポーンする単純なゲームを作成しようとしています。スポーンすると、プレイヤーの最後の位置を取得し、ステージに到達して削除されるまでその方向に向かって移動し続けます。ただし、追跡コードに問題があるようです。同じコードのチャンクを提供する大量の記事を読んだ後でも、まだ機能させることができません (IM DOING IT WRONG ARRGH)。

これがメインクラス

package 
{
import flash.display.*;
import flash.events.*;
import flash.utils.*;
import flash.ui.*;

public class main extends MovieClip
{
    private var left,right,up,down,fire,mouseRight,mouseLeft:Boolean;
    private var speedX,speedY,mobPosX,mobPosY:int;
    private var num:Number;
    private var wizard:Player;
    private var crosshair:Crosshair;
    private var mobArray,magicArray:Array;

    public function main()
    {
        //Hide mouse for crosshair
        Mouse.hide();
        crosshair = new Crosshair();
        addChild(crosshair);
        crosshair.x = stage.stageWidth;
        crosshair.y = stage.stageHeight;

        //Set initial speed
        speedX = 0;
        speedY = 0;

        //Wizard stuff
        fire = false;
        wizard = new Player();
        addChild(wizard);
        wizard.x = stage.stageWidth / 2;
        wizard.y = stage.stageHeight / 2;

        //Mob stuff
        mobArray = new Array();
        magicArray = new Array();


        //Initialize bool so movement doesn't get stuck on startup
        up = false;
        down = false;
        left = false;
        right = false;

    }

    public function startGame()
    {



        addEventListener(Event.ENTER_FRAME,update);
        stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
        stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler);
        stage.addEventListener(MouseEvent.CLICK, myClick);


    }

    private function keyDownHandler(evt:KeyboardEvent)
    {

        if (evt.keyCode == 37)
        {
            left = true;
        }

        if (evt.keyCode == 38)
        {
            up = true;

        }

        if (evt.keyCode == 39)
        {
            right = true;
        }

        if (evt.keyCode == 40)
        {
            down = true;
        }

        if (evt.keyCode == 67)
        {
            trace(mobArray.length);
        }

    }

    private function keyUpHandler(evt:KeyboardEvent)
    {
        if (evt.keyCode == 37)
        {
            left = false;
            speedX = 0;
        }

        if (evt.keyCode == 38)
        {
            up = false;
            speedY = 0;
        }

        if (evt.keyCode == 39)
        {
            right = false;
            speedX = 0;
        }

        if (evt.keyCode == 40)
        {
            down = false;
            speedY = 0;
        }

    }

    function myClick(eventObject:MouseEvent)
    {
        fire = true;
    }


    public function update(evt:Event)
    {
        //UI
        crosshair.x = mouseX;
        crosshair.y = mouseY;

        //Start player
        if (left && right == false)
        {
            speedX = -8;
        }

        if (up && down == false)
        {
            speedY = -8;
        }

        if (down && up == false)
        {
            speedY = 8;
        }

        if (right && left == false)
        {
            speedX = 8;
        }

        wizard.x +=  speedX;
        wizard.y +=  speedY;

        for (var i = mobArray.length - 1; i >= 0; i--)
        {
            //Start mob                                 //if X is zero and Y > 10, spawn.

            var m:Zombie = new Zombie();
            m.chase((Math.atan2(mobArray[i].y - wizard.y,mobArray[i].x - wizard.x)/Math.PI * 180)); //applies trigo
            num = Math.random();
            if (num < 0.1)
            {
                //when x = 0
                mobPosX = 10;
                mobPosY = Math.floor(Math.random() * 590) + 10;
            }
            else if (num < 0.3)
            {
                //when y = 0
                mobPosX = Math.floor(Math.random() * 790) + 10;
                mobPosY = 10;
            }
            else if (num < 0.6)
            {
                mobPosX = 800;
                mobPosY = Math.floor(Math.random() * 590) + 10;
                //when x width of screen
            }
            else if (num < 0.9)
            {
                //y is height of screen
                mobPosX = Math.floor(Math.random() * 790) + 10;
                mobPosY = 590;
            }
            m.x = mobPosX;
            m.y = mobPosY;
            mobArray.push(m);
            addChild(m);
        }




    }

    private function gameOver()
    {
        removeEventListener(Event.ENTER_FRAME,update);
        stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
        stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpHandler);
    }



}//end class
 }//end package

ゾンビクラスです

package 
  {
import flash.display.*;
import flash.events.*;

public class Zombie extends MovieClip
{
    private var zombSpd:Number;
    private var angle:Number;

    public function Zombie()
    {
        zombSpd = 10;
    }

    public function chase(chaseAngle:Number)
    {
        angle = chaseAngle;
    }


    public function update()
    {
        this.x+=Math.cos(angle*Math.PI/180)*zombSpd;
        this.y+=Math.sin(angle*Math.PI/180)*zombSpd;
    }


}//end class
   }//end package

ありがとうございました :)

4

2 に答える 2

1

あなたのコードを読み直したところ、このようなゲームを作成する前に、プログラミングについて読んで学ぶ必要があることがわかりました。

ゾンビがスポーンしない理由は、for ループに入らないためです。mob 配列の長さは最初はゼロになるため、for ループは発生しません。

それをループアウトして、メインクラスで敵をスポーンする関数を作成します。for ループで使用するコードを、この関数の例のコードとして使用できます。

function spawn():void{
    //code directly from your for loop, with a small change            
        num = Math.random();
        if (num < 0.1)
        {
            //when x = 0
            mobPosX = 10;
            mobPosY = Math.floor(Math.random() * 590) + 10;
        }
        else if (num < 0.3)
        {
            //when y = 0
            mobPosX = Math.floor(Math.random() * 790) + 10;
            mobPosY = 10;
        }
        else if (num < 0.6)
        {
            mobPosX = 800;
            mobPosY = Math.floor(Math.random() * 590) + 10;
            //when x width of screen
        }
        else if (num < 0.9)
        {
            //y is height of screen
            mobPosX = Math.floor(Math.random() * 790) + 10;
            mobPosY = 590;
        }
        var m:Zombie = new Zombie();
        m.x = mobPosX;
        m.y = mobPosY;
        m.chase((Math.atan2(m.y - wizard.y,m.x - wizard.x)/Math.PI * 180)); //applies trigo
        mobArray.push(m);
        addChild(m);
}

更新関数では、いつ敵をスポーンさせるかを決定する必要があります。これは、カウンターを使用して行うことができます。その部分を理解させますが、ゾンビを継続的にスポーンさせたい場合は (更新関数の forloop があった場所)、これを追加します。

//use a counter variable to determine when to execute spawn
spawn();
//loop through all zombies
for(var i:int = 0; i < mobArray.length; i++){
    mobArray[i].update();
}
于 2012-08-15T05:24:57.553 に答える
-1

抽象化されたインターフェイスとマーシャリングの実装を使用した AdvanceEDActionScriptAnimation でのステアリング動作の例。Github: https://github.com/yangboz/as3SteeringBehavior

于 2013-02-17T15:58:26.740 に答える