[AS3] Duwtje in de juiste richting...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • nalufrank
  • Registratie: Juli 2009
  • Laatst online: 13-08 20:54
Beste tweakers!

Ik ben bezig met een flash game en zit op moment eigenlijk een beetje vast. Ik ben niet zo gevorderd in AS3 en zie door de bomen het bos niet meer... Hopelijk kunnen jullie mij iets verder op weg helpen. Hieronder zal ik even kort uitleggen wat ik aan het maken ben en wat mijn vraag is. Natuurlijk is algemene feedback van harte welkom!

Korte omschrijving van het werkende spel:
Je bent een stukje groente en ligt op de snijplank van de chefkok. Hij heeft een bijl in zijn handen en gaat je doormidden hakken! Maar als je snel genoeg bent druk je op de spatiebalk en kun je wegspringen.

Zodra je op start klikt begint het spel af te tellen van 3, 2, 1 --> het spel start nu. Na het aftellen gebruik ik een math random om telkens een willekeurig aantal seconden te krijgen wanneer de bijl gaat hakken. Maar op het moment dat hij gaat hakken zit er nog een kleine timer in van 1,5 sec zodat je in die 1.5 seconde het moment hebt om op de spatiebalk te drukken. Druk je niet binnen die 1.5 seconde dan ben je te laat.

Mijn vraag:
Ik heb hier volgens mij het grootste deel staan van de actionscript. Ik ben niet zo heel goed met flash/AS3 en zie door de bomen het bos even niet meer. Daarom leek mij een extra paar ogen wel even handig.

ACTIONSCRIPT 3.0:
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import flash.utils.Timer;
import flash.events.*;
import flash.display.MovieClip;

//Declaring variables
var bijl:MovieClip = bijlMc;
var reactionTimeStop:Timer = new Timer(1000,0);
var countDown:Timer = new Timer(1000,0);
var timerBijl:Timer = new Timer(0);
var starttxt:MovieClip = startMc;
var randomTime:Number;
var secCntr:int = 0;
var reactionTimeStart:Timer = new Timer(1000,0);
var spatieGedrukt:Boolean;
var keyPressed:int;

//Init
starttxt.stop();
bijl.stop();
timerBijl.stop();
countDown.stop();
reactionTimeStart.stop();
reactionTimeStop.stop();


//Events
starttxt.addEventListener(MouseEvent.MOUSE_OVER, startGameOver);
starttxt.addEventListener(MouseEvent.MOUSE_OUT, startGameOut);
starttxt.addEventListener(MouseEvent.MOUSE_DOWN, startGameDown);

countDown.addEventListener(TimerEvent.TIMER, countDownPassed);
timerBijl.addEventListener(TimerEvent.TIMER, timeBijlPassed);
reactionTimeStart.addEventListener(TimerEvent.TIMER, startReactionTimer);
reactionTimeStop.addEventListener(TimerEvent.TIMER, stopReactionTimer);
bijl.addEventListener(Event.ENTER_FRAME, bijlHakt);

//Functions
//Hier klik je op het stukje txt "Start"
function startGameDown(e:MouseEvent){
    countDown.start();
}

function startGameOver(e:MouseEvent){
    starttxt.gotoAndStop(2);
}

function startGameOut(e:MouseEvent){
    starttxt.gotoAndStop(1);
}

//Timer die random tijd berekent wanneer de bijl gaat vallen.
function countDownPassed(e:TimerEvent){
    secCntr++;
    trace(secCntr);
    if(secCntr == 3){
        secCntr = 0;
        countDown.stop();
        timerBijl.delay = 2300 + Math.random() * 10700;
        timerBijl.start();
    }
}

//De random tijd is hier voorbij en start de reactie tijd om 'weg te springen'.
function timeBijlPassed(e:TimerEvent){
    timerBijl.stop();
    trace("De bijl gaat nu vallen!");
    reactionTimeStart.start();
}

//De reactie tijd gaat lopen en hier komt de mogelijkheid om de spatiebalk in te drukken.
function startReactionTimer(e:TimerEvent){
    stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
    trace("ReactieTijd gaat in...");
    stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
    reactionTimeStart.delay = 1500;
    reactionTimeStop.start();
}

function stopReactionTimer(e:TimerEvent){
    stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
    reactionTimeStart.stop();
    reactionTimeStop.stop();
    trace("ReactieTijd Stopt!");
    bijl.play();
}

//Hier is de 1,5 (1500) sec voorbij.
function bijlHakt(e:Event){
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
    bijl.stop();
    function checkKeyDown(e:KeyboardEvent){
        if (e.keyCode == Keyboard.SPACE){
            keyPressed = 1;
            trace("Spatiebalk is ingedrukt! Je bent safe!");
        }
        else {
            keyPressed = 0;
            trace("Epic Fail...");
        }
    }
}

function checkKeyDown(e:KeyboardEvent){
    if (e.keyCode == Keyboard.SPACE){
        keyPressed = 1;
        trace("Spatiebalk is ingedrukt! Je bent safe!");
    }
    else {
        keyPressed = 0;
        trace("Epic Fail...");
    }
}


De Output:
1
2
3
De bijl gaat nu vallen!
ReactieTijd gaat in...
ReactieTijd Stopt!

en de output als je op tijd spatie drukt:
1
2
3
De bijl gaat nu vallen!
ReactieTijd gaat in...
Spatiebalk is ingedrukt! Je bent safe!
ReactieTijd Stopt!

Maar hij zegt nu niet mijn "else". Als je de spatie niet heb ingedrukt. Wat heb ik hier fout gedaan, en waarom zegt hij niet dat ik de spatiebalk niet heb ingedrukt?

Iedereen wist dat het niet kon, tot er iemand kwam die dat niet wist.


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 18:47
Je else code staat in de functie "checkKeyDown(e:KeyboardEvent)". Deze functie wordt alleen uitgevoerd als er op een toets is gedrukt. Druk je nu op bijv. op de Enter ipv de spatiebalk dan zul je zien dat je else wel wrodt uitgevoerd.
Wat je wilt is dat je ergens ine en variabele bijhoud of er wel of niet is gedrukt en dit te checken na afloop van je reactiontimer (als je dus te laat bent)

Acties:
  • 0 Henk 'm!

  • nalufrank
  • Registratie: Juli 2009
  • Laatst online: 13-08 20:54
