Volledige versie bekijken : KeyBoardEvent in Sprite werkt niet?
theFlashWizard
%Europe/Berlin %797 %2007, 20:08
Beste developers,
Ik ben een beetje aan het experimenteren met as3.0 maar er is nu 1 ding waar ik niet uitkom.
Ik kan keyBoardEvents opvangen in de document class maar niet in een losse sprite.
Terwijl flash help zegt dat je het zou moeten kunnen doen met ieder interactief dispay object.
Dus, ik heb 2 voorbeeldjes bijgevoegt.
KeyBoardEvents met de document class als keyBoard listener.
SpriteKeyBoardEvents met een losse sprite als keyBoard listener.
Zoals je begrijpt werkt de 1ste dus wel maar de 2de niet.
Wie kan wat licht op deze zaak werpen?
Alvast bedankt
TheDutch
%Europe/Berlin %958 %2007, 00:00
Dat komt denk ik omdat de Sprite geen focus heeft wanneer je een toets indrukt :).
theFlashWizard
%Europe/Berlin %052 %2007, 02:14
Owke...
Maar je kan toch niet meerdere objecten focus geven?
Dat betekent dus dat je niet meerdere objecten naar het keyboard kan laten luisteren? (Zonder dat je een constructie maakt vanaf de stage of een object met focus)
Stel dat ik bijv een spel maak, waarbij Player moet reageren op de pijltjes toetsen voor besturing, maar de game zelf moet luisteren naar bijv de p toets, voor pause. Dan beperkt dit nieuwe functie je.
Waarom zullen ze gekozen hebben voor deze focus manier?
TheDutch
%Europe/Berlin %323 %2007, 08:45
Het is heel logisch dat key events alleen plaats vinden wanneer iets gefocused is, je wilt toch ook niet dat in een form alle TextFields reageren op toetsaanslagen zonder dat het focus heeft? Je zou in dat soort gevallen inderdaad de key events moeten afvangen via de stage en die eventueel de events door laten 'dispatchen' naar child elementen. Adobe beschrijft het zo in de LiveDocs:
To listen globally for key events, listen on the Stage for the capture and target or bubble phase.
theFlashWizard
%Europe/Berlin %815 %2007, 20:34
Hmm theDutch, daar heb je weer een ijzersterk punt.
Volgende punt dan, dit heb ik nog niet heel zorgvuldig onderzocht, hoe kun je het beste dan de stage aanspreken vanaf een display obj?
Je kan volgens mij niet direct de stage aanspreken, dat lijkt bij mij alleen te lukken vanaf de document class.
Je kan door de verschillende classes een verwijzing naar de stage doorgeven maar dit lijkt me onhandig.
Misschien een static class die dit soort events doorgeeft en waaraan je listeners kan hangen?
Even voor de zekerheid, het is toch geen vreemd verzoek om vanaf verschillende plekken de keyboard in de gaten te willen houden?
TheDutch
%Europe/Berlin %818 %2007, 20:39
Een vreemd verzoek is het zeker niet, maar daar gaat het toch ook niet om? Het gaat om wat je wilt maken en hoe je dit kunt bereiken :).
Waarom zou je vanaf een display object de stage willen aanspreken?
theFlashWizard
%Europe/Berlin %857 %2007, 21:34
Nee ik heb namelijk nog niet iets concreets om te maken ;)
Ik vraag me dit soort dingen nu gewoon af, omdat ik later natuurlijk wel met keys ga werken.
Ik zou de stage willen aanspreken vanaf een display object om er een keyboard listener van te kunnen maken.
TheDutch
%Europe/Berlin %857 %2007, 21:35
Gewoon "this.stage.addEventListener()" is genoeg :).
theFlashWizard
%Europe/Berlin %888 %2007, 22:20
ik krijg dan deze runtime error:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Ball/::draw()
at Ball$iinit()
at SpriteKeyBoardEvents/::draw()
at SpriteKeyBoardEvents$iinit()
Blijkbaar kan hij de stage niet vinden.
Wat het 2de gedeelte betekent zie ik niet, als jullie daar een uitleg/tut/artikel/reference over hebben heel graag, want het lijkt nu wel geheimtaal.
Waarom gebruik je eigenlijk this. ? Deze is toch in principe overbodig?
Ik zal de test bestanden even bijvoegen.
TheDutch
%Europe/Berlin %893 %2007, 22:26
Het gebruik van "this" is good-practice. Het helpt niet alleen erg goed bij code completion het maakt je code een heel stuk minder foutgevoelig omdat je altijd weet wat de scope is en naam conflicten in verschillende scopes niet zullen plaatsvinden. Scopen is één van de belangrijkste dingen bij het programmeren, leer jezelf dit aan altijd te doen!
De property "stage" is volgensmij pas beschikbaar wanneer de class is toegevoegd aan een display list. Wanneer jij een instantie maakt van de Ball class en daar in de constructor de functie draw() uitvoert die de property "stage" aanspreekt, is de instantie van de Ball class nog niet toegevoegd aan een display list :).
TheDutch
%Europe/Berlin %900 %2007, 22:36
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Ball/::draw()
at Ball$iinit()
at SpriteKeyBoardEvents/::draw()
at SpriteKeyBoardEvents$iinit()
Error bericht:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
Stappen tot de error (boven naar beneden):
4 -at Ball/::draw() // class Ball, method draw()
3 -at Ball$iinit() // class Ball, constructor
2 -at SpriteKeyBoardEvents/::draw() // class SpriteKeyBoardEvents, method draw()
1 - at SpriteKeyBoardEvents$iinit() // class SpriteKeyBoardEvents, constructor
theFlashWizard
%Europe/Berlin %905 %2007, 22:44
excuses, ik had het voorbeeld iets wat laat bij mijn vorige post bijgevoegd.
Ik gebruikte altijd _ om aan te geven dat het een "permanente" property was. Gedeeltelijk omdat het korter was en omdat ik het de meeste mensen zo dacht te zien doen.
this._... leek me daarnaast ook wat dubbelop.
Jij gebruikt this... ipv _... ?
TheDutch
%Europe/Berlin %925 %2007, 23:12
Ik gebruik altijd "this" om de rede die ik reeds gegeven heb. De underscore gebruik ik alleen voor private properties zodat daar geen verwarring over kan ontstaan. Verder gebruik ik geen andere prefixes/suffixes omdat dit in mijn ogen niet nodig is en de boel alleen maar noodeloos verwarrend maakt. Dit is verder geen eigen creatie maar een gangbare manier van programmeren :).
theFlashWizard
%Europe/Berlin %950 %2007, 23:48
owke, dat maakt de error een stuk helderder. Maar ik snap nog steeds het probleem niet P)
Owke, zal proberen dat mezelf dat ook aan te leren dan.
TheDutch
%Europe/Berlin %276 %2007, 07:38
De property "stage" is volgensmij pas beschikbaar wanneer de class is toegevoegd (addChild) aan een display list. Wanneer jij een instantie maakt van de Ball class en daar in de constructor de functie draw() uitvoert die de property "stage" aanspreekt, is de instantie van de Ball class nog niet toegevoegd aan een display list :).
Je zou dit dus moeten afvangen en draw() pas uitvoeren wanneer Ball is toegevoegd aan de display list.
theFlashWizard
%Europe/Berlin %596 %2007, 15:18
Sorry dat bericht was er tussendoor geslipt P)
Werkt perfect, thnx! :)
Ik zal het werkende systeem nog even bijvoegen.
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.