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