Microsoft Small Basic

Program Listing: 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()