PDA

Volledige versie bekijken : Keyboard events


Tomsie
%Europe/Berlin %629 %2010, 15:05
Hoi iedereen!

Ik maak gebruik van de volgende code:

package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;


public class Player extends MovieClip
{

public function Player()
{
init();
}

private function init():void
{
addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown);
}

private function keyIsDown(event:KeyboardEvent):void
{
// trace("key is down");

switch (event.keyCode)
{
case Keyboard.UP :
this.y -= 5;
break;

case Keyboard.DOWN :
this.y += 5;
break;

case Keyboard.LEFT :
this.x -= 5;
break;

case Keyboard.RIGHT :
this.x += 5;
break;
}

}

}

}

Deze class laad ik in een andere class genaamd 'Game".
Hiermee wil ik een vierkantje, in Flash ge-exporteerd als "Player", laten bewegen. Alleen dit werkt niet!

Ik zelf dacht dat het zou komen door dat de "Player" class de stage niet kent waardoor de eventlisteners niet gezien worden? Maar ik heb geen idee hoe ik dit zou kunnen oplossen....

xxx

Aratramba
%Europe/Berlin %652 %2010, 15:40
Player is een MovieClip (DisplayObject) dus kent de stage klasse wel. Probleem is alleen denk ik dat je moet wachten tot ie daadwerkelijk op de stage staat:

public function Player()
{
addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown);
}

eriknoorland
%Europe/Berlin %909 %2010, 21:50
Als dat niet werkt kun je nog proberen:
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown);
in je added to stage handler.

TheDutch
%Europe/Berlin %918 %2010, 22:01
Tomsie, zou prima moeten werken zoals je code is. Je moet alleen de nieuwe instantie van Player wel aan de display list toevoegen binnen Game. Dit doe je met addChild() (http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObjectContainer.html#addChild%28%29) :).

Tomsie
%Europe/Berlin %577 %2010, 13:52
Het is gelukt!
Door een combinatie van

public function Player()
{
addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown);
}

en

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown);

Hartstikke bedankt!

Had alleen nog een vraagje, hoe kan ik de speler zo laten bewegen dat deze alleen over een bepaald pad/grid gaat? om even een voorbeeld te geven:

http://i5.photobucket.com/albums/y162/schedelbreuk/layoutgame.jpg

Is "follow line" aan te spreken in actionscript of is er een andere manier?


EDIT:
Of dat de speler loopt over de vlakjes in plaats van de lijnen?

e.l.dam
%Europe/Berlin %620 %2010, 14:53
Je kunt het zo ingewikkeld maken als je wilt... als de speler alleen over een grid mag bewegen, kun je zorgen dat de verplaatsing de grote van het grid is.

Minder mooi, dus wat je dan kunt doen is kijken of je op een kruising zit (stel je grid is in blokjes van 25x25):

if (player.x % 25 == 0) {
// als je x van speler (y ook doen) modulo 25 doet en er blijft niets over
// dan kan je dus naar boven/beneden/links/rechts
// alleen de x dan kun je alleen naar boven/beneden
// alleen de y dan kun je alleen naar links/rechts
}

Zorg in dat geval dat je speler altijd met stapjes van 5 (oid) verplaatst. Is je grid 10x10 en beweegt je speler met 3 per keer, dan kom je nooit op die x of y = 10 (of een veelvoud ervan), en kan je dus nooit bewegen.