2010-05-26 79 views
-1

这是迄今为止我在闪存中遇到的最奇怪的问题。我不知道是什么原因造成的。如果有人想真正看到它,我可以提供一个.swf,但我会尽我所能描述它。Flash AS3神秘闪烁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;

我的输入帧处理程序罐对象控制定时器和递减,如果每帧是大于零。

任何人都可以提出为什么会发生这种情况吗?

编辑:按照要求,全码:

Bullet.as

包{

进口的flash.display.MovieClip; import 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:

包{

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

公共类坦克扩展影片剪辑{

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; 
} 

}

}

完整的应用程序是在这里如果有人想尝试复制错误。它使用electroserver的一部分,所以他们可能不得不被注释掉。

TankAttack.rar

+0

我认为你需要发布完整的代码。这样的东西没有什么神秘之处,所以我认为这很可能是一个问题。 – fenomas 2010-05-26 15:36:55

+0

是的,把源代码。 – Oliver 2010-05-26 15:55:32

+0

链接将带您进入一个页面,并显示以下消息:“您请求的文件链接无效,请联系链接发布者或尝试进行搜索”。 – Taurayi 2011-01-31 03:13:13

回答

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 2010-05-26 17:26:03

+0

好吧,我保持不动。给它一个跑步,并能够用计时器来创建和销毁子弹。尝试多次拍摄(这是由计时器限制),并且它也工作。我能看到它消失的唯一地方就是界限。对不起,我无法重新创建你的问题:( – phwd 2010-05-26 18:08:40

+0

确定感谢尝试:)也许这只是我的机器。如果有人想要运行它,请上传完整源代码。 – Ben 2010-05-26 19:08:45

0

我认为这个答案很简单,我曾多次发生过这种情况(CS4)。检查你的时间石... ...通常有一个额外的不需要的空框架。发生这种情况对我来说仍然是一个谜,但它通常是不经意间击中某个关键的罪魁祸首。

0

添加方法stop();到子弹 有时它闪烁时,电影剪辑重复