Avatar billede maqhem Nybegynder
07. juli 2006 - 09:53 Der er 44 kommentarer og
1 løsning

if(Key.isDown) i Flash 9

Hentede Flash 9 Public Alpha for at se, hvad det var. Utrolig sejt! Blot ét problem:
Denne kode duer ikke:

if(Key.isDown(123)){
    //...
}

Jeg får følgende fejlmælding:

  frame1(2): Migration issue: The property Key is no longer supported.  The Key class has been renamed Keyboard..

    if(Key.isDown(123)){

    ...^

Og ændrer jeg dette til Keyboard i stedet, melder den bare fejl om isDown.
Hvad skal disse være?
Avatar billede maqhem Nybegynder
07. juli 2006 - 10:07 #1
... jeg går da ud fra, koden er magen til dén, i Flash 8 - eller hvad?
Avatar billede thulstrup Nybegynder
07. juli 2006 - 10:12 #2
Nej, Public Alpha'en benytter ActionScript 3, hvori der er mange ændringer.

For at lytte til efter keyDown events kan du benytte nedenstående:


stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);

function keyDownHandler(event:KeyboardEvent):void {
    trace("keyDownHandler: " + event.keyCode);
}

function keyUpHandler(event:KeyboardEvent):void {
    trace("keyUpHandler: " + event.keyCode);
}
Avatar billede maqhem Nybegynder
07. juli 2006 - 10:19 #3
Hvad gør stage?
Avatar billede maqhem Nybegynder
07. juli 2006 - 10:29 #4
nårh, hehe.

Detsuden finder jeg ovenstående kode fulstændig ulogisk! Det er da, ja undskyld jeg siger det, mærkeligt. Eller er det bare mig?

Stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
Stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
function keyDownHandler(event:KeyboardEvent):void {
    Stage.scene._y++;
}
function keyUpHandler(event:KeyboardEvent):void {
    Stage.scene._y--;
}

Men dette virker bare ikke :(
... det kommer godt nok til, at tage tid, at sætte sig ind i AS3.

Hvad gør jeg forkert? Det er jo lige som dit, eller hvad?
Avatar billede thulstrup Nybegynder
07. juli 2006 - 10:33 #5
stage er din scene, dvs. at vi lytter efter alle keyDown events.
Man kan f.eks. også vælge kun at lytte efter key events på et movieclip eller en sprite.

Eksemplet her vil kun trace så længe child spriten har focus:

var child:Sprite = new Sprite();
child.graphics.beginFill(0xff9900);
child.graphics.drawRect(100, 100, 200, 200);
child.graphics.endFill();
addChild(child);
stage.focus = child;

child.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
child.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);

function keyDownHandler(event:KeyboardEvent):void {
    trace("keyDownHandler: " + event.keyCode);
}

function keyUpHandler(event:KeyboardEvent):void {
    trace("keyUpHandler: " + event.keyCode);
}
Avatar billede thulstrup Nybegynder
07. juli 2006 - 10:34 #6
stage skal være med lille "s"
Avatar billede maqhem Nybegynder
07. juli 2006 - 10:37 #7
Ok
Avatar billede maqhem Nybegynder
07. juli 2006 - 10:39 #8
... burde dette ikke du:

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);

function keyDownHandler(event:KeyboardEvent):void {
    stage.scene._y--;
}

function keyUpHandler(event:KeyboardEvent):void {
    stage.scene._y++;
}

- for det gør det ikke.
Avatar billede maqhem Nybegynder
07. juli 2006 - 10:46 #9
... scene er et mc. Har også prøvet, at omdøbe det - ingen resultat
Avatar billede thulstrup Nybegynder
07. juli 2006 - 10:49 #10
Du kan ikke benytte stage på samme måde som _root. Desuden beholder eventListeners i AS3 scopet, så det er hellere ikke nødvendigt.

I AS3 hedder det ikke længere _y men blot y, så eksemplet skal se sådan her ud:

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);

function keyDownHandler(event:KeyboardEvent):void {
    scene.y--;
}

