Partager via


Small Basic: Exemple - Graphismes de Jeu (fr-FR)

Code

Importation dans Small Basic: ZGC128

'********************************************************************************************************
'Exemple de programme démontrant virtuellement toutes les commandes GraphicsWindow dans Small Basic
'Contient l'utilisation des Shapes, Images, Arrays, et contrôle Souris et Clavier
'Contient toutes les principales fonctions pour écrire des jeux en utilisant des exemples de base
'Vous devez examiner le code voir ce qu'il est sensé faire et comme c'est fait
'Jouez avec, changez le, cassez le et après corrigez le
'********************************************************************************************************
'
'Créé une fenêtre graphique
'
'Maintient la masquée jusqu'a ce que nous voulons l'afficher
GraphicsWindow.Hide()
' Fourni un titre
GraphicsWindow.Title = "Exemple de la Fenêtre Graphique"
'Défini la taille et la position (utilise des variables gw et gh car elles seront utiles plus tard)
gw = 800
gh = 600
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
'Défini le haut et la gauche à 4 pixels se qui positionne la fenêtre près du coin supérieur gauche de l'écran
GraphicsWindow.Top = 4
GraphicsWindow.Left = 4
'Définie la couleur de fond
GraphicsWindow.BackgroundColor = "LightBlue"
'Indique qu'on ne peut pas redimensionner la fenêtre
GraphicsWindow.CanResize = "False"
'Affiche la fenêtre
GraphicsWindow.Show()
'Goto end
'
'Créé une balle rouge d'un diamètre 50 (rayon de 25) et la place au millieu de la fenêtre (et on attend 5 seccondes)
'
radius = 25
GraphicsWindow.BrushColor = "Red"
GraphicsWindow.PenColor = "Black"
' On défini la position à (centre de l'écran - rayon), car la position à l'écran correspond au coin supérieur gauche de la balle
ball = Shapes.AddEllipse(2*radius,2*radius)
Shapes.Move(ball,gw/2-radius,gh/2-radius)
Program.Delay(5000) ' 5000 millisecondes = 5 secondes
'
'Déplace la balle aléatoirement avec animation 10 fois (une fois par seconde)
'
For i =  1 To 10
  x = Math.GetRandomNumber(gw)
  y = Math.GetRandomNumber(gh)
  Shapes.Animate(ball,x-radius,y-radius,1000)
  Program.Delay(1000) ' Nous devons patienter (pause) pour attendre pour que l'animation pour finir
EndFor
'
'Déplace la balle pour suivre la souris pendant 10 secondes
'
start = Clock.Second
time = 0
While (time  < 10)
  xm = GraphicsWindow.MouseX
  ym = GraphicsWindow.MouseY
  Shapes.Move(ball,xm-radius,ym-radius)
  time = Clock.Second - start
  'Si nous dépassons la minute alors les secondes reviennent à 0 donc on ajoute 60 secondes
  If (time  < 0) Then
    time = time+60
  EndIf
  'Affiche les coordonnées de la souris - on écrase la dernière position
  GraphicsWindow.PenColor = GraphicsWindow.BackgroundColor
  GraphicsWindow.BrushColor = GraphicsWindow.BackgroundColor
  GraphicsWindow.FillRectangle(gw-120,10,120,30)
  GraphicsWindow.BrushColor = "Black"
  GraphicsWindow.FontSize = 20
  GraphicsWindow.DrawText(gw-120,10,"("+xm+","+ym+")")
EndWhile
'
'Utilise 10 balles et déplace celle qui est sélectionnée par un aooui du bouton gauche de la souris (on supprime avec le bouton droit)
'On exécute jusqu'a ce que toutes les balles soient supprimées
'Les balles déplacées changent de couleur
'
GraphicsWindow.Clear()
'Création d'un tableau de 10 balles avec leurs positions aléatoires
nball = 10
For i =  1 To nball
  GraphicsWindow.BrushColor = "LightGreen"
  GraphicsWindow.PenColor = "Black"
  x[i] = radius  + Math.GetRandomNumber(gw-2*radius)
  y[i] = radius  + Math.GetRandomNumber(gh-2*radius)
  ball = Shapes.AddEllipse(2*radius,2*radius)
  Shapes.Move(ball,x[i]-radius,y[i]-radius)
  balls[i] = ball
