2010-05-26 2 views
-1

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

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

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

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

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

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

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

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

Может кто-нибудь предположить, почему это может произойти?

EDIT: В соответствии с просьбой, полный код:

Bullet.as

пакет {

импорт flash.display.MovieClip; импорт flash.events.Event;

общественного класса Пули расширяет 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:

пакет {

импорт flash.display.MovieClip; импорт flash.events.KeyboardEvent; импорт flash.events.Event; импорт flash.ui.Keyboard;

общественного класса Tank расширяет 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

+0

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

+0

Да, введите исходный код. – Oliver

+0

Ссылка выводит вас на страницу со следующим сообщением: «Ссылка на файл, которую вы запросили, недействительна. Пожалуйста, свяжитесь со ссылкой издателя или попробуйте выполнить поиск». – Taurayi

ответ

0

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

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 

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

+0

Я так считаю. enterFrameHandler не нуждается в фактическом событии для работы, а принуждение типов к переменным при хорошей практике не требуется. Кто-нибудь еще может подтвердить меня по этому поводу? – Ben

+0

Хорошо, я сохранил его нетронутым. Дал ему пробег и смог получить создание и уничтожение Пули с помощью таймера. Пробовал несколько снимков (которые ограничены таймером), и это сработало. Единственное место, где я мог видеть, что оно исчезает, - это границы. Извините, я не смог воссоздать вашу проблему :( – phwd

+0

ОК спасибо за попытку :) возможно, это просто моя машина. Загрузил полный источник, если кто-то хочет его запустить. – Ben

0

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

0

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