这是迄今为止我在闪存中遇到的最奇怪的问题。我不知道是什么原因造成的。如果有人想真正看到它,我可以提供一个.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的一部分,所以他们可能不得不被注释掉。
我认为你需要发布完整的代码。这样的东西没有什么神秘之处,所以我认为这很可能是一个问题。 – fenomas 2010-05-26 15:36:55
是的,把源代码。 – Oliver 2010-05-26 15:55:32
链接将带您进入一个页面,并显示以下消息:“您请求的文件链接无效,请联系链接发布者或尝试进行搜索”。 – Taurayi 2011-01-31 03:13:13