Frames and timers
BlitzPlus Forums/BlitzPlus Beginners Area/Frames and timers
| ||
1) I was still having trouble with frame animation (I’m learning slowly but surely). Thus for now, instead of having each frame done using the frame command, I drew out each frame manually and leave the unused frames off screen (500000 pixels away) until they are called up to be used (that is, they’ll come into play after key 25 is pressed). It seems to work well for now. Does anybody do it that way? 2) My main question is how do I get my different drawings to occur at precise times. For example, let’s say when key (25) is pressed the guy immediately shouts, 3 seconds later the guy punches, 5 seconds later the guy goes to a stance, and 5 seconds later the guy goes back to the stance that he had before the button was pressed (the first drawing). I’m basically trying to learn how to use the timer and make things happen at precise times. A simplified code of what I'm trying to do is below with notes there so it can be easy to find. Thank you. SetBuffer FrontBuffer() GameTimer = CreateTimer(60) Global GUYSTAND = LoadImage ("HenryRightStand.png") Global GUYSHOUTS = LoadImage ("Ball.png") Global GUYPUNCH = LoadImage ("HenryPunchRight.png") Global FIRSTSTANCE = LoadImage ("Henryagain34.png") Type FIRSTSTANCE1 Field x,y Field image Field time End Type Type GUYSHOUTS1 Field x,y Field image Field time End Type Type GUYSTANDBACK1 Field x,y Field image Field time End Type Type GUYPUNCH1 Field x,y Field image Field time End Type first1.FIRSTSTANCE1 = New FIRSTSTANCE1 first1\x = 500 first1\y = 300 first1\image = FIRSTSTANCE gshts.GUYSHOUTS1 = New GUYSHOUTS1 gshts\x = 500000 gshts\y = 300 gshts\image = GUYSHOUTS gp.GUYPUNCH1 = New GUYPUNCH1 gp\x = 500000 gp\y = 300 gp\image = GUYPUNCH gstbk.GUYSTANDBACK1 = New GUYSTANDBACK1 gstbk\x = 500000 gstbk\y = 300 gstbk\image = GUYSTAND While Not KeyDown (1);------ I'm trying to figure out how to have better control of the times in which some moves ; are performed when a key is pressed. That is, I'm trying to learn how to work with the timer. Cls DrawImage (first1\image,first1\x,first1\y) ;this is his stance BEFORE key 25 is pressed DrawImage (gshts\image,gshts\x,gshts\y) ;he immediately shouts when key (25) is pressed (first move). DrawImage (gp\image,gp\x,gp\y) ;he throws a punch 3 seconds AFTER key (25) is pressed (second move). DrawImage (gstbk\image,gstbk\x,gstbk\y) ; this is his (third move) AFTER key (25) is pressed (he goes to a stance and stays in it for 5 seconds) ; 5 seconds later (in his final move),he goes back To the FIRST drawing BEFORE key (25) is pressed. If KeyDown (25) Then ;Thus I was trying to figure out how to make the four things (drawings) happen after this key is pressed ;using the timer. EndIf If Not KeyHit (25) Then ;moves related to the above still happen after key(25) is released, ;I actually don't know if it's necesary to have this "If Not Keyhit (25)" ;command here. EndIf Flip Wend Last edited 2011 |
| ||
To answer your first question, if you want to manually draw the images instead of using frames, that should work ok without problems. If you're going to do this, however, you shouldn't draw the non-used images off the side of the screen. This probably takes up processing power, and if you get a lot of images for your character being drawn off screen, it might slow your game down. Instead, you should come up with a really good trigger system to do all sorts of stuff, and then only draw 1 image based on the trigger. Just a brief example: Global playerx# = 0.0 ;hold x location Global playery# = 0.0 ;hold y location Global standimage = LoadImage("Stand Image.png") ;the standing frame Global walkleftimage = LoadImage("Walk Left Image.png") ;the left walk frame Global walkrightimage = LoadImage("Walk Right Image.png") ;the right walk frame Global punchimage = LoadImage("Punch Image.png") ;the punch frame Global playersob$ ;make 1 string variable for your main character. "sob" stand for "state of being", in case anyone was wondering While Not KeyDown(1) ;MAIN LOOP Cls If KeyDown(LEFT_KEY) ;Can't remember the scancodes, but you get the idea... playersob$ = "walk left" ;state of being is now "walk left" EndIf If KeyDown(RIGHT_KEY) playersob$ = "walk right" ;state of being is now "walk lright" EndIf If Not KeyDown(LEFT_KEY) And Not KeyDown(RIGHT_KEY) playersob$ = "stand" EndIf If KeyDown(LEFT_KEY) And KeyDown(RIGHT_KEY) playersob$ = "stand" EndIf If KeyHit(SPACE_KEY) playersob$ = "punch" ;state if being is now "punch" EndIf Select playersob$ ;Here's what I mean by a trigger system. This will only draw 1 image based on the state of being Case "walk left" ;if playersob$ = "walk left" DrawImage(walkleftimage,playerx#,playery#) playerx# = playerx# - 0.1 Case "walk right" DrawImage(walkrightimage,playerx#,playery#) playerx# = playerx# + 0.1 Case "punch" DrawImage(punchimage,playerx#,playery#) Case "stand" DrawImage(standimage,playerx#,playery#) End Select Flip Wend With a good trigger system, you can handle a whole sequence of events just by changing playersob$. So, how would you make timing specific events occur? Use the same process, and this time, we're going to use Millisecs() for a timer. ;...same situation as above Select playersob$ Case "walk left" DrawImage(walkleftimage,playerx#,playery#) playerx# = playerx# - 0.1 Case "walk right" DrawImage(walkrightimage,playerx#,playery#) playerx# = playerx# + 0.1 Case "punch" DrawImage(punchimage,playerx#,playery#) punchtimer = Millisecs() ;here's where we start the timer... playersob$ = "punch wait" ;don't do anything else until the timer is done Case "punch wait" DrawImage(punchimage,playerx#,playery#) If Millisecs() >= punchtimer + 3000 ;if 3 seconds have gone by playersob$ = "punch return" punchtimer = Millisecs() ;start the timer again for the next phase EndIf Case "punch return" DrawImage(punchreturnimage,playerx#,playery#) If Millisecs() >= punchtimer + 5000 ;if 5 seconds have gone by playersob$ = "stand" EndIf Case "stand" DrawImage(standimage,playerx#,playery#) End Select ;... I know for a fact that there's some holes in the code, such as the left or right key will override the "punch" state of beings, but this just gives an example of how a trigger system works. It might be easier to stay organized if you use this in your game. |
| ||
Rob the Great, thanks. It worked. I'll continue working with the code you gave me. I think it works better than what I was working with. I'll come back if I have anymore questions. Last edited 2011 |