Search code examples
actionscript-3flashflash-cs5

AS3 character movement - making the character jump


I'm making a (really) simple platform game for a school project with a little help from different online tuts.

For a couple of days I have been trying to make the character jump. I don't get any errors and if i test it with a trace statement the statement appears in the output. I tried several ways that I found in different tuts but couldn't make it work.

This is the code i've been using for my character:

 package  {

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


    public class ana extends MovieClip {

        private var _vx:Number;
        private var _halfWidth:Number;
        private var _previousKey:uint;
        public var speler:ana;

        // variabelen die bij de jump functie horen
        var upKeyDown:Boolean = false;
        var mainJumping:Boolean = false;
        var jumpSpeedLimit:int = 15;
        var jumpSpeed:Number = jumpSpeedLimit;

        public function ana() {
            this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

        }

        private function onAddedToStage(event:Event):void {

            this._vx = 0; 
            this._halfWidth = this.width / 2;
            this._previousKey = Keyboard.RIGHT;

            this.stop();// toegevoegd zodat de loop cycle van de speler stopt aan het begin van het spel

            /*EVENT LISTENERS*/
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, onKeyboardUp);

            this.addEventListener(Event.ENTER_FRAME, onEnter);
            this.addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
        }

        private function onRemovedFromStage(event:Event):void {
            this.removeEventListener(Event.ENTER_FRAME, onEnter);
            this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
            this.removeEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);

        }
        private function onKeyboardDown(event:KeyboardEvent):void {
            //zorgt ervoor dat het character de juiste richting op rent

            var currentKey:uint = event.keyCode;

                //Voor de linker toets
                if (event.keyCode == Keyboard.LEFT){
                    // Als de huidige toets niet gelijk is aan vorige, dan wordt het character gedraait
                    if (currentKey != _previousKey) {
                        _previousKey = currentKey;
                        this.scaleX *= -1;
                    }
                    // De run cycle wordt aangeroepen, de positie van het character verplaatst naar links met X frames per seconden
                    loopRun();
                    _vx = -8;
                }
                // voor de rechter toets
                if (event.keyCode == Keyboard.RIGHT){
                    if (currentKey != _previousKey) {
                        _previousKey = currentKey;
                        this.scaleX *= -1;
                    }
                    // zelfde als vorige if statement, alleen -X wordt X om de richting van links naar rechts te veranderen
                    loopRun();
                    _vx = 8;
                }
                /*Het is me niet gelukt om de speler te laten springen*/
                if (event.keyCode == Keyboard.SPACE) {
                    mainJump();
                    trace("spring");
                }

                        /*Functie om de speler te laten springen
                        werkt helaas niet... krijg ook geen error messages...
                        heb verschillende manieren en codes geprobeert...
                        Deze code komt uit de volgende tutorial: http://goo.gl/S5VRd0 */

                        function mainJump():void{

                            if(!mainJumping){

                                mainJumping = true;
                                jumpSpeed = jumpSpeedLimit*-1;
                                this.y += jumpSpeed;
                            } else {

                                if(jumpSpeed < 0){
                                    jumpSpeed *= 1 - jumpSpeedLimit/75;
                                    if(jumpSpeed > -jumpSpeedLimit/5){
                                        jumpSpeed *= -1;
                                    }
                                }
                                if(jumpSpeed > 0 && jumpSpeed <= jumpSpeedLimit){
                                    jumpSpeed *= 1 + jumpSpeedLimit/50;
                                }
                                this.y += jumpSpeed;

                                if(this.y >= stage.stageHeight - this.height){
                                    mainJumping = false;
                                    this.y = stage.stageHeight - this.height;
                                }
                            }
                        }
        }




        // bron: Flash AS3 Simple Game 04: player class http://www.youtube.com/watch?v=u4dwuAUYrkg
        private function onKeyboardUp(event:KeyboardEvent):void {
            if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT) {
                _vx = 0;
                gotoAndStop(1);

            }
        }
        private function onEnter(event:Event):void {
            this.x += _vx;
            checkStageBoundaries();

        }
        private function loopRun():void {
            //zorgt ervoor dat de run cycle van het character blijft 'loopen'
            if (currentFrame == 12) {
                gotoAndPlay(1);
            }
            else {
                play();
            }

        }
        private function checkStageBoundaries():void {
            //controleert of de speler zich buiten de grenzen van de stage begint en blokkeerd de speler als hij de stage wil verlaten
            //van volgende tutorial overgenomen: Flash as3 simple game 04: Player Class http://www.youtube.com/watch?v=u4dwuAUYrkg
            if (this.x - _halfWidth < 0) {
                this.x = 0 + _halfWidth;
            }
            else if (this.x + _halfWidth > stage.stageWidth) {
                this.x = stage.stageWidth - _halfWidth;
            }
        }


    }

}

The code is heavily commented in dutch due to the nature of the assignment.

Just in case here is my main class:

