AS3游戏代码自动重启

时间:2013-12-09 22:56:06

标签: actionscript-3 flash actionscript restart

嗨,我正在测试这个游戏,它自动重启,我甚至没有完成游戏......任何帮助都会很棒!我真的不知道闪存那么好,所以我不能自己调试这个。

package{
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event; //used for ENTER_FRAME event

public class Main extends MovieClip{
    const speed:int = 5;//speed of the snake
    var score:int;
    var vx:int;
    var vy:int;
    var gFood:Food;
    var head:SnakePart;
    var SnakeDirection:String;
    var snake:Array;

    public function Main(){
        init();
    }
    function init():void {
        //Initialize everything!
        vx = 1; vy = 0;
        score = 0;
        snake = new Array();
        SnakeDirection = "";
        //add food to the stage
        addFood();
        //add snakes head to the stage
        head = new SnakePart();
        head.x = stage.stageWidth/2;
        head.y = stage.stageHeight/2;
        snake.push(head);
        addChild(head);

        stage.addEventListener(KeyboardEvent.KEY_UP , keyUp);
        stage.addEventListener(KeyboardEvent.KEY_DOWN , keyDown);
        addEventListener(Event.ENTER_FRAME , onEnterFrame);
        //ENTER_FRAME listener is attached to main class and not to the stage directly
    }
    //This function will add food to the stage
    function addFood():void {
        gFood = new Food();
        gFood.x = 50 + Math.random()*(stage.stageWidth-100);
        gFood.y = 50 + Math.random()*(stage.stageHeight-100);
        addChild(gFood);
    }
    //this function will reset the game
    function reset():void {
        removeChild(gFood);
        addFood();
        head.x = stage.stageWidth/2;
        head.y = stage.stageHeight/2;
        vx = 1;vy = 0;

        for(var i = snake.length-1;i>0;--i){
            removeChild(snake[i]);
            snake.splice(i,1);
        }
    }
    function keyDown(event:KeyboardEvent):void{
        if(event.keyCode == Keyboard.LEFT){
           SnakeDirection = "left";
        }else if (event.keyCode == Keyboard.RIGHT) {
           SnakeDirection = "right";
        }else if (event.keyCode == Keyboard.UP) {
            SnakeDirection = "up";
        }else if (event.keyCode == Keyboard.DOWN) {
            SnakeDirection = "down";
        }
    }
    function keyUp(event:KeyboardEvent):void {
        if(event.keyCode == Keyboard.LEFT) {
            SnakeDirection = "";
        }else if(event.keyCode == Keyboard.RIGHT) {
            SnakeDirection = "";
        }else if(event.keyCode == Keyboard.UP ) {
            SnakeDirection = "";
        }else if(event.keyCode == Keyboard.DOWN){
            SnakeDirection = "";
        }
    }
    function onEnterFrame(event:Event):void {
        //setting direction of velocity
        if(SnakeDirection == "left" && vx != 1) {
            vx = -1;
            vy = 0;
        }else if(SnakeDirection == "right" && vx != -1) {
            vx = 1;
            vy = 0;
        }else if(SnakeDirection == "up" && vy != 1) {
            vx = 0;
            vy = -1;
        }else if(SnakeDirection == "down" && vy != -1) {
            vx = 0;
            vy = 1;
        }

        //collison with stage
        if(head.x - head.width/2 <= 0){
            score = 0;
            reset();
        }
        if(head.x + head.width/2 >= stage.stageWidth){
            score = 0;
            reset();
        }
        if(head.y - head.height/2 <= 0){
            score = 0;
            reset();
        }
        if(head.y + head.height/2 >= stage.stageHeight){
            score = 0;
            reset();
        }

        //move body of the snake
        for(var i = snake.length-1;i>0;--i){
            snake[i].x = snake[i-1].x;
            snake[i].y = snake[i-1].y;
        }
        //changing the position of snake's head
        head.x += vx*speed;
        head.y += vy*speed;
        //collision with tail
        for(var w = snake.length-1;i>=1;--i){
            if(snake[0].x == snake[i].x && snake[0].y == snake[i].y){
                reset();
                break;
            }
        }
        //collision with food
        if(head.hitTestObject(gFood)){
            score += 1;
            removeChild(gFood);
            addFood();
            var bodyPart = new SnakePart();
            bodyPart.x = snake[snake.length - 1].x;
            bodyPart.y = snake[snake.length - 1].y;
            snake.push(bodyPart);
            addChild(bodyPart);
        }
        //display scores
        txtScore.text = String(score);
    }
}

}

2 个答案:

答案 0 :(得分:0)

这主要是“如何修复此代码?”的问题。您应该尝试分析问题发生的时间。 (即每当你右转时)

针对您的具体问题,请尝试在您致电reset的不同位置插入trace语句,以便确定问题的根源。

例如

    if(head.y + head.height/2 >= stage.stageHeight){
        score = 0;
        trace(">= stage.stageHeight");
        reset();
    }

如果您在Action Script中开始游戏编程,我会深深推荐http://gamedev.michaeljameswilliams.com/as3-avoider-game-tutorial-base/。这是一个实际学习如何制作游戏的好教程,因为每一步都经过仔细解释。你最终得到了一个漂亮的小游戏,但更重要的是了解一切如何运作。

答案 1 :(得分:0)

我认为您应该在代码末尾或最后一帧添加stop(),以便循环在完成代码执行时停止。不太确定把它放在哪里。