Page 1 sur 2
Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 18:08
par venom
Bonjour,
voilà une chose simple que je n'arrive pas a faire :
j'ai un sprit de 100x100 je souhaiterais le déplacer de 100 en 100 dans l'axe des x
en gros qu'il va de 0 a 800 de 100 en 100. Sa j'y arrive, mais la ou je n'y arrive pas c'est que si je reste appuyer sur la touche du clavier il défile a vitesse rapide

moi je voudrais un relâchement obligatoire entre 2 action de touches.
j'ai essayé de bidouiller un truck avec
KeyboardReleased(IdentifiantTouche) mais sans succees

.
j'espère m'avoir fait comprendre.
@++
Re: Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 18:35
par SPH
donne ton code qui marche pas. Je pense savoir comment on fait mais je ne sais pas si on parle de la meme chose
Re: Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 18:45
par G-Rom
Avec un Flag !
Code : Tout sélectionner
if Keyboardpushed(...)<>0 And Flag_Makey = 0
Flag_Makey = 1
Action
endif
if Keyboardpushed(...)=0
Flag_Makey = 0
endif
@+
Re: Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 19:03
par venom
oui désolé je met pas le code sa va aller moins bien
Code : Tout sélectionner
Enumeration
#pion
EndEnumeration
If InitKeyboard() = 0 Or InitSprite() = 0
MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
End
EndIf
If OpenScreen(800, 600, 16, "")
x = 355
y = 0
LoadSprite(#pion, "C:/pion.bmp", 0)
EndIf
Repeat
FlipBuffers()
ClearScreen(RGB(0,0,0))
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
If x > 70
x-5
EndIf
If x < 75
x = 75
EndIf
EndIf
If KeyboardPushed(#PB_Key_Right)
If x = 710
x = 710
ElseIf x < 710
x+5
EndIf
EndIf
If KeyboardPushed(#PB_Key_Down)
y=510
EndIf
DisplaySprite(#pion, x, y)
Until KeyboardPushed(#PB_Key_Escape)
End
des flags kesako sa
@++
Re: Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 20:11
par Backup
chez moi ceci marche ! (sous Linux !)
Code : Tout sélectionner
Enumeration
#pion
EndEnumeration
If InitKeyboard() = 0 Or InitSprite() = 0
MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
End
EndIf
If OpenScreen(800, 600, 16, "")
x = 355
y =100
; LoadSprite(#pion, "C:/pion.bmp", 0)
CreateSprite(#pion,100,100)
StartDrawing(SpriteOutput(#pion))
Circle(50,50,50)
StopDrawing()
EndIf
Repeat
KeyboardMode(#PB_Keyboard_International)
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Left)
x=x-100
If x<0:x=0:EndIf
EndIf
If KeyboardReleased(#PB_Key_Right)
x=x+100
If x>700:x=700:EndIf
EndIf
If KeyboardReleased(#PB_Key_Down)
y=510
EndIf
DisplaySprite(#pion, x, y)
FlipBuffers()
ClearScreen(RGB(0,0,0))
Until KeyboardPushed(#PB_Key_Escape)
End
Re: Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 20:21
par G-Rom
Dobro a écrit :chez moi ceci marche ! (sous Linux !)
on doit pas avoir la même definition du verbe marcher
Avec des flags :
Code : Tout sélectionner
Enumeration
#pion
EndEnumeration
If InitKeyboard() = 0 Or InitSprite() = 0
MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
End
EndIf
If OpenScreen(800, 600, 16, "")
x=300
y=100
; LoadSprite(#pion, "C:/pion.bmp", 0)
CreateSprite(#pion,100,100)
StartDrawing(SpriteOutput(#pion))
For r = 1 To 50
G = r * 255 / 50
Circle(50,50,50-r,RGB(G,G,G))
Next
StopDrawing()
EndIf
KeyboardMode(#PB_Keyboard_International)
Repeat
ClearScreen(0)
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left) And flag_left = 0
flag_left = 1
x-100
If x<0:x=0:EndIf
EndIf
If KeyboardPushed(#PB_Key_Left)=0 And flag_left = 1
flag_left = 0
EndIf
If KeyboardPushed(#PB_Key_Right) And flag_right = 0
flag_right = 1
x+100
If x>700:x=700:EndIf
EndIf
If KeyboardPushed(#PB_Key_Right)=0 And flag_right = 1
flag_right = 0
EndIf
If KeyboardPushed(#PB_Key_Down) And flag_down = 0
flag_down = 1
y+100
If y>500 : y=500 : EndIf
EndIf
If KeyboardPushed(#PB_Key_Down)=0 And flag_down = 1
flag_down = 0
EndIf
If KeyboardPushed(#PB_Key_Up) And flag_up = 0
flag_up = 1
y-100
If y<0 : y=0 : EndIf
EndIf
If KeyboardPushed(#PB_Key_Up)=0 And flag_up = 1
flag_up = 0
EndIf
DisplaySprite(#pion, x, y)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
Re: Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 20:39
par venom
en effet Dobro ton code plante chez moi aussi
@G-Rom
Merci pour ton exemple je rechercher effectivement ce genre de réponse.
Pourtant le code de Dobro est beaucoup plus court et d'après lui sa fait le même
Bref je ne suis pas la pour sa. n'empêche que je voyer sa plus court quand même genre une fonction lier a purebaisc par exemple
je vais étudier tout cela merci.
@++
Re: Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 20:40
par SPH
Regarde. Tu declare ca avant ta boucle :
Et tu fais comme ca. Examine bien le mecanisme :
Code : Tout sélectionner
If KeyboardPushed(#PB_Key_Left)
If left=0
left=1
If x > 70
x-5
EndIf
If x < 75
x = 75
EndIf
EndIf
Else
left=0
EndIf
Re: Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 20:57
par G-Rom
plus court , plus simple :
Tu redefinis en quelque sorte la fonction KeyboardPushed() :
Code : Tout sélectionner
Global NewMap KeyFlag.b()
Procedure.b KeyboardPushedEX(Const.i)
If KeyboardPushed(Const) And KeyFlag(Str(Const)) = 0
KeyFlag(Str(Const)) = 1
ProcedureReturn #True
EndIf
If KeyboardPushed(Const)=0 And KeyFlag(Str(Const)) = 1
KeyFlag(Str(Const)) = 0
EndIf
ProcedureReturn #False
EndProcedure
et tu l'utilises :
Code : Tout sélectionner
Enumeration
#pion
EndEnumeration
Global NewMap KeyFlag.b()
Procedure.b KeyboardPushedEX(Const.i)
If KeyboardPushed(Const) And KeyFlag(Str(Const)) = 0
KeyFlag(Str(Const)) = 1
ProcedureReturn #True
EndIf
If KeyboardPushed(Const)=0 And KeyFlag(Str(Const)) = 1
KeyFlag(Str(Const)) = 0
EndIf
ProcedureReturn #False
EndProcedure
If InitKeyboard() = 0 Or InitSprite() = 0
MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
End
EndIf
If OpenScreen(800, 600, 16, "")
x=300
y=100
; LoadSprite(#pion, "C:/pion.bmp", 0)
CreateSprite(#pion,100,100)
StartDrawing(SpriteOutput(#pion))
For r = 1 To 50
G = r * 255 / 50
Circle(50,50,50-r,RGB(G,G,G))
Next
StopDrawing()
EndIf
KeyboardMode(#PB_Keyboard_International)
Repeat
ClearScreen(0)
ExamineKeyboard()
If KeyboardPushedEX(#PB_Key_Left)
flag_left = 1
x-100
If x<0:x=0:EndIf
EndIf
If KeyboardPushedEX(#PB_Key_Right)
flag_right = 1
x+100
If x>700:x=700:EndIf
EndIf
If KeyboardPushedEX(#PB_Key_Down)
flag_down = 1
y+100
If y>500 : y=500 : EndIf
EndIf
If KeyboardPushedEX(#PB_Key_Up)
flag_up = 1
y-100
If y<0 : y=0 : EndIf
EndIf
DisplaySprite(#pion, x, y)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
@+

Re: Déplacer, Bloquer, Relacher
Publié : mar. 01/juin/2010 23:48
par Backup
non non ! rectification le code que j'ai posté fonctionne bien sous Linux !
au debut j'avais pensé a un bug, mais c'est parceque j'avais laissé Pushed a la touche left !
mais j'ai corrigé , en mettant tout en released , ça marche bien ... (j'avais réédité mon code..

)
ce code fonctionne sous Linux !!
Code : Tout sélectionner
Enumeration
#pion
EndEnumeration
If InitKeyboard() = 0 Or InitSprite() = 0
MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
End
EndIf
If OpenScreen(800, 600, 16, "")
x = 355
y =100
; LoadSprite(#pion, "C:/pion.bmp", 0)
CreateSprite(#pion,100,100)
StartDrawing(SpriteOutput(#pion))
Circle(50,50,50)
StopDrawing()
EndIf
Repeat
KeyboardMode(#PB_Keyboard_International)
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Left)
x=x-100
If x<0:x=0:EndIf
EndIf
If KeyboardReleased(#PB_Key_Right)
x=x+100
If x>700:x=700:EndIf
EndIf
If KeyboardReleased(#PB_Key_Down)
y=510
EndIf
DisplaySprite(#pion, x, y)
FlipBuffers()
ClearScreen(RGB(0,0,0))
Until KeyboardPushed(#PB_Key_Escape)
End
Re: Déplacer, Bloquer, Relacher
Publié : mer. 02/juin/2010 5:37
par venom
Sous windows ton code ne fonctionne pas.
Je suis même obliger de faire Ctrl+alt+supp pour quitter
@++
Re: Déplacer, Bloquer, Relacher
Publié : mer. 02/juin/2010 7:39
par G-Rom
Avec mon code

?
Re: Déplacer, Bloquer, Relacher
Publié : mer. 02/juin/2010 7:46
par SPH
Franchement, ca, c'est tres tres court et ca marche :
Code : Tout sélectionner
If KeyboardPushed(#PB_Key_Left)
If left=0
left=1
Beep_(1000,5)
EndIf
Else
left=0
EndIf
Re: Déplacer, Bloquer, Relacher
Publié : mer. 02/juin/2010 8:26
par G-Rom
Plus court ma procédure :
Code : Tout sélectionner
Global NewMap KeyFlag.b()
Procedure.b KeyboardPushedEX(Const.i)
If KeyboardPushed(Const) And KeyFlag(Str(Const)) = 0
KeyFlag(Str(Const)) = 1
ProcedureReturn #True
EndIf
If KeyboardPushed(Const)=0 And KeyFlag(Str(Const)) = 1
KeyFlag(Str(Const)) = 0
EndIf
ProcedureReturn #False
EndProcedure
tu n'a plus qu'a appeler cette fonction après :
elle fait exactement ceci ( sans le bip bien sur ^^ ):
Code : Tout sélectionner
If KeyboardPushed(#PB_Key_Left)
If left=0
left=1
Beep_(1000,5)
EndIf
Else
left=0
EndIf
car tu es obligé d'avoir une variable par touche , ici left...
le code deviendra vite lourd

Re: Déplacer, Bloquer, Relacher
Publié : mer. 02/juin/2010 8:33
par SPH
Il y a une legere difference G-rom : mon code fait un seul test par boucle. Le tiens en fait 2 (4 meme !) constament. J'AIIIIIIME les choses optimisé
C'est une broutille hein, mais j'arrive pas a me séparer du mot "rapidité" a chaque fois que je code
edit : je viens de faire des tests et ma routine est plus rapide de peut etre 20%