C'est un scrolling multi directionnel qui utilise la technique des tiles, une technique très utilisé sur amiga classique pour optimiser les moteurs de jeux. Se scrolling est facilement adaptable pour créer un scrolling vertical et horizontale
Vous dirigez un triangle rouge, touche flèche vers le haut pour avancer, touche flèche droite et gauche pour la rotation et touche flèche vers le bas pour reculer.
Il est également possible de modifier la gestion de déplacement de la brosse triangulaire, ici on applique une méthode de rotation de la brosse afin de lui donner un angle pour son déplacement, mais on peux simplifier le déplacement pour le rendre plus simple, ex: touche gauche => va a gauche, touche droite => va a droite etc...
On utilise un tableau à 2 dimensions pour créer un circuit (il est possible d'enregistrer les données dans un fichier), attention, un tableau est rapide dans toutes les configurations que SI la taille de celui ci est défini dès la départ par la commande Dim, déclarer un tableau par T={} ralentira votre programme, ajouter des lignes dans un tableaux existant fera ralentir les accès à celui ci car il n'est pas formater en mémoire
On affiche que le nombre de tiles (tuile, ou plutôt brosse) nécessaire à l'écran et non toute la carte se qui diminue de beaucoup la taille des 2 boucles d'affichage de la carte
Aller, voici le code
Code: Select all
@SCREEN {Mode="Ask",Width=640, Height=480, depth=16}
SetFillStyle(#FILLCOLOR)
CreateBrush (1,32,32,$000000)
SelectBrush(1)
Polygon (0,0,{32,16,0,32,0,0},3,$FF0000)
EndSelect
CreateBrush (2,32,32,$000000)
SelectBrush(2)
Box (0,0,32,32,$00AA00)
EndSelect
CreateBrush (3,32,32,$000000)
SelectBrush(3)
Box (0,0,32,32,$555555)
EndSelect
CreateBrush (4,32,32,$000000)
SelectBrush(4)
Box (0,0,32,16,$00AA00)
Box (0,16,32,32,$555555)
EndSelect
CopyBrush (4,5)
RotateBrush(5,-90)
CopyBrush (4,6)
RotateBrush(6,90)
CopyBrush (4,7)
RotateBrush(7,180)
SetBrushTransparency(1,$000000)
Dim Circuit[30][30]
Circuit[0]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}
Circuit[1]={2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2}
Circuit[2]={2,6,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,2}
Circuit[3]={2,6,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,2}
Circuit[4]={2,6,3,3,2,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,2,3,3,5,2}
Circuit[5]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[6]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[7]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[8]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[9]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[10]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[11]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[12]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[13]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[14]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[15]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[16]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[17]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[18]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[19]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[20]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[21]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[22]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[23]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[24]={2,6,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,3,3,5,2}
Circuit[25]={2,6,3,3,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,3,3,5,2}
Circuit[26]={2,6,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,2}
Circuit[27]={2,6,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,2}
Circuit[28]={2,2,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,2,2}
Circuit[29]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}
X=0
Y=0
Angle=0
vitesse=0
XVoiture=320
YVoiture=240
Voiture = 1
SetFontStyle(#EDGE, #BLACK, 1)
Function supercar()
StartTimer(1)
Flip
Local Avance = IsKeyDown("UP")
Local Recule = IsKeyDown("Down")
Local Droite = IsKeyDown("RIGHT")
Local Gauche = IsKeyDown("LEFT")
Local ToucheA = IsKeyDown("a")
Local ToucheB = IsKeyDown("z")
If Avance = True
Vitesse=vitesse+0.5
If vitesse>6 Then vitesse=6
Else
If vitesse>0 Then vitesse=vitesse-0.3
EndIf
If Recule = True
Vitesse=vitesse-1
If vitesse<-3 Then vitesse=-3
Else
If vitesse<0 Then vitesse=vitesse+0.2
EndIf
If vitesse>0 And vitesse<0.1 Then vitesse=0
Radians=Angle*0.01745
If XVoiture=320 Then X=X+Cos(Radians)*vitesse
If YVoiture=240 Then Y=Y-Sin(Radians)*vitesse
;Blocage du scroll
If x>320 Then X=320
If X=320
XVoiture=Xvoiture+Cos(Radians)*vitesse
If XVoiture>600 Then XVoiture=600
If XVoiture<320 Then XVoiture=320
EndIf
If X<0 Then X=0
If X=0
XVoiture=Xvoiture+Cos(Radians)*vitesse
If XVoiture<40 Then XVoiture=40
If XVoiture>320 Then XVoiture=320
EndIf
If Y<0 Then Y=0
If Y=0
YVoiture=Yvoiture-Sin(Radians)*vitesse
If YVoiture<40 Then YVoiture=40
If YVoiture>240 Then YVoiture=240
EndIf
If Y>(29*32)/2 Then Y=(29*32)/2
If Y=(29*32)/2
YVoiture=Yvoiture-Sin(Radians)*vitesse
If YVoiture>440 Then YVoiture=440
If YVoiture<240 Then YVoiture=240
EndIf
; Si la voiture ne roule pas, elle ne tourne pas
If vitesse<>0
If Droite = True Then Angle=Angle-2
If Gauche = True Then Angle=Angle+2
EndIf
Local ViewXOffset=ViewXOffset+X
Local ViewYOffset=ViewYOffset+Y
If ViewXOffset<0
ViewXOffset=0
Else
If ViewXOffset>29 Then ViewXoffset=29
EndIf
If ViewYOffset<0
ViewYOffset=0
Else
If ViewYOffset>29 Then ViewYoffset=29
EndIf
scrolling()
TextOut(0,0,"speed : ")
TextOut(80,0,Round(Abs(vitesse*10)))
TextOut(110,0,"Km/h")
DisplayBrush(voiture,XVoiture,YVoiture,{AnchorX = 0.5, AnchorY = 0.5,rotate=Angle})
Local Temps=GetTimer(1)
TextOut (350,1,"Number of picture by second",#BLUE)
TextOut (586,1,Round((1/Temps)*1000))
EndFunction
Function scrolling()
Local TileX=Int(X/32)
Local TileY=Int(Y/32)
If TileX<0 Then TileX=0
If tileX>9 Then TileX=9
If TileY<0 Then TileY=0
If tileY>14 Then TileY=14
For Local RowCtr=TileY To 15+TileY
For Local ColCtr=tileX To 20+tileX
Local TileNum=Circuit[RowCtr][ColCtr]
Local TilePointX=(ColCtr*32)-X
Local TilePointY=(RowCtr*32)-Y
DisplayBrush(TileNum,TilePointX,TilePointY)
Next
Next
EndFunction
SetInterval (1,supercar,20)
BeginDoubleBuffer
Repeat
WaitEvent
Forever