actionscript-3flashmouseeventcs4

Creating Top Down Shooter in Adobe Flash CS4 using ActionScript 3 but bullets behaving weirdly


I am making a TDS in Flash CS4 using AS3 but there seems to be a problem. It's hard to explain so I'm gonna link the flash file. Click this.

This is the first time uploading a file for sharing so for those who can't or are unable to download the file, this is what happens:

Player has mouse rotation that is, Player looks at where the mouse is. On Mouse down I've put the script for creating bullets. The bullets are being created alright. But when the bullets move that's when the problem arises. Say that at position and rotation X, I shot 5 bullets and they are moving in X direction. Now if I shoot a bullet in Y position and rotation, the bullet that was created there goes in Y direction but so do all the other bullets that were created in the X position and direction. They change their course.

Here is the code for the game.

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


    }
}

Things that I've tried:

1) I put the "runForest()" funtion outside of "createbullet()" function which give me a "1120: Access of undefined property bullet." Error. (Which doesn't make sense since I am giving it a enter frame event listener.)

2) For solving this, I made the bullet variable global and declared it inside the "createbullet()" function like this- "var bullet : Bullet2;" And inside createbullet()- "bullet = new Bullet2();" That gives me a completely different output.

3) I put the "runForest()" function in its own class file. But the same thing is happening.

I was referring to a Tutorial that used AS2. This is the link.

Help me solve this please. Thanks!


Solution

  • Review this code:

    //set bullet speed based on angle
    xSpeed=Math.cos(bulletAngle)*bulletSpeed;
    ySpeed=Math.sin(bulletAngle)*bulletSpeed;
    

    then take a look at how these variables for speed are created:

    public static var xSpeed:Number;
    public static var ySpeed:Number;
    

    You have 1 variable for the x direction of the speed. If there is only one variable, there can only be 1 value for speed.

    that's why all your bullets are moving in the same direction, because they all share that one single value for speed, which causes them to go into the same direction.

    Your Main class is doing everything at the moment and you should really refactor some of that code into several other classes. Even your own understanding of the code you are writing is not reflected by the code, your comment says:

    //set bullet speed based on angle

    Now why is that bullet speed a variable of Main? Object oriented programming is made exactly for that. You can literally turn your plain English description of the desired behaviour into code.

    When you say that you "want to have Bullets", then create a Bullet class. When you say "each Bullet object should have its own speed", then add a property to that class that is the speed.

    You will encounter the same problem with your weapons and the same solution applies.