使用 ActionScript 3 在 Adobe Flash CS4 中创建 Top Down Shooter 但子弹表现异常
Creating Top Down Shooter in Adobe Flash CS4 using ActionScript 3 but bullets behaving weirdly
我正在使用 AS3 在 Flash CS4 中制作 TDS,但似乎有问题。很难解释,所以我要 link Flash 文件。单击 this。
这是第一次上传文件进行共享,对于那些不能或无法下载文件的人,情况是这样的:
Player有鼠标旋转功能,即Player看鼠标所在的位置。在鼠标按下时,我已经放置了用于创建项目符号的脚本。项目符号正在创建好。但是,当子弹移动时,问题就出现了。假设在位置和旋转 X,我射了 5 发子弹,它们在 X 方向移动。现在,如果我在 Y 位置和旋转方向发射一颗子弹,则在那里创建的子弹会沿 Y 方向移动 ,但在 X 位置和方向上创建的所有其他子弹也是如此。 他们改变他们的路线。
这是游戏的代码。
package {
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Mouse;
import flash.events.TimerEvent;
public class Main extends MovieClip {
var player : Player = new Player();
//Customizable Weapon Settings
var bulletNumber:Number;//number of bullets per shot
var bulletOffset:Number;//bigger number = less acurate
var bulletSpeed:Number;//pixels per frame
var bulletMaxAge:Number;//1000 = 1 second
var reloadSpeed:Number;//1000 = 1 second
var randomNum:Number;
public static var xSpeed:Number;
public static var ySpeed:Number;
var bulletAngle:Number;
var timer:Number=0;
var flag:Boolean;
//other variables (do not edit)
var mouseClicked:Boolean=false;
var radians:Number=Math.PI/180;
public function Main() {
player.x=stage.stageWidth/2;
player.y=stage.stageHeight/2;
stage.addChild(player);
player.gotoAndStop(5);
loadWeapon("Machine Gun");
addEventListener(Event.ENTER_FRAME,on_enter_frame);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
}
public function onMouseDownHandler(event:MouseEvent) {
//trace("Mouse Down");
mouseClicked=true;
flag=true;
}
public function onMouseUpHandler(event:MouseEvent) {
//trace("Mouse Up");
mouseClicked=false;
flag=false;
timer=0;
}
public function loadWeapon(weaponType:String) {
switch (weaponType) {
case "Machine Gun" :
//bulletNumber = 100;
bulletOffset=10;
bulletSpeed=10;
bulletMaxAge=1000;
break;
}
}
function on_enter_frame(e:Event) {
trace("Click: "+ mouseClicked);
fireWeapon();
}
function fireWeapon() {
//check if mouse is clicked
//if true, create bullet
if (mouseClicked) {
createBullet();
player.gotoAndStop(10);
} else {
player.gotoAndStop(1);
}
}
public function createBullet() {
var bullet : Bullet2= new Bullet2();
bullet.x=player.x;
bullet.y=player.y;
if (flag) {
timer++;
if (timer==10) {
trace("lol");
//calculate random bullet offset.
randomNum = Math.random() * (bulletOffset);
//set bullet firing angle
bulletAngle = (player.rotation + randomNum) * radians;
//set bullet speed based on angle
xSpeed=Math.cos(bulletAngle)*bulletSpeed;
ySpeed=Math.sin(bulletAngle)*bulletSpeed;
//trace (bulletAngle);
stage.addChild(bullet);
bullet.addEventListener(Event.ENTER_FRAME, runForest);
//mouseClicked = false;
timer=0;
}
}
function runForest(e:Event) {
bullet.x+=xSpeed;
bullet.y+=ySpeed;
}
}
}
}
我尝试过的事情:
1) 我将 "runForest()" 函数放在 "createbullet()" 函数之外,它给我一个“1120:访问未定义的 属性 项目符号。”错误。 (这没有意义,因为我给它一个进入框架事件监听器。)
2) 为了解决这个问题,我将 bullet 变量设置为全局变量并在 "createbullet()" 函数中声明它 - "var bullet : Bullet2;" 在 createbullet() 中 - "bullet = new Bullet2();" 这给了我完全不同的输出。
3) 我将 "runForest()" 函数放在它自己的 class 文件中。但同样的事情正在发生。
我指的是使用 AS2 的教程。 This 是 link.
请帮我解决这个问题。
谢谢!
查看此代码:
//set bullet speed based on angle
xSpeed=Math.cos(bulletAngle)*bulletSpeed;
ySpeed=Math.sin(bulletAngle)*bulletSpeed;
然后看看这些速度变量是如何创建的:
public static var xSpeed:Number;
public static var ySpeed:Number;
速度的 x 方向有 1 个变量。如果只有一个变量,则speed只能有1个值。
这就是为什么你所有的子弹都朝同一个方向移动,因为它们都共享一个单一的速度值,这导致它们朝同一个方向移动。
你的 Main
class 目前正在做所有事情,你真的应该将一些代码重构到其他几个 class 中。
连自己对自己写的代码的理解都没有在代码中体现出来,你的评论说:
//set bullet speed based on angle
现在为什么 子弹 速度是 Main
的变量?面向对象编程正是为此而生。您可以从字面上将您对所需行为的简单英语描述转化为代码。
当您说“想要 Bullets”时,请创建一个 Bullet
class。
当你说“每个Bullet
对象应该有自己的速度”时,然后在那个class上加上一个属性就是速度。
你的武器也会遇到同样的问题,同样的解决方法。
我正在使用 AS3 在 Flash CS4 中制作 TDS,但似乎有问题。很难解释,所以我要 link Flash 文件。单击 this。
这是第一次上传文件进行共享,对于那些不能或无法下载文件的人,情况是这样的:
Player有鼠标旋转功能,即Player看鼠标所在的位置。在鼠标按下时,我已经放置了用于创建项目符号的脚本。项目符号正在创建好。但是,当子弹移动时,问题就出现了。假设在位置和旋转 X,我射了 5 发子弹,它们在 X 方向移动。现在,如果我在 Y 位置和旋转方向发射一颗子弹,则在那里创建的子弹会沿 Y 方向移动 ,但在 X 位置和方向上创建的所有其他子弹也是如此。 他们改变他们的路线。
这是游戏的代码。
package {
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Mouse;
import flash.events.TimerEvent;
public class Main extends MovieClip {
var player : Player = new Player();
//Customizable Weapon Settings
var bulletNumber:Number;//number of bullets per shot
var bulletOffset:Number;//bigger number = less acurate
var bulletSpeed:Number;//pixels per frame
var bulletMaxAge:Number;//1000 = 1 second
var reloadSpeed:Number;//1000 = 1 second
var randomNum:Number;
public static var xSpeed:Number;
public static var ySpeed:Number;
var bulletAngle:Number;
var timer:Number=0;
var flag:Boolean;
//other variables (do not edit)
var mouseClicked:Boolean=false;
var radians:Number=Math.PI/180;
public function Main() {
player.x=stage.stageWidth/2;
player.y=stage.stageHeight/2;
stage.addChild(player);
player.gotoAndStop(5);
loadWeapon("Machine Gun");
addEventListener(Event.ENTER_FRAME,on_enter_frame);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
}
public function onMouseDownHandler(event:MouseEvent) {
//trace("Mouse Down");
mouseClicked=true;
flag=true;
}
public function onMouseUpHandler(event:MouseEvent) {
//trace("Mouse Up");
mouseClicked=false;
flag=false;
timer=0;
}
public function loadWeapon(weaponType:String) {
switch (weaponType) {
case "Machine Gun" :
//bulletNumber = 100;
bulletOffset=10;
bulletSpeed=10;
bulletMaxAge=1000;
break;
}
}
function on_enter_frame(e:Event) {
trace("Click: "+ mouseClicked);
fireWeapon();
}
function fireWeapon() {
//check if mouse is clicked
//if true, create bullet
if (mouseClicked) {
createBullet();
player.gotoAndStop(10);
} else {
player.gotoAndStop(1);
}
}
public function createBullet() {
var bullet : Bullet2= new Bullet2();
bullet.x=player.x;
bullet.y=player.y;
if (flag) {
timer++;
if (timer==10) {
trace("lol");
//calculate random bullet offset.
randomNum = Math.random() * (bulletOffset);
//set bullet firing angle
bulletAngle = (player.rotation + randomNum) * radians;
//set bullet speed based on angle
xSpeed=Math.cos(bulletAngle)*bulletSpeed;
ySpeed=Math.sin(bulletAngle)*bulletSpeed;
//trace (bulletAngle);
stage.addChild(bullet);
bullet.addEventListener(Event.ENTER_FRAME, runForest);
//mouseClicked = false;
timer=0;
}
}
function runForest(e:Event) {
bullet.x+=xSpeed;
bullet.y+=ySpeed;
}
}
}
}
我尝试过的事情:
1) 我将 "runForest()" 函数放在 "createbullet()" 函数之外,它给我一个“1120:访问未定义的 属性 项目符号。”错误。 (这没有意义,因为我给它一个进入框架事件监听器。)
2) 为了解决这个问题,我将 bullet 变量设置为全局变量并在 "createbullet()" 函数中声明它 - "var bullet : Bullet2;" 在 createbullet() 中 - "bullet = new Bullet2();" 这给了我完全不同的输出。
3) 我将 "runForest()" 函数放在它自己的 class 文件中。但同样的事情正在发生。
我指的是使用 AS2 的教程。 This 是 link.
请帮我解决这个问题。 谢谢!
查看此代码:
//set bullet speed based on angle
xSpeed=Math.cos(bulletAngle)*bulletSpeed;
ySpeed=Math.sin(bulletAngle)*bulletSpeed;
然后看看这些速度变量是如何创建的:
public static var xSpeed:Number;
public static var ySpeed:Number;
速度的 x 方向有 1 个变量。如果只有一个变量,则speed只能有1个值。
这就是为什么你所有的子弹都朝同一个方向移动,因为它们都共享一个单一的速度值,这导致它们朝同一个方向移动。
你的 Main
class 目前正在做所有事情,你真的应该将一些代码重构到其他几个 class 中。
连自己对自己写的代码的理解都没有在代码中体现出来,你的评论说:
//set bullet speed based on angle
现在为什么 子弹 速度是 Main
的变量?面向对象编程正是为此而生。您可以从字面上将您对所需行为的简单英语描述转化为代码。
当您说“想要 Bullets”时,请创建一个 Bullet
class。
当你说“每个Bullet
对象应该有自己的速度”时,然后在那个class上加上一个属性就是速度。
你的武器也会遇到同样的问题,同样的解决方法。