EndFor
start = Clock.Second
iball = 0
While (nball  > 0)
  If (Mouse.IsLeftButtonDown = "True") Then
    xm = GraphicsWindow.MouseX
    ym = GraphicsWindow.MouseY
    'If no ball selected, then check if we are over one
    'Si aucune balle n'est sélectionnée, alors on détermine si il en reste encore au moins une
    If (iball  = 0) Then
      For i =  1 To nball
        If (xm  >= x[i]-radius And xm  <= x[i]+radius And ym  >= y[i]-radius And ym  <= y[i]+radius) Then
          iball = i
          'Pour changer la couleur nous supprimons la balle et on la remplace avec une nouvelle balle
          GraphicsWindow.BrushColor = "Pink"
          Shapes.Remove(balls[iball])
          balls[iball] = Shapes.AddEllipse(2*radius,2*radius)
          'Nous avons fini et nous ne voulons plus continuer de vérifier car nous avons déjà supprimé une balle alors on arrête la boucle
          Goto completed1
        EndIf
      EndFor
    EndIf
    completed1:
    'Déplace la balle sélectionnée
    If (iball  > 0) Then
      ball = balls[iball]
      x[iball] = xm
      y[iball] = ym
      Shapes.Move(ball,x[iball]-radius,y[iball]-radius)
    EndIf
  Else
    'On supprime la balle en cours
    iball = 0
  EndIf
  'Supprime une balle avec la clic droit
  If (Mouse.IsRightButtonDown = "True") Then
    xm = GraphicsWindow.MouseX
    ym = GraphicsWindow.MouseY
    For i =  1 To nball
      If (xm  >= x[i]-radius And xm  <= x[i]+radius And ym  >= y[i]-radius And ym  <= y[i]+radius) Then
        'Supprime l'objet affiché
        Shapes.Remove(balls[i])
        'Maintenant supprime l'élément i du tableau - nous faisons celà pour l'écraser avec les balles qui se trouve toujours plus haut dans le tableau
        For j =  i To nball-1
          balls[j] = balls[j+1]
          x[j] = x[j+1]
          y[j] = y[j+1]
        EndFor
        'Supprime la dernière balle (maintenant déplace tout le tableau vers le haut d'une place)
        balls[nball] = ""
        x[nball] = ""
        y[nball] = ""
        'Réduit le nombre de balles
        nball = nball-1
        'Nous avons terminé et ne voulons pas continuer de vérifier car nous avons déjà supprimé une balle donc c'est la fin de la boucle
        Goto completed2
      EndIf
    EndFor
  EndIf
  completed2:
EndWhile
'
'Remplace la balle avec une image et on la déplace avec les touches fléchées pour 20 secondes
'
'Supprime la dernière balle et en défini une nouvelle comme une image téléchargement - on récupère son rayon
GraphicsWindow.Clear()
image = ImageList.LoadImage("http://icons.iconarchive.com/icons/icons-land/metro-raster-sport/64/Soccer-Ball-icon.png")
ball = Shapes.AddImage(image)
radius = ImageList.GetWidthOfImage(image)/2
'Défini les variables pour indiquer si une touche et appuyée ou pas
keyLeft  = 0
keyRight  = 0
keyUp = 0
keyDown  = 0
'Défini un événement pour keydown et keyup
GraphicsWindow.KeyDown = OnKeyDown
GraphicsWindow.KeyUp = OnKeyUp
'Utilise l'événement pour définir les indicateurs d'appui de touche - ils sont seulement appelés quand une touche est appyée ou relâchée
Sub OnKeyDown
  key = GraphicsWindow.LastKey
  If (key  = "Left") Then
    keyLeft = 1
  ElseIf (key  = "Right") Then
    keyRight = 1
  ElseIf (key  = "Up") Then
    keyUp = 1
  ElseIf (key  = "Down") Then
    keyDown = 1
  EndIf
EndSub
Sub OnKeyUp
  key = GraphicsWindow.LastKey
  If (key  = "Left") Then
    keyLeft = 0
  ElseIf (key  = "Right") Then
    keyRight = 0
  ElseIf (key  = "Up") Then
    keyUp = 0
  ElseIf (key  = "Down") Then
    keyDown = 0
  EndIf
