Vous vous souvenez du jeu énervant

http://www.purebasic.fr/french/viewtopic.php?t=9543
Voici encore plus énervant

L'histoire : Après avoir fait des découvertes inquiétantes sur le dossier secret "Livret A à 8% et mon doigt dans l'oeil tu l'as vu?", l'agent Oldskull a été jeté au fond d'un volcan en activité(la lave remonte!) peuplé de chauve-souris désagréables(mais "pas touche" car espèce protégée!). Objectif, remonter à la surface et faire éclater le scandale !
Je vais essayer de le purepuncher mais pour l'instant voici la version lisible.
J'espère que ça servira à ceux qui bossent sur des jeux de plateformes.
J'ai fait une découverte énorme !
Ca fait pas mal de temps que je m'obstine à afficher les sprites à la fin de la boucle principale
Comme mes sprites ne se déplacent quasiment jamais de manière uniforme, j'ai droit à :
-des problèmes avec les collisions
-des ploblèmes de localisation des sprites (dans le code avec les icebergs, la partie finit alors que le crâne n'a pas tout à fait touché l'eau)
J'ai tout mis au début et ça a changé ma vie

Fini les bidouilles, les tests...

Le code a été crée dans l'esprit purepunch, c'est pour cela qu'il y a pas mal de choses à améliorer !
-Une IA pour les chauves-souris
-J'avais pensé rajouter des bonus (anneaux d'or jetés par je ne sais quel malade).
-Etc...
Pour augmenter la taille du volcan(ici 480*10 pixels et 150 plateaux), le nombre de bestioles, c'est au début !
La vitesse de la lave, c'est plus loin.
Code : Tout sélectionner
;Escape from Hell (an Oldskull's adventure)
;auteur Huitbit
;pb v4.31
;*********************************
#l=640
#h=480
nbr_tableaux=10;hauteur totale du volcan 10*480 pixels
nbr_platform=nbr_tableaux*15-1
meilleur_niveau_min=nbr_platform;pour la sauvegarde du highscore
nbr_bat=nbr_tableaux*7-1;nombre total de chauve-souris
Enumeration
#skull
#bat
#platform
#lava
EndEnumeration
skull$="|þˉþþU";crâne
bat$="BfçZZf";chauve-souris
Structure info
x.w
y.w
phi.w
EndStructure
Dim platform.info(nbr_platform)
Dim bat.info(nbr_bat)
;-**************************************
;-PROGRAMME PRINCIPAL
;-**************************************
InitSprite()
InitKeyboard()
OpenWindow(0,0,0,#l,#h,"Volcano" )
OpenWindowedScreen(WindowID(0),0,0,#l,#h,0,0,0)
;-création des sprites
CreateSprite(#skull,16,16)
StartDrawing(SpriteOutput(#skull))
For j=1 To 8
For i=1 To 8
If Mid(RSet(Bin(Asc(Mid(skull$,j,1))),8,"0"),i,1)="1"
Box(i*2-2,j*2-2,2,2,$FF)
EndIf
Next i
Next j
StopDrawing()
CreateSprite(#bat,16,16)
StartDrawing(SpriteOutput(#bat))
For j=1 To 8
For i=1 To 8
If Mid(RSet(Bin(Asc(Mid(bat$,j,1))),8,"0"),i,1)="1"
Box(i*2-2,j*2-2,2,2,$FF8080)
EndIf
Next i
Next j
StopDrawing()
CreateSprite(#platform,32,16)
StartDrawing(SpriteOutput(#platform))
Ellipse(16,0,16,16,RGB(178, 117, 27))
For i=0 To 20
Box(Random(32),Random(16),1,1)
Next i
StopDrawing()
CreateSprite(#lava,#l,#h*0.5)
StartDrawing(SpriteOutput(#lava))
Box(0,0,#l,#h*0.5,RGB(248, 65, 7))
StopDrawing()
;-label pour le GOTO pour recommencer une partie
jeu:
;-initialisation des variables pour un nouveau jeu
For n=0 To nbr_platform
platform(n)\x=(6+Random(26))*16
platform(n)\phi=Random(359)
Next n
For n=0 To nbr_bat
bat(n)\x=Random(#l)
bat(n)\y=Random(nbr_tableaux*#h)
bat(n)\phi=Random(359)
Next n
x=15*16
ay=1
dt.b=1
y=(nbr_tableaux-1)*#h; lâcher du crâne dans l'avant-dernier tableau
y_lava.f=nbr_tableaux*#h
niveau_min=nbr_platform
;-*************************************
;-BOUCLE PRINCIPALE
;-*************************************
Repeat
;calcul des numéros extrêmes des plateformes qui doivent apparaître à l'écran
n_haut=Int(y/32)-7
n_bas=Int(y/32)+7
If n_haut<0
n_haut=0
EndIf
If n_bas>nbr_platform
n_bas=nbr_platform
EndIf
;-affichage
FlipBuffers()
ClearScreen(0)
;plateformes
For n=n_haut To n_bas
DisplaySprite(#platform,platform(n)\x+96*Sin((angle+platform(n)\phi)*#PI/180),2*n*16-y+#h*0.5)
Next n
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(platform(n_skull)\x+96*Sin((angle+platform(n_skull)\phi)*#PI/180)+4,2*n_skull*16-y+#h*0.5,Str(n_skull),RGB(255,255,0))
StopDrawing()
;chauve-souris
For n=0 To nbr_bat
DisplaySprite(#bat,bat(n)\x+96*Sin((2*angle+bat(n)\phi)*#PI/180),bat(n)\y+96*Sin(3*angle*#PI/180)-y+#h*0.5)
Next n
DisplaySprite(#skull,x,0.5*#h)
DisplaySprite(#lava,0,y_lava-y+#h*0.5)
;-collision skull~bat
For n=0 To nbr_bat
If SpriteCollision(#skull,x,y,#bat,bat(n)\x+96*Sin((2*angle+bat(n)\phi)*#PI/180),bat(n)\y+96*Sin(3*angle*#PI/180))
contact=0
x=x+8-16*Random(1)
EndIf
Next n
;-collision skull~lava
If y_lava-y<15
If niveau_min<meilleur_niveau_min
meilleur_niveau_min=niveau_min
EndIf
messageRequester("GAME OVER","Niveau minimum atteint : "+Str(niveau_min)+" Meilleur score : "+Str(meilleur_niveau_min),#PB_MessageRequester_Ok)
Goto jeu
EndIf
;-collision skull~blocs
For n=n_haut To n_bas
If vy>0 And SpriteCollision(#skull,x+vx*dt,y+vy*dt,#platform,platform(n)\x+96*Sin((angle+platform(n)\phi)*#PI/180),2*n*16)
contact=1
If n=0
MessageRequester("MISSION COMPLETED","",#PB_MessageRequester_Ok)
Goto jeu
ElseIf n<niveau_min
niveau_min=n
EndIf
n_skull=n
dx_skull=x-(platform(n)\x+96*Sin((angle+platform(n)\phi)*#PI/180)); décalage à l'aterrissage
Break
EndIf
Next n
angle=angle+1
If angle>360
angle=0
EndIf
y_lava=y_lava-0.2
;-équations du mouvement de skull
If contact=0 ;chute libre
If vy<16
vy=vy+ay*dt
EndIf
x=x+vx*dt
y=y+vy*dt
ElseIf contact=1;sur palier
dx_skull=dx_skull+vx*dt
vy=0
;-chute si le décalage est plus grand que le palier
If dx_skull<-16 Or dx_skull>32
contact=0
EndIf
;-déplacement avec le palier
x=platform(n_skull)\x+96*Sin((angle+platform(n_skull)\phi)*#PI/180)+dx_skull
y=2*n_skull*16-16
EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Up)
If contact=1
vy=-16
ay=1
contact=0
EndIf
EndIf
;vitesse différente selon la situation
If contact =0
v=3
Else
v=1
EndIf
If KeyboardPushed(#PB_Key_Left)
vx=-v
ElseIf KeyboardPushed(#PB_Key_Right)
vx=v
Else
vx=0
EndIf
Delay(1)
Until WindowEvent() = #PB_Event_CloseWindow
Hasta la vista
[EDIT] Lors du changement de forum ce code a disparu