Caelorum schreef op donderdag 12 april 2012 @ 19:29:
Je else code staat in de functie "checkKeyDown(e:KeyboardEvent)". Deze functie wordt alleen uitgevoerd als er op een toets is gedrukt. Druk je nu op bijv. op de Enter ipv de spatiebalk dan zul je zien dat je else wel wrodt uitgevoerd.
Wat je wilt is dat je ergens ine en variabele bijhoud of er wel of niet is gedrukt en dit te checken na afloop van je reactiontimer (als je dus te laat bent)
Hmm ja dat is voor mij helaas abracadabra :P Maar toch bedankt voor je hulp en reactie! Ik weel wel dat het dan waarschijnlijk een boolean moet zijn, maar verder dan dat kom ik niet echt, weet niet of ik dan een valueOf / toString moet gebruiken. En hoe ik die moet gebruiken. |:(

Iedereen wist dat het niet kon, tot er iemand kwam die dat niet wist.


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 18:47
Je hebt al een spatiegedrukt boolean variabele dus die kan je gebruiken.

Zet gewoon in je if (e.keyCode == Keyboard.SPACE) een spatiegedrukt = true;

dan in je timeBijlPassed functie een if(spatiegedrukt==null || spatiegedrukt == false) met daarin code die moet worden uitgevoerd als de speler niet heeft gedrukt.
Dan rest je alleen nog elke keer voordat je de timerBijl start je spatiegedrukt op false moet zetten.

Overigens raad ik je aan een goed boek door te nemen bijv. "Essential Actionscript 3.0" (isbn: 978-0-596-52694-8) en "Actionscript 3.0 cookbook" (isbn: 978-0-596-52695-5).
Essential Actionscript 3.0 is zeer uitgebreid en leert je alles over de taal, maar heeft niet echt praktische voorbeelden. AS 3.0 cookbook daarentegen staat vol met prakitsche voorbeelden, maar heeft weinig echt diepgaande inhoud. Perfecte aanvullingen op elkaar dus en zeker de moeite waard om te kopen.

Acties:
  • 0 Henk 'm!

  • nalufrank
  • Registratie: Juli 2009
  • Laatst online: 13-08 20:54
Caelorum schreef op donderdag 12 april 2012 @ 19:57:
Je hebt al een spatiegedrukt boolean variabele dus die kan je gebruiken.

Zet gewoon in je if (e.keyCode == Keyboard.SPACE) een spatiegedrukt = true;

dan in je timeBijlPassed functie een if(spatiegedrukt==null || spatiegedrukt == false) met daarin code die moet worden uitgevoerd als de speler niet heeft gedrukt.
Dan rest je alleen nog elke keer voordat je de timerBijl start je spatiegedrukt op false moet zetten.

Overigens raad ik je aan een goed boek door te nemen bijv. "Essential Actionscript 3.0" (isbn: 978-0-596-52694-8) en "Actionscript 3.0 cookbook" (isbn: 978-0-596-52695-5).
Essential Actionscript 3.0 is zeer uitgebreid en leert je alles over de taal, maar heeft niet echt praktische voorbeelden. AS 3.0 cookbook daarentegen staat vol met prakitsche voorbeelden, maar heeft weinig echt diepgaande inhoud. Perfecte aanvullingen op elkaar dus en zeker de moeite waard om te kopen.
Bedankt! Het werkt in principe wel nu. Alleen moet ik nu continue rammen op de spatie vanaf het begin om te winnen zeg maar. Als ik in de output zie staan: ReactionTime Start... en dán één keer op spatie druk doet hij het niet. Terwijl dat laatste eigenlijk de bedoeling is..

Ook krijg ik deze foutmelding:
Scene 1, Layer 'AS', Frame 1, Line 87 Warning: 1096: Illogical comparison with null. Variables of type Boolean cannot be null.


Klopt eigenlijk ook die "reactionTimeStart.delay = 1000;" wel? Het is namelijk de bedoeling dat dit de tijd is die je hebt om de spatiebalk in te drukken.. maar al zet ik hem naar 5000 of 10000 lijkt er niks te veranderen aan de tijdsduur.

Hier even hoe ik nu de AS3 heb:
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import flash.utils.Timer;
import flash.events.*;
import flash.display.MovieClip;
import flash.utils.setInterval;

//Declaring variables
var bijl:MovieClip = bijlMc;
var reactionTimeStop:Timer = new Timer(1000,0);
var countDown:Timer = new Timer(1000,0);
var timerBijl:Timer = new Timer(0);
var starttxt:MovieClip = startMc;
var randomTime:Number;
var secCntr:int = 0;
var reactionTimeStart:Timer = new Timer(50,0);
var spatieGedrukt:Boolean;
var keyPressed:int;

//Init
stop();
starttxt.stop();
bijl.stop();
timerBijl.stop();
countDown.stop();
reactionTimeStart.stop();
reactionTimeStop.stop();


//Events
starttxt.addEventListener(MouseEvent.MOUSE_OVER, startGameOver);
starttxt.addEventListener(MouseEvent.MOUSE_OUT, startGameOut);
starttxt.addEventListener(MouseEvent.MOUSE_DOWN, startGameDown);

countDown.addEventListener(TimerEvent.TIMER, countDownPassed);
timerBijl.addEventListener(TimerEvent.TIMER, timeBijlPassed);
reactionTimeStart.addEventListener(TimerEvent.TIMER, startReactionTimer);
reactionTimeStop.addEventListener(TimerEvent.TIMER, stopReactionTimer);
bijl.addEventListener(Event.ENTER_FRAME, bijlHakt);

//Functions
//Hier klik je op het stukje txt "Start"
function startGameDown(e:MouseEvent){
    countDown.start();
}

function startGameOver(e:MouseEvent){
    starttxt.gotoAndStop(2);
}

function startGameOut(e:MouseEvent){
    starttxt.gotoAndStop(1);
}

//Timer die random tijd berekent wanneer de bijl gaat vallen.
function countDownPassed(e:TimerEvent){
    secCntr++;
    trace(secCntr);
    if(secCntr == 3){
        secCntr = 0;
        countDown.stop();
        timerBijl.delay = 2300 + Math.random() * 10700;
        timerBijl.start();
    }
}

//De random tijd is hier voorbij en start de reactie tijd om 'weg te springen'.
function timeBijlPassed(e:TimerEvent){
    timerBijl.stop();
    trace("De bijl gaat nu vallen!");
    reactionTimeStart.start();
}

//De reactie tijd gaat lopen en hier komt de mogelijkheid om de spatiebalk in te drukken.
function startReactionTimer(e:TimerEvent){
    stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
    trace("ReactieTijd gaat in...");
    reactionTimeStart.delay = 1000;
    reactionTimeStop.start();
}

//Deze function zorgt er ook voor dat je de spatie kan indrukken en loopt 1,5 sec voor hij stopt.
function stopReactionTimer(e:TimerEvent){
    stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
    reactionTimeStart.stop();
    reactionTimeStop.stop();
    trace("ReactieTijd Stopt!");
    bijl.play();
    if (spatieGedrukt == null || spatieGedrukt == false){
        trace("Fail!");
        gotoAndPlay(3, "Scene 1");
        stop();
    }
}

//Hier is de 1,5 (1500) sec voorbij.
function bijlHakt(e:Event){
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
    bijl.stop();
}

function checkKeyDown(e:KeyboardEvent){
    if (spatieGedrukt = true){
        keyPressed = 1;
        trace("Win!");
        reactionTimeStart.stop();
        reactionTimeStop.stop();
        gotoAndPlay(2, "Scene 1");
        stop();
    }
}


alvast heel erg bedankt!!

Iedereen wist dat het niet kon, tot er iemand kwam die dat niet wist.


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 18:47
nalufrank schreef op donderdag 12 april 2012 @ 22:37:
[...]
Ook krijg ik deze foutmelding:
Scene 1, Layer 'AS', Frame 1, Line 87 Warning: 1096: Illogical comparison with null. Variables of type Boolean cannot be null.
[..]
Och, dat kan wel zo zijn. Is al weer 2 jaar dat ik iets met AS3 heb gedaan.
Maar zoals ik al zei het is misschien verstandig om een goed boek te gaan zoeken. Dit is namelijk een vrij makkelijk op te lossen probleem en ik heb persoonlijk niet zo veel zin om je hele script te schrijven (dat is ook niet de bedoeling hier).
Ik raad je dan ook aan om even goed te zoeken naar de laatste stand van zaken over beginnen met AS3. De door mij genoemde boeken zijn niet de meest makkelijke om te beginnen (al leer je er wel heel veel van) en vereisen een behoorlijke doorzettingsvermogen om door te lezen :P

Acties:
  • 0 Henk 'm!

  • nalufrank
  • Registratie: Juli 2009
  • Laatst online: 13-08 20:54
Oke, nou ja het was niet de bedoeling dat iemand het allemaal voor mij zou gaan doen, ben zelf gekomen waar ik was toen ik hier kwam. Maar wel ontzettend bedankt voor de tips, ben er zeker wel wat verder mee gekomen!

Heb het ook opgelost met dit:
if (spatieGedrukt == true || spatieGedrukt == false)

in plaats van:
if (spatieGedrukt == null || spatieGedrukt == false)

[ Voor 26% gewijzigd door nalufrank op 13-04-2012 09:11 ]

Iedereen wist dat het niet kon, tot er iemand kwam die dat niet wist.


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 18:47
nalufrank schreef op vrijdag 13 april 2012 @ 09:03:
[...]
Heb het ook opgelost met dit:
if (spatieGedrukt == true || spatieGedrukt == false)

in plaats van:
if (spatieGedrukt == null || spatieGedrukt == false)
Die werking is zeker niet hetzelfde!
Bij de eerste wordt de conditie altijd uitgevoerd (bij true en false) en bij de tweede alleen als de variabele null is of false. Aangezien een bool blijkbaar geen null kan zijn in AS3 is die eerste check op null niet nodig. Die check zat erin omdat ik alweer gewend was aan C# en consorten, maar ed compiler gaf al netjes een waarschuwing :P

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Caelorum schreef op vrijdag 13 april 2012 @ 10:18:
[...]

Die werking is zeker niet hetzelfde!
Bij de eerste wordt de conditie altijd uitgevoerd (bij true en false) en bij de tweede alleen als de variabele null is of false. Aangezien een bool blijkbaar geen null kan zijn in AS3 is die eerste check op null niet nodig. Die check zat erin omdat ik alweer gewend was aan C# en consorten, maar ed compiler gaf al netjes een waarschuwing :P
Erhm...
Een bool in C# is een value type en kan nooit null zijn. In ActionScript zijn types slechts hints waar de compiler al dan niet iets mee kan doen (standaard is om type fouten als compilatie fout te rapporteren). Gedurende runtime kan een variable in principe van alles bevatten, dus ook de null waarde. Deze wordt echter altijd gecoerced naar de boolean waarde false, dus er expliciet op controleren is nutteloos. Ook expliciete vergelijkingen met de true of false literals zijn niet nodig. Je kunt simpelweg iets doen als:

code:
1
if ( !boolValue ) { ... }

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 18:47
R4gnax schreef op dinsdag 17 april 2012 @ 13:23:
[...]Erhm...
Een bool in C# is een value type en kan nooit null zijn. [...]
Woops!
Ik ga me ff heel diep schamen in een hoekje ^^
Pagina: 1