EndSub
'Démarre au centre de la fenêtre
x = gw/2
y = gh/2
start = Clock.Second
time = 0
While (time  < 20)
  'Modifie la position si une touche est actuellement appuyée
  If (keyLeft  = 1) Then
    x = x-1
  EndIf
  If (keyRight  = 1) Then
    x = x+1
  EndIf
  If (keyUp  = 1) Then
    y = y-1 ' The pixes for the window increase downwards from the top
  EndIf
  If (keyDown  = 1) Then
    y = y+1
  EndIf
  'Vérifie que la balle quitte l'écran - la fait réapparaître de l'autre côté
  If (x < 0) Then
    x = gw
  EndIf
  If (x > gw)  Then
    x = 0
  EndIf
  If (y < 0) Then
    y = gh
  EndIf
  If (y > gh)  Then
    y = 0
  EndIf
  'Déplace la balle vers la nouvelle position
  Shapes.Move(ball,x-radius,y-radius)
  'Fait une petite pause - l'ordinateur est trop rapide - ce qui contrôle la fréquence de rafraichissement (images par secondes)
  'Ce n'est pas un vrai FPS (Frame Per Second ou Image Par Seconde) étant donné que l'on ne calcul pas le temps de dessin
  fps = 500
  Program.Delay(1000/fps)
  time = Clock.Second - start
  'Si nous ne dépassons pas la minute alors nous ajoutons 60 secondes
  If (time  < 0) Then
    time = time+60
  EndIf
EndWhile
'
'Maintenant nous utilisons les touches fléchée pour accélérer la balle et nous l'exécutons jusqu'à toucher 50 fois les murs (presque le même code)
'Nous pouvons garder les événements clavier inchangés
'Inverse la rotation de la balle lorsqu'on atteind une limite
'
'Démarre au centre de la fenêtre
x = gw/2
y = gh/2
'Vitesse initial à Zéro
u = 0
v = 0
start = Clock.Second
spin = 0.0 'Fréquence de rotation (Positive est inverse au sens des aiguilles d'une montre)
angle = 0
hits = 0
While (hits  < 50)
  'Change la position si une touche est actuellement appuyé
  If (keyLeft  = 1) Then
    u = u-1
  EndIf
  If (keyRight  = 1) Then
    u = u+1
  EndIf
  If (keyUp  = 1) Then
    v = v-1 ' The pixes for the window increase downwards from the top
  EndIf
  If (keyDown  = 1) Then
    v = v+1
  EndIf
  'Change la position - divise par 500 pour éviter que l'accélération ne soit trop grande
  'nous pouvons provoquer la gravité, friction, etc ici si nous voulons
  x = x+u/500
  y = y+v/500
  'Vérifie que la balle ne quitte pas l'écran - on fait rebonodir la balle - et on la fait pivoter
  If (x < radius)  Then
    u = -u
    spin = spin+v
    hits = hits+1
  EndIf
  If (x > gw-radius) Then
    u = -u
    spin = spin-v
    hits = hits+1
  EndIf
  If (y < radius)  Then
    v = -v
    spin = spin-u
    hits = hits+1
  EndIf
  If (y > gh-radius) Then
    v = -v
    spin = spin+u
    hits = hits+1
  EndIf
  'Déplace la balle à la nouvelle position
  Shapes.Move(ball,x-radius,y-radius)
  'Pivote la balle avec la direction de rotation en cours
  Shapes.Rotate(ball,angle)
  angle = angle+0.001*spin
  'Fait une petite pause - l'ordinateur est trop rapide - ce qui contrôle la fréquence de rafraichissement (images par secondes)
  'Ce n'est pas un vrai FPS (Frame Per Second ou Image Par Seconde) étant donné que l'on ne calcul pas le temps de dessin
  fps = 500
  Program.Delay(1000/fps)
EndWhile
'
'Créé un tableau de 10 rectangles de taille, couleur et rotation aléatoires, et supprime les lorsqu'on clic dessus avec la souris
'
GraphicsWindow.Clear()
'Créé le tableau de rectangles et leur positions et tailles
For i =  1 To 10
  x[i] = 20+Math.GetRandomNumber(gw-60) ' On ne place pas au bord de l'écran
  y[i] = 20+Math.GetRandomNumber(gh-60)
  w[i] = 10+Math.GetRandomNumber(30)
  h[i] = 10+Math.GetRandomNumber(30)
  GraphicsWindow.BrushColor = GraphicsWindow.GetRandomColor()
  GraphicsWindow.PenColor = "Black"
  box = Shapes.AddRectangle(w[i],h[i])
  'A noter que x[i],y[i] sont le coin supérieur gauche du rectangle, pas son centre
  Shapes.Move(box,x[i],y[i])
  boxes[i] = box
  display[i] = 1  ' indicateur pour afficher le rectangle