function keyUpHandler(event:KeyboardEvent):void {
    scene.y++;
}
Avatar billede maqhem Nybegynder
07. juli 2006 - 10:53 #11
Tæt på - men nu kan scene kun rykke op. Uanset hvad jeg trykker på.
Detsuden rykker den en takt ned igen, hvis jeg ikke holder knappen i bund.
Avatar billede thulstrup Nybegynder
07. juli 2006 - 10:57 #12
Ja, det er jo lige det der står i koden :o)

Ved tryk på hvilken som helst knap, træk 1px fra scene's nuværende y position.
Ved slip af knappen, lig 1px til scene's nuværende y position.

Hvad er det du prøver at få den til?
Avatar billede maqhem Nybegynder
07. juli 2006 - 11:01 #13
Blot at flytte op hvis jeg trykker op (eller holder i bund) - og det samme med højre, venstre og ned.
Troede, KEY_UP vare knappen op; hehe.
Avatar billede maqhem Nybegynder
07. juli 2006 - 11:11 #14
... det kan da gøres meget nemmere, ikke? Eller vil du stadig anbefale ovenstående?
Og hvordan vil koden se ud?
Avatar billede thulstrup Nybegynder
07. juli 2006 - 11:14 #15
Så kan du gøre sådan her:

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);

function keyDownHandler(event:KeyboardEvent):void {
    var keyCode:uint = event.keyCode;
    //venstre
    if(keyCode == 37){
        scene.x--;
    }
    //op
    else if(keyCode == 38){
        scene.y--;
    }
    //højre
    else if(keyCode == 39){
        scene.x++;
    }
    //ned
    else if(keyCode == 40){
        scene.y++;
    }   
}
Avatar billede maqhem Nybegynder
07. juli 2006 - 11:16 #16
... kan det gøres sådan, at den ikke laver et lille "hul" mellem første og andet ryk?
Avatar billede maqhem Nybegynder
07. juli 2006 - 11:20 #17
... ej, det gør ikke så meget alligevel...
Avatar billede maqhem Nybegynder
07. juli 2006 - 11:23 #18
kunne du ikke i stedet lige forklare din kode?

addEventListener = tilføjer en listener til knapper.
KeyboardEvent.KEY_UP = Når en vilkensomhelst knap trykkes ned skal den kalde keyDownHandler
event:KeyboardEvent = ?
void = ?
var keyCode:uint = ?
event.keyCode = ?
Avatar billede thulstrup Nybegynder
07. juli 2006 - 11:37 #19
event bliver automatisk sendt med hver keyDown.
event indeholder en række properties her under keyCode (se http://livedocs.macromedia.com/flex/2/langref/flash/events/KeyboardEvent.html#KEY_DOWN).

void betyder at funktionen ikke retunerer noget.

uint (står for unsigned integer) er en ny datatype i AS3. Den er beregnet til heltal (tal uden decimal værdier) og kan ikke være en negativ værdi.
Avatar billede maqhem Nybegynder
07. juli 2006 - 11:47 #20
smart
Avatar billede thulstrup Nybegynder
07. juli 2006 - 11:50 #21
Ja, men der er godt nok mange ting man skal vende sig til i AS3 :o)
Avatar billede maqhem Nybegynder
07. juli 2006 - 12:00 #22
Ja, det kan jeg se!

Er der lige et par ting, du kan ryste ud af ærmet, som man helt alment bare bør kende til af ændringer?
Avatar billede thulstrup Nybegynder
07. juli 2006 - 12:12 #23
Du kan få et par links til at starte på:

Exploring the Flash Professional 9 ActionScript 3.0 Preview:
http://www.adobe.com/devnet/flash/articles/flash9_as3_preview.html

Tips for learning ActionScript 3.0:
http://www.adobe.com/devnet/actionscript/articles/actionscript_tips.html

Differences between ActionScript 2.0 and 3.0:
http://livedocs.macromedia.com/flex/2/langref/migration.html
Avatar billede maqhem Nybegynder
07. juli 2006 - 23:40 #24
Tusind tak indtil nu - men jeg forstår ikke helt deres søgemaskine. Kan du fortælle mig, hvordan operatoren new bruges, hvis jeg vil lave en funktion svarende til createEmptyMovieClip?
Avatar billede thulstrup Nybegynder
08. juli 2006 - 11:16 #25
Et stk. nyt movieclip:

