Technique de scrolling multidirectionnel

Discussion forum for the French Hollywood community
Post Reply
ArtBlink
Posts: 484
Joined: Mon Nov 01, 2010 10:37 am
Location: Albert - France
Contact:

Technique de scrolling multidirectionnel

Post by ArtBlink »

Bonjour,
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
Post Reply