Xeptic
%Europe/Berlin %493 %2008, 12:50
Ik heb een probleempje met een game die ik probeer te maken. Ik heb nog niet zo veel ervaring met Actionscript 3 (dit is het eerste substantiele stuk code dat ik ooit gemaakt hebt) dus ik hoop dat de pro's me wel kunnen helpen.
Het probleem is dat wanneer de w-toets ingedrukt wordt, het karakter maar 1 keer hoort te springen, momenteel krijg ik verschillende hoogtes. Ik ga ervan uit dat het ligt aan de manier waarop de characterMovement functie op elke frame wordt aangeroepen en wanneer de Keyboard events geregistreerd worden. Ik ben er een paar uur mee bezig geweest, maar ik ben er nog steeds niet uit.
Hier (http://spamtheweb.com/ul/upload/270708/46115_evasion2.php) is het .swf bestand.
var ground:Ground = new Ground();
var hero:Hero = new Hero();
var ax:Number = 0;
var ay:Number = 0;
var vx:Number = 0;
var vy:Number = 0;
var gravity:Number = 0.15;
var friction:Number = 0.9;
var jump:Boolean = false;
var inAir:Boolean = true;
stage.addEventListener(Event.ENTER_FRAME, gameLoop);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyIsDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyIsUp);
init();
function init():void {
ground.x = -200;
ground.y = 596;
addChild(ground);
hero.x = 200;
hero.y = 550;
addChild(hero);
}
function gameLoop(event:Event) {
characterMovement();
}
function onKeyIsDown(event:KeyboardEvent):void {
switch (event.keyCode) {
case 87 :
jump = true;
break;
case 65 :
ax = -1.5;
break;
case 68 :
ax = 1.5;
break;
case 83 :
break;
default :
break;
}
}
function onKeyIsUp(event:KeyboardEvent):void {
switch (event.keyCode) {
case 87 :
jump = false;
break;
case 65 :
ax = 0;
break;
case 68 :
ax = 0;
break;
case 83 :
break;
default :
break;
}
}
function characterMovement():void {
if (checkAir() == true) {
friction = 0.8;}
else {friction = 0.9;}
if (jump == true && checkAir() == false) {
ay = -10;
} else {
ay = 0;
}
vx += ax;
vy += ay;
vy += gravity;
vx *= friction;
hero.x += vx;
hero.y += vy;
checkGroundCollision();
checkWalls();
//ay = 0;
}
function checkAir ():Boolean {
if (!hero.hitTestObject(ground)) {
return true; }
else {return false;}
}
function checkGroundCollision():void {
if (hero.hitTestObject(ground)) {
hero.y = ground.y - ground.height / 2 - hero.height / 2;
}
}
function checkWalls():void {
if (hero. x + hero.width / 2 > stage.stageWidth) {
hero.x = stage.stageWidth - hero.width / 2;
} else if (hero.x - hero.width / 2 < 0) {
hero.x = 0 + hero.width / 2;
} else {
}
}
Het probleem is dat wanneer de w-toets ingedrukt wordt, het karakter maar 1 keer hoort te springen, momenteel krijg ik verschillende hoogtes. Ik ga ervan uit dat het ligt aan de manier waarop de characterMovement functie op elke frame wordt aangeroepen en wanneer de Keyboard events geregistreerd worden. Ik ben er een paar uur mee bezig geweest, maar ik ben er nog steeds niet uit.
Hier (http://spamtheweb.com/ul/upload/270708/46115_evasion2.php) is het .swf bestand.
var ground:Ground = new Ground();
var hero:Hero = new Hero();
var ax:Number = 0;
var ay:Number = 0;
var vx:Number = 0;
var vy:Number = 0;
var gravity:Number = 0.15;
var friction:Number = 0.9;
var jump:Boolean = false;
var inAir:Boolean = true;
stage.addEventListener(Event.ENTER_FRAME, gameLoop);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyIsDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyIsUp);
init();
function init():void {
ground.x = -200;
ground.y = 596;
addChild(ground);
hero.x = 200;
hero.y = 550;
addChild(hero);
}
function gameLoop(event:Event) {
characterMovement();
}
function onKeyIsDown(event:KeyboardEvent):void {
switch (event.keyCode) {
case 87 :
jump = true;
break;
case 65 :
ax = -1.5;
break;
case 68 :
ax = 1.5;
break;
case 83 :
break;
default :
break;
}
}
function onKeyIsUp(event:KeyboardEvent):void {
switch (event.keyCode) {
case 87 :
jump = false;
break;
case 65 :
ax = 0;
break;
case 68 :
ax = 0;
break;
case 83 :
break;
default :
break;
}
}
function characterMovement():void {
if (checkAir() == true) {
friction = 0.8;}
else {friction = 0.9;}
if (jump == true && checkAir() == false) {
ay = -10;
} else {
ay = 0;
}
vx += ax;
vy += ay;
vy += gravity;
vx *= friction;
hero.x += vx;
hero.y += vy;
checkGroundCollision();
checkWalls();
//ay = 0;
}
function checkAir ():Boolean {
if (!hero.hitTestObject(ground)) {
return true; }
else {return false;}
}
function checkGroundCollision():void {
if (hero.hitTestObject(ground)) {
hero.y = ground.y - ground.height / 2 - hero.height / 2;
}
}
function checkWalls():void {
if (hero. x + hero.width / 2 > stage.stageWidth) {
hero.x = stage.stageWidth - hero.width / 2;
} else if (hero.x - hero.width / 2 < 0) {
hero.x = 0 + hero.width / 2;
} else {
}
}