var mc:MovieClip = new MovieClip();
Avatar billede maqhem Nybegynder
08. juli 2006 - 11:25 #26
Ja, men hvordan laver jeg et mc?

Ligesom:

with(createEmptyMovieClip('mc', 1)){
    _x = 100;
    _y = 80;
    beginFill('0xff0000', 100);
    lineTo(100, 0);
    lineTo(0, 100);
    lineTo(0, 0);
}

Hvis dette skal oversættes til AS3, hvordan vil det så se ud?
Avatar billede maqhem Nybegynder
08. juli 2006 - 11:31 #27
Forstå det ret:

var mc:MovieClip = new MovieClip();

laver et mc - men jeg behøver, at den også skal tegne det som i mit eksempel.
Avatar billede maqhem Nybegynder
08. juli 2006 - 12:17 #28
Okay, nu har jeg fanget søgningen!
Men jeg kan intet eksempel finde på dét, jeg søger. Jeg troede faktisk, at dette ville kunne du:

var mc:MovieClip = new MovieClip();
mc.x = 50;
mc.y = 50;
mc.graphics.lineStyle(4, '0x000000');
mc.graphics.lineTo(100, 100);
mc.graphics.lineTo(0, 0);

Jeg ved godt, det kun er en streg - men fyld kan jeg nemt påsætte.
Kan du mixe et script, der duer til mit formål?
Avatar billede thulstrup Nybegynder
08. juli 2006 - 20:56 #29
Du er inde på noget af det rigtige, men for at få vist movieclippet, skal du tilføje det til en DisplayObjectContainer v.h.a. addChild:

var mc:MovieClip = new MovieClip();
mc.x = 50;
mc.y = 50;
mc.graphics.lineStyle(4, 0x000000);
mc.graphics.moveTo(100, 100);
mc.graphics.lineTo(0, 0);
addChild(mc);
Avatar billede maqhem Nybegynder
08. juli 2006 - 21:17 #30
Årh, fedt!
Du ka' det skidt dér!

Så står blot to spørgsmål i kø til besvaring:

1. Hvad er Child?
2. Hvad er Sprite?

:)
Avatar billede maqhem Nybegynder
08. juli 2006 - 21:21 #31
... og ét mere:

var mc:MovieClip = new MovieClip()
with(mc){
    x = 50;
    y = 50;
    swapDepths(2);
    graphics.lineStyle(0, 0x000000);
    graphics.lineTo(100, 100);
    graphics.lineTo(0, 0);
    addChild(this);
}

Duer ikke. Hvorfor ikke?

Jeg håber ikke, du ikke kan lide, jeg spørger!
Vil du have flere point eller noget, så sig til :)
Avatar billede maqhem Nybegynder
08. juli 2006 - 21:25 #32
... nårh:

var mc:MovieClip = new MovieClip()
with(mc){
    x = 50;
    y = 50;
    graphics.lineStyle(0, 0x000000);
    graphics.lineTo(100, 100);
    graphics.lineTo(0, 0);
}
addChild(mc);
Avatar billede thulstrup Nybegynder
08. juli 2006 - 22:48 #33
Sprite er endnu en tilføjelse til AS3. Det er i princippet bare et movieclip uden tidslinen.

Du kan læse mere om Sprite her:
http://livedocs.macromedia.com/flex/2/langref/flash/display/Sprite.html
Avatar billede maqhem Nybegynder
08. juli 2006 - 22:54 #34
... og Child?
Avatar billede thulstrup Nybegynder
08. juli 2006 - 23:14 #35
Avatar billede maqhem Nybegynder
08. juli 2006 - 23:20 #36
... og så kommer jeg lige til allersidst i tanker om (så typisk mig) et slut-af-spørgsmål:

Hvordan ændrer jeg depth på et mc?
Det foregår vidst med setChildIndex tror jeg da nok - men slet ikke sikker på, hvordan...

Du har været et geni indtil nu; jeg er meget taknemlig!
Avatar billede thulstrup Nybegynder
09. juli 2006 - 00:05 #37
Der er flere måder det kan gøres på.

Du kan bruge addChildAt til at definere hvilket index dit child instance skal tilføjes til:

var sort:Sprite = new Sprite();
sort.graphics.beginFill(0x000000);
sort.graphics.drawRect(0, 0, 100, 100);
sort.graphics.endFill();
addChild(sort);

var orange:Sprite = new Sprite();
orange.graphics.beginFill(0xff9900);
orange.graphics.drawRect(50, 50, 100, 100);
orange.graphics.endFill();
addChildAt(orange, 0); //orange vil blive tilføjet under sort



Du kan bruge setChildIndex til ændre index på et child instance der allerede er tilføjet:

var sort:Sprite = new Sprite();
sort.graphics.beginFill(0x000000);
sort.graphics.drawRect(0, 0, 100, 100);
sort.graphics.endFill();
addChild(sort);

var orange:Sprite = new Sprite();
orange.graphics.beginFill(0xff9900);
orange.graphics.drawRect(50, 50, 100, 100);
orange.graphics.endFill();
addChild(orange); //orange vil blive tilføjet over sort

setChildIndex(orange, 0); //orange vil blive flyttet under sort


Du kan benytte swapChildren til at bytte index på to child objekter:

var sort:Sprite = new Sprite();
sort.graphics.beginFill(0x000000);
sort.graphics.drawRect(0, 0, 100, 100);
sort.graphics.endFill();
addChild(sort);

var orange:Sprite = new Sprite();
orange.graphics.beginFill(0xff9900);
orange.graphics.drawRect(50, 50, 100, 100);
orange.graphics.endFill();
addChild(orange); //orange vil blive tilføjet over sort

swapChildren(sort, orange); //orange vil blive flyttet under sort


Og endelig kan du benytte swapChildrenAt til at bytte to child objekter på to angivne index positioner:

var sort:Sprite = new Sprite();
sort.graphics.beginFill(0x000000);
sort.graphics.drawRect(0, 0, 100, 100);
sort.graphics.endFill();
addChild(sort);

var orange:Sprite = new Sprite();
orange.graphics.beginFill(0xff9900);
orange.graphics.drawRect(50, 50, 100, 100);
orange.graphics.endFill();
addChild(orange); //orange vil blive tilføjet over sort

swapChildrenAt(0, 1) //orange vil blive flyttet under sort
Avatar billede maqhem Nybegynder
09. juli 2006 - 00:16 #38
Sådan skal det være! Hardcore du :)
... men hvad skal jeg skrive, hvis denne funktion skal bruges på et mc med instancen 'front':

setChildIndex(sprite, 2);

Dette duer jo kun, hvis sprite er et sprite - men det er et mc i scenen.

Nu lover jeg, at jeg stopper...
Avatar billede maqhem Nybegynder
09. juli 2006 - 00:18 #39
Nu er jeg kommet til, at skrive sprite i koden og efterfølgende - mente 'front'
Avatar billede thulstrup Nybegynder
09. juli 2006 - 00:28 #40
setChildIndex og alle de andre virker både på movieclips og sprites, så du skriver bare:

setChildIndex(front, 2);
Avatar billede maqhem Nybegynder
09. juli 2006 - 00:35 #41
var sp:Sprite = new Sprite();
with(sp){
    x = front.x;
    y = front.y;
    with(graphics){
        beginFill(0xff0000, .6);
        lineStyle(0, 0x000000);
        lineTo(front.width, 0);
        lineTo(front.width, front.height);
        lineTo(0, 0);
    }
}
addChild(sp);
setChildIndex(sp, 0);
setChildIndex(front, 1);

Jeg har tegnet et mc og instanced det til front.
Burde dette ikke tegne en halvgennemsigtig trekant bag cirklen, for det gør det ikke.
Avatar billede maqhem Nybegynder
09. juli 2006 - 00:35 #42
Jo, nu gør den sq :S
Avatar billede maqhem Nybegynder
09. juli 2006 - 00:38 #43
Tusind tak!

Og du vil ikke lige have lidt flere point for al tiden og de mange gode, brugbare svar?
Avatar billede thulstrup Nybegynder
09. juli 2006 - 08:24 #44
Nej ellers tak, jeg klarer mig :o)
Avatar billede maqhem Nybegynder
09. juli 2006 - 09:43 #45
Okay
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester