probleme affichage boucle

probleme affichage boucle - VB/VBA/VBS - Programmation

Marsh Posté le 30-06-2006 à 09:22:04    

Bonjour, je suis débutant en VBA et je cherche un faire un ptit jeu, ici un pong pour essayer d'apprendre de facon assez ludique.
 
dans l'ensemble ca marche relativement bien (pas optimis je pense, et les rebonds sont pourris mais je vais essayer de faire mieux une fois un ptit probleme résolu.
 
donc j'ai fait une boucle type do... loop pour deplacer ma balle et scanner les touches clavier pour deplacement mes barres
probleme : qd je lance la macro, rien ne bouge.... j'appuie sur echap et ca fait planter ma macro (normal)
 
j'ai mis une pause de 0 sec (je sais pas pourquoi mais c comme ca ^^)
je relance rien ne bouge... j'appuie sur Echap pour quitter ma macro et pouf ca ne fait pas planter ma macro et mon jeu "fonctionne".
 
impossible de le faire fonctionner de telle maniere sans appuyer sur echap au prealable..
 
vu que je commence j'ai pas mal chercher à droite à gauche mais la j'ai vraiment plus d'idée donc je me toune vers vous :)
 
 
ci-joint mon code :

Code :
  1. Declare Function GetAsyncKeyState Lib "user32" (ByVal nKey As Integer) As Integer
  2. Dim longueur_barre As Long
  3. Dim diametre_balle As Long
  4. Dim vitX As Long
  5. Dim vitY As Long
  6. Dim posL As Long
  7. Dim posT As Long
  8. Dim pos_barre As Long
  9. Dim largeur As Long
  10. Dim longueur As Long
  11. Dim nb_ligne As Long
  12. Dim nb_colonne As Long
  13. Sub pause(tick)
  14. newHour = Hour(Now())
  15. newMinute = Minute(Now())
  16. newSecond = Second(Now())
  17. waitTime = TimeSerial(newHour, newMinute, newSecond)
  18. Application.Wait waitTime
  19. End Sub
  20. Sub init()
  21. 'définit des parametres
  22. largeur = 3300
  23. longueur = 5500
  24. longueur_barre = 1000
  25. diametre_balle = 75
  26. 'création de la barre A
  27. ActiveSheet.Shapes.AddShape(msoShapeRectangle, (longueur - longueur_barre) / 2, largeur - 3 * diametre_balle, longueur_barre, 30).Select
  28. Selection.ShapeRange.Fill.ForeColor.SchemeColor = 0
  29. Selection.Name = "barreA"
  30. 'création de la barre B
  31. ActiveSheet.Shapes.AddShape(msoShapeRectangle, (longueur - longueur_barre) / 2, 3 * diametre_balle, longueur_barre, 30).Select
  32. Selection.ShapeRange.Fill.ForeColor.SchemeColor = 0
  33. Selection.Name = "barreB"
  34. 'création de la balle
  35. ActiveSheet.Shapes.AddShape(msoShapeOval, (longueur - diametre_balle) / 2, largeur - 4 * diametre_balle, diametre_balle, diametre_balle).Select
  36. Selection.ShapeRange.Fill.ForeColor.SchemeColor = 0
  37. Selection.Name = "balle"
  38. End Sub
  39. Sub dessin()
  40. '
  41. ' dessin Macro
  42. ' Macro enregistrée le 26/06/2006 par HT06439
  43. debut:
  44. vitX = 0
  45. vitY = 0
  46. Call New_level
  47. Call init
  48. Do
  49. 'affichage
  50. temps = temps + 1
  51. Range("FM115" ).Value = ActiveSheet.Shapes("balle" ).Left
  52. Range("FJ128" ).Value = ActiveSheet.Shapes("balle" ).Top
  53. 'rebond bord
  54. If ActiveSheet.Shapes("balle" ).Left < 2 Or ActiveSheet.Shapes("balle" ).Left + diametre_balle > longueur Then
  55.     vitX = -vitX
  56. End If
  57. If ActiveSheet.Shapes("balle" ).Top < 2 Then
  58.     MsgBox "Joueur B gagne"
  59.     ActiveSheet.Shapes("barreA" ).Delete
  60.     ActiveSheet.Shapes("barreB" ).Delete
  61.     ActiveSheet.Shapes("balle" ).Delete
  62.     GoTo debut
  63. ElseIf ActiveSheet.Shapes("balle" ).Top + diametre_balle > largeur Then
  64.     MsgBox "Joueur B gagne"
  65.     ActiveSheet.Shapes("barreA" ).Delete
  66.     ActiveSheet.Shapes("barreB" ).Delete
  67.     ActiveSheet.Shapes("balle" ).Delete
  68.     GoTo debut
  69. End If
  70. 'rebond raquette A
  71. If ActiveSheet.Shapes("balle" ).Top + diametre_balle = ActiveSheet.Shapes("barreA" ).Top _
  72. And ActiveSheet.Shapes("balle" ).Left > ActiveSheet.Shapes("barreA" ).Left _
  73. And ActiveSheet.Shapes("balle" ).Left + diametre_balle < ActiveSheet.Shapes("barreA" ).Left + longueur_barre _
  74. And temps > 30 And vitY <> 0 Then
  75.     vitY = -vitY
  76.     'acceleration de la balle
  77.     If vitY < 0 Then
  78.         vitY = vitY - 0.5
  79.     Else
  80.         vitY = vitY + 0.5
  81.     End If
  82.     temps = 0
  83. End If
  84. 'rebond raquette B
  85. If ActiveSheet.Shapes("balle" ).Top + diametre_balle = ActiveSheet.Shapes("barreA" ).Top + diametre_balle _
  86. And ActiveSheet.Shapes("balle" ).Left > ActiveSheet.Shapes("barreA" ).Left _
  87. And ActiveSheet.Shapes("balle" ).Left + diametre_balle < ActiveSheet.Shapes("barreA" ).Left + longueur_barre _
  88. And temps > 30 And vitY <> 0 Then
  89.     vitY = -vitY
  90.     'acceleration de la balle
  91.     If vitY < 0 Then
  92.         vitY = vitY - 0.5
  93.     Else
  94.         vitY = vitY + 0.5
  95.     End If
  96.    
  97.     temps = 0
  98. End If
  99. 'deplacement balle
  100. ActiveSheet.Shapes("balle" ).IncrementLeft vitX
  101. ActiveSheet.Shapes("balle" ).IncrementTop vitY
  102. 'deplacement de la raquette A
  103.    
  104.     If (GetAsyncKeyState(76) <> 0 Or GetAsyncKeyState(77) <> 0 Or GetAsyncKeyState(32) <> 0) Then
  105.     'touche G pour aller à droite
  106.         If GetAsyncKeyState(77) <> 0 Then
  107.             ActiveSheet.Shapes("barreA" ).IncrementLeft 4
  108.             If vitX = 0 And vitY = 0 Then
  109.                 ActiveSheet.Shapes("balle" ).IncrementLeft 4
  110.             End If
  111.         End If
  112.     'touche F pour aller à gauche
  113.         If GetAsyncKeyState(76) <> 0 Then
  114.             ActiveSheet.Shapes("barreA" ).IncrementLeft -4
  115.             If vitX = 0 And vitY = 0 Then
  116.                 ActiveSheet.Shapes("balle" ).IncrementLeft -4
  117.             End If
  118.         End If
  119.     'position balle debut
  120.         If vitX = 0 And vitY = 0 Then
  121.             If GetAsyncKeyState(32) <> 0 Then
  122.                 vitX = 2
  123.                 vitY = 2
  124.             End If
  125.         End If
  126.     End If
  127.    
  128. 'deplacement de la raquette B
  129.    
  130.     If (GetAsyncKeyState(65) <> 0 Or GetAsyncKeyState(90) <> 0 Or GetAsyncKeyState(32) <> 0) Then
  131.     'touche G pour aller à droite
  132.         If GetAsyncKeyState(90) <> 0 Then
  133.             ActiveSheet.Shapes("barreB" ).IncrementLeft 4
  134.         End If
  135.     'touche F pour aller à gauche
  136.         If GetAsyncKeyState(65) <> 0 Then
  137.            ActiveSheet.Shapes("barreB" ).IncrementLeft -4
  138.         End If
  139.     'position balle debut
  140.         If vitX = 0 And vitY = 0 Then
  141.             If GetAsyncKeyState(32) <> 0 Then
  142.                 vitX = 2
  143.                 vitY = 2
  144.             End If
  145.         End If
  146.     End If
  147.     'pause (1)
  148. Loop
  149. End Sub
  150. Sub New_level()
  151. largeur = 3300
  152. longueur = 5500
  153. Worksheets(1).Shapes.SelectAll
  154. Selection.Delete
  155. 'création du cadre
  156. ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 0, longueur, largeur).Select
  157. 'création des briques
  158.  
  159. End Sub


 
 
merci d'avance
 
LaJlute
 

Reply

Marsh Posté le 30-06-2006 à 09:22:04   

Reply

Marsh Posté le 30-06-2006 à 09:31:19    

pour débuter, il y a d'autres jeux plus faciles ;)
je n'ai pas lu tout ton code, pardon, mais si il faut appuyer sur echap a chaque fois, et que ton jeu marche après, tu peux faire un sendkeys à la fin de ta macro...

Reply

Marsh Posté le 30-06-2006 à 09:42:29    

ben j'essaie surtout de comprendre pourquoi faut appuyer sur echap ^^
le but n'étant pas faire marcher mon jeu absolument mais de m'entrainer au VBA
 
merci qd même :)
 
Jlute

Reply

Marsh Posté le 30-06-2006 à 09:57:25    

ta sub main, c'est laquelle ? :sweat:

Reply

Marsh Posté le 30-06-2006 à 10:11:46    

dessin

Reply

Marsh Posté le 30-06-2006 à 10:13:41    

j'ai copié tout mon code, il y avait surement matiere à en mettre moins, n'hesitez pas à mettre des commentaires sur tout et n'importe koi :)... enfin un poil en relation avec mon histoire quand même ^^

Reply

Marsh Posté le 30-06-2006 à 10:44:04    

si tu incrémentes tes coordonnées de balle de 0 (vitX et vitY à 0 je crois), ta balle ne va pas bouger, initialise les à 0.5 ou 1 (je ne connais pas le pas de vitesse appliqué).

Reply

Marsh Posté le 30-06-2006 à 10:54:22    

les vitesse n'initialise lors d'un appuie sur la touche "espace" (ascii 32).
j'ai test de les initialiser à 1 mais ca ne change rien à mon programme :p
 
à mon avis, c un probleme de rafraichissement d'ecran, j'ai essayer updatescreen ca marche mais ca me fait le jeu n'avance plus du tout par rapport à lancer normal puis echap..
 

Reply

Marsh Posté le 30-06-2006 à 11:19:24    

n'y a -t-il pas d'autes méthodes que le GetAsyncKey... pour gérer les touches de claviers ?
l'ajout de la biblio user32 ca plante chez moi...

Reply

Marsh Posté le 30-06-2006 à 12:24:16    

si il en existe une autre, j'ai pas trouvé accessible dans pour vba.
 
Je suppose que la fonction getch() doit avoir une équivalence en vba
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed