Actionscript 3 使用ActionScript3在AdobeFlashCS4中创建自上而下的Shooter,但子弹行为怪异

Actionscript 3 使用ActionScript3在AdobeFlashCS4中创建自上而下的Shooter,但子弹行为怪异,actionscript-3,flash,mouseevent,cs4,Actionscript 3,Flash,Mouseevent,Cs4,我正在使用AS3在Flash CS4中制作TDS,但似乎有问题。这很难解释,所以我要链接flash文件。点击 这是第一次上载文件以供共享,因此对于无法或无法下载文件的用户,将发生以下情况: 玩家有鼠标旋转,也就是说,玩家看鼠标在哪里。在鼠标按下时,我已将创建项目符号的脚本放入其中。子弹正在制造中。但当子弹移动时,问题就出现了。假设在位置和旋转X处,我发射了5颗子弹,它们朝X方向移动。现在,如果我在Y位置和旋转方向射击一颗子弹,在那里创建的子弹会朝Y方向移动,但在X位置和方向创建的所有其他子弹也会

我正在使用AS3在Flash CS4中制作TDS,但似乎有问题。这很难解释,所以我要链接flash文件。点击

这是第一次上载文件以供共享,因此对于无法或无法下载文件的用户,将发生以下情况:

玩家有鼠标旋转,也就是说,玩家看鼠标在哪里。在鼠标按下时,我已将创建项目符号的脚本放入其中。子弹正在制造中。但当子弹移动时,问题就出现了。假设在位置和旋转X处,我发射了5颗子弹,它们朝X方向移动。现在,如果我在Y位置和旋转方向射击一颗子弹,在那里创建的子弹会朝Y方向移动,但在X位置和方向创建的所有其他子弹也会朝Y方向移动。他们改变了路线

这是游戏的代码

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:Access of undefined property bullet.”错误。(这没有意义,因为我给它一个enter-frame事件监听器。)

2) 为了解决这个问题,我将bullet变量设置为全局变量,并在“createbullet()”函数中声明它,如下所示--“var bullet:Bullet2;”和createbullet()-“bullet=new Bullet2();”这给了我一个完全不同的输出

3) 我将“runForest()”函数放在它自己的类文件中。但同样的事情正在发生

我指的是一个使用AS2的教程。是链接

请帮我解决这个问题。 谢谢

查看此代码:

//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个变量。如果只有一个变量,则速度只能有一个值

这就是为什么所有子弹都朝着同一个方向移动,因为它们都有一个速度值,这使得它们朝着同一个方向移动

您的
Main
类目前正在做所有事情,您应该真正地将其中一些代码重构为其他几个类。 即使您自己对正在编写的代码的理解也没有反映在代码中,您的评论说:

//根据角度设置子弹速度

为什么子弹的速度是一个变量
Main
?面向对象编程正是为此而设计的。您可以将所需行为的简单英语描述转化为代码

当你说你“想要子弹”,然后创建一个
Bullet
类。 当您说“每个
Bullet
对象都应该有自己的速度”时,请向该类添加一个属性,即速度


你的武器会遇到同样的问题,同样的解决方法也适用。

我这样做是为了解决这个问题:bullet.bulletSpeedx=xSpeed;bullet.bullet速度=Y速度;在Bullet类中:函数runForest(e:Event){this.x+=bulletSpeedx;this.y+=bulletSpeedy;}Yes。我明白了。但我提到过,我引用的是AS2脚本。是的,我也会做进一步的优化。