Установить переменные только один раз в ActionScript 3 игре? - PullRequest
0 голосов
/ 30 октября 2010

Я пытаюсь создать простую игру. Я установил слой «Actionscript», в который я поместил весь код. Затем у меня есть изображение, имя экземпляра «player». Вот мой код:

stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDown);

var power = 5;
var friction = 0.95;

var xspeed = 0;
var yspeed = 0;

function KeyDown(keyEvent:KeyboardEvent) {
if(keyEvent.keyCode==37) { //left
        xspeed -= power;
    }
    if(keyEvent.keyCode==39) { //right
        xspeed += power;
}

xspeed *= friction;

player.x += xspeed;

//trace(keyEvent.keyCode.toString());
}

Внезапно скрипт сбрасывает xspeedyspeed) каждый раз, поэтому скорость не может увеличиваться или уменьшаться. Как это предотвратить?

Я пробую свои силы в Actionscript, поэтому я хотел бы получить несколько советов и помощь:)

Марти Лайн

1 Ответ

1 голос
/ 31 октября 2010

Я думаю, что ваша проблема в том, что у вас есть более одного кадра на временной шкале, поэтому каждый раз, когда точка воспроизведения перемещается на другой кадр, сценарий запускается снова, и все в основном сбрасывается.

Вот как я бысделайте это (если вы хотите попробовать что-то более продвинутое):
Первым ходом убедитесь, что на сцене ничего не выбрано, и найдите поле, помеченное Class: под заголовком PUBLISH
Вставьте текст DocumentClass в него.
Теперь в том же каталоге, что и ваш FLA-файл, создайте имя файла DocumentClass.as
Затем вставьте в него следующее, сохраните его и запустите FLA-файл.

package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;

// Start class
// This class must extend MovieClip
public class DocumentClass extends MovieClip{
    private var acceleration:Number = 2;
    private var friction:Number = 0.95;
    // Limits the player's speed to prevent it from moving too fast
    private var maxSpeed:Number = 6;

    // The players velocity
    private var playerSpeedX:Number = 0;
    private var playerSpeedY:Number = 0;

    // Keeps track of what keys are pressed
    private var keyLeft:Boolean;
    private var keyRight:Boolean;

    // The contructor for DocumentClass - this is automatically called
    public function DocumentClass(){
        addEventListener(Event.ENTER_FRAME, eventEnterFrame, false, 0, true);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, eventKeyDown, false, 0, true);
        stage.addEventListener(KeyboardEvent.KEY_UP, eventKeyUp, false, 0, true);
    }

    // This function is called when a key is pressed
    private function eventKeyDown(keyEvent:KeyboardEvent):void{
        switch(keyEvent.keyCode){
            // Left
            case 37: keyLeft = true; break;
            // Right
            case 39: keyRight = true; break;
        }
    }
    // This function is called when a key is released
    private function eventKeyUp(keyEvent:KeyboardEvent):void{
        switch(keyEvent.keyCode){
            // Left
            case 37: keyLeft = false; break;
            // Right
            case 39: keyRight = false; break;
        }
    }

    // This function is called every frame.
    // Move the player every frame instead of in the keyboard events.
    private function eventEnterFrame(event:Event):void{
        // If the left key is pressed and the player's speed is under the limit.
        if(keyLeft && playerSpeedX > -maxSpeed)
            playerSpeedX -= acceleration;
        // Otherwise if the right key is pressed and the player's speed is under the limit.
        else if(keyRight && playerSpeedX < maxSpeed)
            playerSpeedX += acceleration;

        playerSpeedX *= friction;

        // I find that when the playerSpeedX values start to get really small the player
        // will seems to just slowly move for a long so I clip the speed when it becomes very small
        if(playerSpeedX < 0.1 && playerSpeedX > -0.1) playerSpeedX = 0;

        player.x += playerSpeedX;
    }


}// End class

}

Конечно, если в данный момент это немного за вами, я немного изменил ваш исходный код:

stage.addEventListener(KeyboardEvent.KEY_DOWN, eventKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, eventKeyUp);
addEventListener(Event.ENTER_FRAME, eventEnterFrame);

var power:Number = 5;
var friction:Number = 0.95;

var keyLeft:Boolean;
var keyRight:Boolean;

var xspeed:Number = 0;
var yspeed:Number = 0;

function eventKeyDown(keyEvent:KeyboardEvent):void{
    // Left
    if(keyEvent.keyCode==37){
        keyLeft = true;
    }
    // Right
    if(keyEvent.keyCode==39){
        keyRight = true;
    }
}

function eventKeyUp(keyEvent:KeyboardEvent):void{
    // Left
    if(keyEvent.keyCode==37){
        keyLeft = false;
    }
    // Right
    if(keyEvent.keyCode==39){
        keyRight = false;
    }
}

function eventEnterFrame(event:Event):void{
    if(keyLeft) xspeed -= power;
    if(keyRight) xspeed += power;

    xspeed *= friction;

    if(xspeed < 0.1 && xspeed > -0.1) xspeed = 0;

    player.x += xspeed;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...