package  {

import flash.display.MovieClip;
import flash.events.*;
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.events.MouseEvent;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;
import flash.utils.*;
import flash.ui.*;




public class Main extends MovieClip {


    /*VARIABELEN*/
    public var startScreen:StartScreen; //beginscherm
    public var playScreen:PlayScreen; // speel scherm
    public var startBtn:StartBtn; // start knop die naar het speel scherm gaat
    public var speler:ana = new ana; // speler

    /*variabelen voor de diamantjes*/
    public var diamant:Diamond = new Diamond;
    public var diamant2:Diamond = new Diamond;
    public var diamant3:Diamond = new Diamond;
    public var diamant4:Diamond = new Diamond;

    public var info:infoTxt = new infoTxt;

    public function Main() {
    //Start scherm op stage & startknop
    show_startScreen(); // roept functie aan om het startscherm te laten zien
    startBtn.addEventListener(MouseEvent.CLICK, playGame); //voegt muisevent toe aan de startknop
    }

    // speel scherm
    public function show_startScreen() { // functie voor startscherm
        /*variabelen voor de mc's*/
        startScreen = new StartScreen(this);
        startBtn = new StartBtn;
        /*toevoegen startscherm en startknop*/
        addChild(startScreen); 
        addChild(startBtn);
        /*positionering startknop*/
        startBtn.y = 230;
        startBtn.x = 400;
    }



    public function playGame(event:MouseEvent) { //roept functie voor de startknop aan
        play_game();    
        }



    public function play_game() { //deze code wordt uitgevoerd nadat de playGame functie is aangeroepen
        playScreen = new PlayScreen(this); //variabel voor het speel scherm

        if (startScreen) { //deze code zorgt ervoor dat het beginscherm wordt verwijderd
            removeChild(startScreen);
            startScreen = null;
        }

        addChild(playScreen); //voegt speelscherm toe
        addChild(speler); //voegt speler toe
        addChild(info); // voegt de informatie text toe

        /* positionering info text*/
        info.x = 20;
        info.y = 20;

        /*positionering speler*/
        speler.y = 400;
        speler.x = 0;

        /*toevoegen en positioneren van diamantjes, de y as staat al gedefinieerd in de Diamanond class*/
        addChild(diamant);
        diamant.x = 450;

        addChild(diamant2);
        diamant2.x = 570;

        addChild(diamant3);
        diamant3.x = 690;

        addChild(diamant4);
        diamant4.x = 810;

        // event listener voor de speler, die wordt aangeroepen bij elk frame
        speler.addEventListener(Event.ENTER_FRAME, diamondCollision);

        // Collision functie, die ervoor zorgt dat de diamantjes verdwijnen als de speler ze aanraakt
        // over hitTestObject staat heel veel info op internet, hier heb ik geen speciefieke tutorial voor gebruikt
        // heb hitTestObject functie ook eerder gebruikt voor de groeps game

        function diamondCollision (event:Event):void {
            if (diamant != null) {// als diamant er nog is
                if (speler.hitTestObject(diamant)){// als de speler de diamant aanraakt
                removeChild(diamant);// verwijder de mc
                diamant = null; // zorgt ervoor dat het niet herhaald kan worden
            }
            }

            /*Hetzelfde voor de andere 3 diamantjes*/
            if (diamant2 != null) {
                if (speler.hitTestObject(diamant2)) {
                    removeChild(diamant2);
                    diamant2 = null;
                }
            }

            if (diamant3 != null) {
                if (speler.hitTestObject(diamant3)) {
                    removeChild(diamant3);
                    diamant3 = null;
                }
            }

            if (diamant4 != null) {
                if (speler.hitTestObject(diamant4)) {
                    removeChild(diamant4);
                    diamant4 = null;
                }
            }

        }

    }




    }






}

I uploaded the swf file to swfcabin, so you can see the rest works fine: http://www.swfcabin.com/open/1404819729.

Can anyone help me getting my character to jump?

Thank you!


Solution

  • Your jumpSpeed alteration should reside in an enterframe listener, onEnter, moreover, you should relocate the mainJump() code into there, as gravity should act once per frame. Only the jump initialization code should remain in the mainJump function, that is, check if jumping, if not make it jump, assign y-speed and leave the function.

     private function onEnter(event:Event):void {
            this.x += _vx;
            if (mainJumping) {
                if(jumpSpeed < 0){
                    jumpSpeed *= 1 - jumpSpeedLimit/75;
                    if(jumpSpeed > -jumpSpeedLimit/5){
                         jumpSpeed *= -1;
                    }
                }
                if(jumpSpeed > 0 && jumpSpeed <= jumpSpeedLimit){
                    jumpSpeed *= 1 + jumpSpeedLimit/50;
                }
                this.y+=jumpSpeed;
                if(this.y >= stage.stageHeight - this.height){
                    mainJumping = false;
                    this.y = stage.stageHeight - this.height;
                    jumpSpeed=0;
                }
          }
          checkStageBoundaries();
        }
    
        function mainJump():void{
    
                            if(!mainJumping){
    
                                mainJumping = true;
                                jumpSpeed = jumpSpeedLimit*-1;
                                this.y += jumpSpeed;
                            } // enough!
        }