EndFor
'Démarre un événement de clic souris
GraphicsWindow.MouseDown = OnMouseDown
'Défini l'événement de clic souris pour obtenir les coordonnées de la souris le clic et l'indicateur indiquant que la souris a été cliquée
clicked  = 0
Sub OnMouseDown
  xm = GraphicsWindow.MouseX
  ym = GraphicsWindow.MouseY
  clicked = 1
EndSub
'Continue tant qu'il reste des rectangles
nboxes = Array.GetItemCount(boxes)
angle = 0
While (nboxes  > 0)
  'La souris a été cliquée
  If (clicked  = 1) Then
    'Check each box
    For i =  1 To Array.GetItemCount(boxes)
      'Ne traite que les rectangles affichés
      If (display[i] = 1) Then
        box = boxes[i]
        'Comme les rectangles pivotent on utilise la taille maximale pour déterminer la région du clic
        'C'est n'est pas totalement exact pour les rectangles en rotation, mais souvent dans les jeux l'efficacité et plus important qu'une exactitude absolue
        dmax = Math.Max(w[i],h[i])
        If (xm  >= x[i] And xm  <= x[i]+dmax And ym  >= y[i] And ym  <= y[i]+dmax) Then
          'Supprime le rectangle de l'affichage et réduit le nombre de rectangles de 1
          'A noter que les tableaux originaux ne sont pas effacé car nous suivons l'état du rectangle avec display[i]
          Shapes.Remove(box)
          nboxes = nboxes-1
          display[i] = 0
          Sound.PlayClick()
        EndIf
      EndIf
    EndFor
    'Réinitialise l'indicateur de clic à "off" car nous avons tout fait avec
    clicked = 0
  EndIf
  'Pivote les rectangles (
  'Rotate the boxes (i pair sens inverse des aiguilles d'une montre, i impair sens des aiguilles d'une montre - angle négatif)
  For i =  1 To Array.GetItemCount(boxes)
    If (display[i] = 1) Then
      box = boxes[i]
      Shapes.Rotate(box,angle*(1-2*Math.Remainder(i,2)))
    EndIf
  EndFor
  angle = angle+1
  Program.Delay(10) 'Petit délai pour garder la rotation sans saccades
EndWhile
'
'On termine
'
end:
image = ImageList.LoadImage("http://www.windowswiki.info/wp-content/uploads/smallbasic_logo.png")
GraphicsWindow.Clear()
GraphicsWindow.FontSize = 58
GraphicsWindow.FontBold = "True"
GraphicsWindow.FontName = "Rockwell"
GraphicsWindow.DrawResizedImage(image,0,0,gw,gh)
R = 255
G = 0
B = 0
dR = -1
dG = 2
dB = 3
clicked  = 0
While (clicked  = 0)
  'Modifie les composantes rouge, verte, bleu de la couleur a différetes fréquences pour obtenir un changement des couleurs
  If (R < 0 Or  R > 255) Then
    dR = -dR
    R = R+dR
  EndIf
  If (G < 0 Or  G > 255) Then
    dG = -dG
    G = G+dG
  EndIf
  If (B < 0 Or  B > 255) Then
    dB = -dB
    B = B+dB
  EndIf
  colour = GraphicsWindow.GetColorFromRGB(R,G,B)
  GraphicsWindow.BrushColor = colour
  GraphicsWindow.DrawText(200,160,"C'est terminé")
  GraphicsWindow.DrawText(100,340,"Cliquer pour Quitter")
  GraphicsWindow.PenWidth = 10
  GraphicsWindow.PenColor = colour
  GraphicsWindow.DrawLine(50,gh-50,gw-50,gh-50)
  GraphicsWindow.DrawLine(gw-50,gh-50,gw-50,50)
  GraphicsWindow.DrawLine(gw-50,50,50,50)
  GraphicsWindow.DrawLine(50,50,50,gh-50)
  R = R+dR
  G = G+dG
  B = B+dB
  Program.Delay(20)
EndWhile
 
Program.End()
 

Voir Aussi

Autres Langues