Flash AS3 Таинственный мигающий ролик - PullRequest
0 голосов
/ 26 мая 2010

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

Я создаю пули для танкового объекта, чтобы стрелять. Танк является потомком класса документов. Я создаю пулю следующим образом:

var bullet:Bullet = new Bullet();<br> (parent as MovieClip).addChild(bullet);

Сама пуля просто движется в направлении, используя код типа this.x += 5;

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

Таймер реализован так:

if(shot_timer == 0) {<br> shoot(); // This contains the aforementioned bullet creation method<br> shot_timer = 10;

Мой обработчик ввода кадра для объекта резервуара управляет таймером и уменьшает его каждый кадр, если он больше нуля.

Кто-нибудь может подсказать, почему это может происходить?

РЕДАКТИРОВАТЬ: По запросу, полный код:

Bullet.as

package {

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

public class Bullet extends MovieClip {

    public var facing:int;
    private var speed:int;

    public function Bullet():void {
        trace("created");
        speed = 10;
        addEventListener(Event.ADDED_TO_STAGE,addedHandler);
    }

    private function addedHandler(e:Event):void {
        addEventListener(Event.ENTER_FRAME,enterFrameHandler);
        removeEventListener(Event.ADDED_TO_STAGE,addedHandler);
    }

    private function enterFrameHandler(e:Event):void {
        //0 - up, 1 - left, 2 - down, 3 - right
        if(this.x > 720 || this.x < 0 || this.y < 0 || this.y > 480) {
            removeEventListener(Event.ENTER_FRAME,enterFrameHandler);
            trace("destroyed");
            (parent as MovieClip).removeChild(this);
            return;
        }

        switch(facing) {
            case 0: this.y -= speed; break;
            case 1: this.x -= speed; break;
            case 2: this.y += speed; break;
            case 3: this.x += speed; break;
        }
    }
}

}

Tank.as:

package {

import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.ui.Keyboard;

public class Tank extends MovieClip {

    private var right:Boolean = false;
    private var left:Boolean = false;
    private var up:Boolean = false;
    private var down:Boolean = false;
    private var facing:int = 0; //0 - up, 1 - left, 2 - down, 3 - right
    private var horAllowed:Boolean = true;
    private var vertAllowed:Boolean = true;
    private const GRID_SIZE:int = 100;
    private var shooting:Boolean = false;
    private var shot_timer:int = 0;

    private var speed:int = 2;

    public function Tank():void {
        addEventListener(Event.ADDED_TO_STAGE,stageAddHandler);
        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    }

    private function stageAddHandler(e:Event):void {
        stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeys);
        stage.addEventListener(KeyboardEvent.KEY_UP,keyUps);
        removeEventListener(Event.ADDED_TO_STAGE,stageAddHandler);
    }

    public function checkKeys(event:KeyboardEvent):void {
        if(event.keyCode == 32) {
            //trace("Spacebar is down");
            shooting = true;
        }
        if(event.keyCode == 39) {
            //trace("Right key is down");
            right = true;
        }
        if(event.keyCode == 38) {
            //trace("Up key is down");  // lol
            up = true;
        }
        if(event.keyCode == 37) {
            //trace("Left key is down");
            left = true;
        }
        if(event.keyCode == 40) {
            //trace("Down key is down");
            down = true;
        }
    }

    public function keyUps(event:KeyboardEvent):void {
        if(event.keyCode == 32) {
            event.keyCode = 0;
            shooting = false;
            //trace("Spacebar is not down");
        }
        if(event.keyCode == 39) {
            event.keyCode = 0;
            right = false;
            //trace("Right key is not down");
        }
        if(event.keyCode == 38) {
            event.keyCode = 0;
            up = false;
            //trace("Up key is not down");
        }
        if(event.keyCode == 37) {
            event.keyCode = 0;
            left = false;
            //trace("Left key is not down");
        }
        if(event.keyCode == 40) {
            event.keyCode = 0;
            down = false;
            //trace("Down key is not down") // O.o
        }
    }

    public function checkDirectionPermissions(): void {
        if(this.y % GRID_SIZE < 5 || GRID_SIZE - this.y % GRID_SIZE < 5) {
            horAllowed = true;
        } else {
            horAllowed = false;
        }
        if(this.x % GRID_SIZE < 5 || GRID_SIZE - this.x % GRID_SIZE < 5) {
            vertAllowed = true;
        } else {
            vertAllowed = false;
        }

        if(!horAllowed && !vertAllowed) {
            realign();
        }
    }

    public function realign():void {
        if(!horAllowed) {
            if(this.x % GRID_SIZE < GRID_SIZE / 2) {
                this.x -= this.x % GRID_SIZE;
            } else {
                this.x += (GRID_SIZE - this.x % GRID_SIZE);
            }   
        }
        if(!vertAllowed) {
            if(this.y % GRID_SIZE < GRID_SIZE / 2) {
                this.y -= this.y % GRID_SIZE;
            } else {
                this.y += (GRID_SIZE - this.y % GRID_SIZE);
            }
        }
    }

    public function enterFrameHandler(Event):void {
        //trace(shot_timer);
        if(shot_timer > 0) {
            shot_timer--;
        }
        movement();
        firing();
    }

    public function firing():void {
        if(shooting) {
            if(shot_timer == 0) {
                shoot();
                shot_timer = 10;
            }
        }
    }

    public function shoot():void {
        var bullet = new Bullet();
        bullet.facing = facing;
        //0 - up, 1 - left, 2 - down, 3 - right
        switch(facing) {
            case 0: bullet.x = this.x; bullet.y = this.y - this.height / 2; break;
            case 1: bullet.x = this.x - this.width / 2; bullet.y = this.y; break;
            case 2: bullet.x = this.x; bullet.y = this.y + this.height / 2; break;
            case 3: bullet.x = this.x + this.width / 2; bullet.y = this.y; break;
        }
        (parent as MovieClip).addChild(bullet);
    }

    public function movement():void {
        //0 - up, 1 - left, 2 - down, 3 - right

        checkDirectionPermissions();

        if(horAllowed) {
            if(right) {
                orient(3);
                realign();
                this.x += speed;
            }
            if(left) {
                orient(1);
                realign();
                this.x -= speed;
            }
        }
        if(vertAllowed) {
            if(up) {
                orient(0);
                realign();
                this.y -= speed;
            }
            if(down) {
                orient(2);
                realign();
                this.y += speed;
            }
        }
    }

    public function orient(dest:int):void {
        //trace("facing: " + facing);
        //trace("dest: " + dest);
        var angle = facing - dest;
        this.rotation += (90 * angle);
        facing = dest;
    }

}

}

Полная заявка здесь, если кто-то хочет попытаться повторить ошибку. Он использует электросервер для некоторых его частей, поэтому их, возможно, придется закомментировать.

TankAttack.rar

Ответы [ 3 ]

0 голосов
/ 19 января 2014

Я думаю, что ответ на этот вопрос очень прост, у меня такое случалось со мной несколько раз (CS4). Проверьте ваш таймлайм ... обычно там есть лишние ненужные пустые рамки. То, как это происходит, до сих пор остается для меня загадкой, но обычно виновником является ... непреднамеренное нажатие какой-либо клавиши.

0 голосов
/ 03 марта 2014

Добавьте метод stop(); к пуле. Иногда он мигает, когда видеоклип повторяется.

0 голосов
/ 26 мая 2010

Правильны ли эти строки?

public function enterFrameHandler(Event):void { //Instead of e:Event

,

var bullet = new Bullet(); // Instead of var bullet:Bullet

И

var angle = facing - dest; // Instead of var angle:int

Я просто хочу убедиться, что я правильно читаю.

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