Something happening once in an if/while statement?
Blitz3D Forums/Blitz3D Beginners Area/Something happening once in an if/while statement?
| ||
So like, if i have a sound loaded, and i want to play it in an if statement but that if statement is true, what would i do? Thanks |
| ||
Check the channel with ChannelPlaying before doing PlaySound. |
| ||
But what if I don't a death sound to play until it's time? |
| ||
It sounds like your logic is flawed. You are the one who decides when something dies and needs to play a sound or whatever. I suggest looking into State Machines, which would help with this. |
| ||
I suggest looking into State Machines, which would help with this. It certainly would not help if you are struggling with the playing a sound. What a rediculous piece of advice! Let's assume you've loaded your sound .. Global SOUNDdead = Loadsound( "../MyDeathSound.wav") Global CHANNELdead It's always a good idea to check it's loaded by checking if SOUNDdead > 0. e.g. If SOUNDdead = 0 Runtimeerror "Failed to load sound" End Endif Assume you have a character who has 100% Health defined like so: Global Health = 100 You would reduce the heath when hurt. It's up to you to decide what circumstances result in loss of health. Once this is reduced to zero you would then play the dead sound: If MyCharacterIsHurt then Health = Health - 5 If Health = 0 then CHANNELdead = Playsound( SOUNDdead) Endif Endif Blitz will automatically assign the next availble sound channel to ChannelDead. Something along these lines. Stevie |
| ||
It certainly would not help if you are struggling with the playing a sound. What a rediculous piece of advice! A state machine isnt some advanced programing topic, its something we do implicitly everywhere, even your example above with MyCharacterIsHurt is a state, though a boolean one. I suspect he is doing everything at once, having NO state at all. Reading about statemachines and how they work will give insight into how to handle state in general. IMO. |
| ||
Fair enough. I assumed you were talking about coding some full blown FSM which would be pretty advanced for someone struggling with the simplest logic. Like you, I took a guess - you are probably correct. |
| ||
pseudocode if character has just died play sound 'character died' endif ... to check if character has just died as opposed to is dead (as you don't want sound playing over and over while the hitpoints are less than or equal to zero): if character hitpoints <= 0 and character hitpoints on previous frame > 0 character has just died endif |
| ||
A "death" is an event. You want to do something when that happens --like playing a sound-- and then move on, not playing that sound anymore until another death happens. In case that sound keeps playing then you know that something is wrong with your logic. Touching an enemy, crossing the screen, the health hitting zero, pressing a key. These are all events. |
| ||
Yeah but like when a statement is true it just keeps playing the sound a bunch of times at once |
| ||
There's alot of ways to skin a cat, this is one ...Global SOUNDdead = loadsound( ... ) Global CHANNELdead Const PS_ALIVE = 1 Const PS_DEAD = 2 Const PS_RESPAWN = 3 Global PLAYER_STATE = PS_ALIVE Global PLAYER_HEALTH = 100 Select PLAYER_STATE case PS_ALIVE {Movement / shooting / damage etc..} If PLAYER_HEALTH <= 0 PLAYER_STATE = PS_DEAD Endif case PS_DEAD CHANNELdead = Playsound( SOUNDdead) PLAYER_STATE = RESPAWN case PS_RESPAWN {Reset health, position etc.. } PLAYER_STATE = ALIVE PLAYER_HEALTH = 100 End Select |