[Code]Mouvement case par case et collisions
Page 1 sur 1
[Code]Mouvement case par case et collisions
Salutations aux lectrices et aux lecteurs,
Aujourd'hui je vous propose du code vous montrant un mouvement case par case avec collisions avec le décor (background) et avec des sprites.
Je me suis dit que ça serait bien de le partager avec vous, avec un peu d'adaptation vous pourriez en faire un petit RPG.
Que va t-on découvrir avec ce code ?
Et bien regardons maintenant le sommaire:
'Mouvement par case de 8 pixels
'Animations du héros
'Collision avec Background et Sprite
'Bouton Courir/Marcher
'Priorité modifiée Passe devant-derrière Sprite
Le code sera de la même couleur que la catégorie du sommaire, en noir on a les préliminaires concernant l'affichage des sprites et du décor
ainsi que la déclaration des variables, voici le code:
ACLS:CLEAR:SYSBEEP=0
LOAD "BGF0:TXT_FR",0
PNLTYPE "OFF"
LOCATE 3,22:?"R:Courir/Marcher"
SPSET 10,64,4,0,0,2 'Héros
SPOFS 10,40,8
SPSET 11,80,0,0,0,2 'SP1
SPOFS 11,24,8
SPSET 12,96,2,0,0,2 'SP2
SPOFS 12,56,8
SPSET 13,112,2,0,0,2 'SP3
SPOFS 13,72,8
SPSET 14,128,0,0,0,2 'SP4
SPOFS 14,88,8
SPSET 15,144,4,0,0,2 'SP5
SPOFS 15,104,8
SPSET 16,160,4,0,0,2 'SP6
SPOFS 16,120,8
SPSET 17,176,3,0,0,2 'SP7
SPOFS 17,136,8
SPSET 18,192,6,0,0,2 'SP8
SPOFS 18,152,8
SPSET 19,208,5,0,0,2 'SP9
SPOFS 19,168,8
SPSET 20,224,7,0,0,2 'SP10
SPOFS 20,184,8
SPSET 21,240,7,0,0,2 'SP11
SPOFS 21,200,8
SPSET 22,256,4,0,0,2 'SP12
SPOFS 22,216,8
FOR I=10 TO 22
SPANIM I,4,16
NEXT
BGFILL 1,0,0,31,23,33,9,0,0
FOR I=0 TO 3
BGPUT 0,16+I,16,156+I,8,0,0
BGPUT 0,16+I,17,188+I,8,0,0
BGPUT 0,16+I,18,220+I,8,0,0
BGPUT 0,16+I,19,252+I,8,0,0
BGPUT 1,16+I,19,216+I,8,0,0
BGPUT 1,16+I,20,248+I,8,0,0
NEXT
X10=40:Y10=8:SPD=2
SPOFS 12,56,16:SPOFS 13,72,0
SPOFS 14,88,24:SPOFS 15,104,40
SPOFS 16,120,24:SPOFS 17,136,0
@PRINCIPAL
GOSUB @BOUGE
GOSUB @SPPRIORITE
GOTO @PRINCIPAL
'++++Bouge par cases+++++++++
@BOUGE
IF BUTTON()>0 THEN GOSUB @DIRECTION
IF BTRIG()>0 AND BTRIG()<11 THEN SPANIM 10,4,SPD*4+8
IF !(BUTTON()>0 AND BUTTON()<11) THEN SPANIM 10,1,SPD*4+8
IF BUTTON(3) AND 512 THEN IF SPD==2 THEN SPD=1:SPANIM 10,4,SPD*4+8 ELSE SPD=2:SPANIM 10,4,SPD*4+8
IF BUTTON() AND 1 THEN MV=1:GOSUB @PARCASEY
IF BUTTON() AND 2 THEN MV=-1:GOSUB @PARCASEY
IF BUTTON() AND 4 THEN MV=1:GOSUB @PARCASEX
IF BUTTON() AND 8 THEN MV=-1:GOSUB @PARCASEX
VSYNC 1
RETURN
@DIRECTION
IF BUTTON() AND 1 THEN SPCHR 10,76,4,0,0,2
IF BUTTON() AND 2 THEN SPCHR 10,68,4,0,0,2
IF BUTTON() AND 4 THEN SPCHR 10,72,4,0,0,2
IF BUTTON() AND 8 THEN SPCHR 10,64,4,0,0,2
IF BUTTON(3)>10 THEN SPANIM 10,4,SPD*4+8
RETURN
'Pour l'axe Y
@PARCASEY
IF BUTTON()>10 THEN RETURN
GOSUB @COLLISION
IF COL==1 THEN COL=0:RETURN
FOR I=1 TO 8*SPD
Y10=Y10-MV/SPD
IF COLS==1 THEN Y10=Y10+MV/SPD
SPOFS 10,X10,Y10,0
GOSUB @SPPRIORITE
VSYNC 1
IF I==8*SPD THEN COLS=0:GOSUB @DIRECTION
NEXT
RETURN
'Pour l'axe X
@PARCASEX
IF BUTTON()>10 THEN RETURN
GOSUB @COLLISION
IF COL==1 THEN COL=0:RETURN
FOR I=1 TO 8*SPD
X10=X10-MV/SPD
IF COLS==1 THEN X10=X10+MV/SPD
SPOFS 10,X10,Y10,0
GOSUB @SPPRIORITE
VSYNC 1
IF I==8*SPD THEN COLS=0:GOSUB @DIRECTION
NEXT
RETURN
'Collision Background
@COLLISION
XB=FLOOR(X10/8):YB=FLOOR(Y10/8)
BGREAD(1,XB,YB),ID1,PL1,HR1,VR1
BGREAD(1,XB+1,YB),ID3,PL1,HR1,VR1
BGREAD(1,XB,YB+2),ID2,PL2,HR2,VR2
BGREAD(1,XB+1,YB+2),ID5,PL2,HR2,VR2
BGREAD(1,XB-1,YB+1),ID4,PL4,HR4,VR4
BGREAD(1,XB+2,YB+1),ID8,PL8,HR8,VR8
RESTORE @DATACOL
FOR I=1 TO 3
READ IDC
IF (ID1==IDC OR ID3==IDC) AND (BUTTON() AND 1) THEN COL=1
IF (ID2==IDC OR ID5==IDC) AND (BUTTON() AND 2)==2 THEN COL=1
IF ID4==IDC AND (BUTTON() AND 4)==4 THEN COL=1
IF ID8==IDC AND (BUTTON() AND 8)==8 THEN COL=1
NEXT
'Collision avec Sprites existants
IF SPHIT(10,11)==1 THEN SPREAD(SPHITNO),XSN,YSN,ASN,ZOOMSN,IMGSN
IF (BUTTON() AND 1) AND SPHIT(10,11) AND Y10>YSN THEN COLS=1
IF (BUTTON() AND 2)==2 AND SPHIT(10,11) AND Y10<YSN THEN COLS=1
IF (BUTTON() AND 4)==4 AND SPHIT(10,11) AND Y10==YSN AND X10>XSN THEN COLS=1
IF (BUTTON() AND 8)==8 AND SPHIT(10,11) AND Y10==YSN AND X10<XSN THEN COLS=1
RESTORE @DATACOLSP
FOR I=11 TO 22
READ SPC
IF SPHITSP(10,SPC) AND SPHITNO!=SPC THEN SPREAD(SPC),XSP,YSP,ASP,ZOOMSP,IMGSP
IF BUTTON()==1 AND SPHITSP(10,SPC) AND Y10>YSP AND SPHITNO!=SPC THEN COLS=1
IF BUTTON()==2 AND SPHITSP(10,SPC) AND Y10<YSP AND SPHITNO!=SPC THEN COLS=1
IF BUTTON()==4 AND SPHITSP(10,SPC) AND Y10==YSP AND X10>XSP AND SPHITNO!=SPC THEN COLS=1
IF BUTTON()==8 AND SPHITSP(10,SPC) AND Y10==YSP AND X10<XSP AND SPHITNO!=SPC THEN COLS=1
NEXT
RETURN
@DATACOLSP
DATA 11,12,13,14,15,16,17,18,19,20,21,22
@DATACOL
DATA 0,217,218
@SPPRIORITE
IF SPHIT(10,11)==1 THEN GOTO @CHPRIO
RETURN
@CHPRIO
SPREAD(SPHITNO),XSN,YSN,ASN,ZOOMSN,IMGSN
ISP=SPHITNO:GOSUB @CHRPAL
SPREAD(10),XDIX,YDIX,ANG10,ZOOM10,IMG10
IF YDIX<YSN THEN SPCHR 10,IMG10,4,0,0,2:SPCHR SPHITNO,IMGSN,PALSN,0,0,1
IF YDIX>YSN THEN SPCHR 10,IMG10,4,0,0,2:SPCHR SPHITNO,IMGSN,PALSN,0,0,2
FOR ISP=11 TO 22
IF SPHITSP(10,ISP) AND SPHITNO!=ISP THEN SPREAD(ISP),XSP,YSP,ASP,ZOOMSP,IMGSP
GOSUB @CHRPAL
IF SPHITSP(10,ISP) AND SPHITNO!=ISP THEN IF YDIX<YSP THEN SPCHR ISP,IMGSP,PALSN,0,0,0
IF SPHITSP(10,ISP) AND SPHITNO!=ISP THEN IF YDIX>YSP THEN SPCHR ISP,IMGSP,PALSN,0,0,2
NEXT
RETURN
@CHRPAL
IF ISP==11 OR ISP==14 THEN PALSN=0
IF ISP==12 OR ISP==13 THEN PALSN=2
IF ISP==15 OR ISP==16 OR ISP==22 THEN PALSN=4
IF ISP==17 THEN PALSN=3
IF ISP==18 THEN PALSN=6
IF ISP==19 THEN PALSN=5
IF ISP==20 OR ISP==21 THEN PALSN=7
RETURN
Si vous avez des questions ou si vous voulez plus de précisions sur certains passages du code, n'hésitez pas à me le signaler,
je rajouterai des commentaires sur ce qui vous semble un peu obscur.
Sur ce, amusez vous bien !!
Aujourd'hui je vous propose du code vous montrant un mouvement case par case avec collisions avec le décor (background) et avec des sprites.
Je me suis dit que ça serait bien de le partager avec vous, avec un peu d'adaptation vous pourriez en faire un petit RPG.
Que va t-on découvrir avec ce code ?
Et bien regardons maintenant le sommaire:
'Mouvement par case de 8 pixels
'Animations du héros
'Collision avec Background et Sprite
'Bouton Courir/Marcher
'Priorité modifiée Passe devant-derrière Sprite
Le code sera de la même couleur que la catégorie du sommaire, en noir on a les préliminaires concernant l'affichage des sprites et du décor
ainsi que la déclaration des variables, voici le code:
ACLS:CLEAR:SYSBEEP=0
LOAD "BGF0:TXT_FR",0
PNLTYPE "OFF"
LOCATE 3,22:?"R:Courir/Marcher"
SPSET 10,64,4,0,0,2 'Héros
SPOFS 10,40,8
SPSET 11,80,0,0,0,2 'SP1
SPOFS 11,24,8
SPSET 12,96,2,0,0,2 'SP2
SPOFS 12,56,8
SPSET 13,112,2,0,0,2 'SP3
SPOFS 13,72,8
SPSET 14,128,0,0,0,2 'SP4
SPOFS 14,88,8
SPSET 15,144,4,0,0,2 'SP5
SPOFS 15,104,8
SPSET 16,160,4,0,0,2 'SP6
SPOFS 16,120,8
SPSET 17,176,3,0,0,2 'SP7
SPOFS 17,136,8
SPSET 18,192,6,0,0,2 'SP8
SPOFS 18,152,8
SPSET 19,208,5,0,0,2 'SP9
SPOFS 19,168,8
SPSET 20,224,7,0,0,2 'SP10
SPOFS 20,184,8
SPSET 21,240,7,0,0,2 'SP11
SPOFS 21,200,8
SPSET 22,256,4,0,0,2 'SP12
SPOFS 22,216,8
FOR I=10 TO 22
SPANIM I,4,16
NEXT
BGFILL 1,0,0,31,23,33,9,0,0
FOR I=0 TO 3
BGPUT 0,16+I,16,156+I,8,0,0
BGPUT 0,16+I,17,188+I,8,0,0
BGPUT 0,16+I,18,220+I,8,0,0
BGPUT 0,16+I,19,252+I,8,0,0
BGPUT 1,16+I,19,216+I,8,0,0
BGPUT 1,16+I,20,248+I,8,0,0
NEXT
X10=40:Y10=8:SPD=2
SPOFS 12,56,16:SPOFS 13,72,0
SPOFS 14,88,24:SPOFS 15,104,40
SPOFS 16,120,24:SPOFS 17,136,0
@PRINCIPAL
GOSUB @BOUGE
GOSUB @SPPRIORITE
GOTO @PRINCIPAL
'++++Bouge par cases+++++++++
@BOUGE
IF BUTTON()>0 THEN GOSUB @DIRECTION
IF BTRIG()>0 AND BTRIG()<11 THEN SPANIM 10,4,SPD*4+8
IF !(BUTTON()>0 AND BUTTON()<11) THEN SPANIM 10,1,SPD*4+8
IF BUTTON(3) AND 512 THEN IF SPD==2 THEN SPD=1:SPANIM 10,4,SPD*4+8 ELSE SPD=2:SPANIM 10,4,SPD*4+8
IF BUTTON() AND 1 THEN MV=1:GOSUB @PARCASEY
IF BUTTON() AND 2 THEN MV=-1:GOSUB @PARCASEY
IF BUTTON() AND 4 THEN MV=1:GOSUB @PARCASEX
IF BUTTON() AND 8 THEN MV=-1:GOSUB @PARCASEX
VSYNC 1
RETURN
@DIRECTION
IF BUTTON() AND 1 THEN SPCHR 10,76,4,0,0,2
IF BUTTON() AND 2 THEN SPCHR 10,68,4,0,0,2
IF BUTTON() AND 4 THEN SPCHR 10,72,4,0,0,2
IF BUTTON() AND 8 THEN SPCHR 10,64,4,0,0,2
IF BUTTON(3)>10 THEN SPANIM 10,4,SPD*4+8
RETURN
'Pour l'axe Y
@PARCASEY
IF BUTTON()>10 THEN RETURN
GOSUB @COLLISION
IF COL==1 THEN COL=0:RETURN
FOR I=1 TO 8*SPD
Y10=Y10-MV/SPD
IF COLS==1 THEN Y10=Y10+MV/SPD
SPOFS 10,X10,Y10,0
GOSUB @SPPRIORITE
VSYNC 1
IF I==8*SPD THEN COLS=0:GOSUB @DIRECTION
NEXT
RETURN
'Pour l'axe X
@PARCASEX
IF BUTTON()>10 THEN RETURN
GOSUB @COLLISION
IF COL==1 THEN COL=0:RETURN
FOR I=1 TO 8*SPD
X10=X10-MV/SPD
IF COLS==1 THEN X10=X10+MV/SPD
SPOFS 10,X10,Y10,0
GOSUB @SPPRIORITE
VSYNC 1
IF I==8*SPD THEN COLS=0:GOSUB @DIRECTION
NEXT
RETURN
'Collision Background
@COLLISION
XB=FLOOR(X10/8):YB=FLOOR(Y10/8)
BGREAD(1,XB,YB),ID1,PL1,HR1,VR1
BGREAD(1,XB+1,YB),ID3,PL1,HR1,VR1
BGREAD(1,XB,YB+2),ID2,PL2,HR2,VR2
BGREAD(1,XB+1,YB+2),ID5,PL2,HR2,VR2
BGREAD(1,XB-1,YB+1),ID4,PL4,HR4,VR4
BGREAD(1,XB+2,YB+1),ID8,PL8,HR8,VR8
RESTORE @DATACOL
FOR I=1 TO 3
READ IDC
IF (ID1==IDC OR ID3==IDC) AND (BUTTON() AND 1) THEN COL=1
IF (ID2==IDC OR ID5==IDC) AND (BUTTON() AND 2)==2 THEN COL=1
IF ID4==IDC AND (BUTTON() AND 4)==4 THEN COL=1
IF ID8==IDC AND (BUTTON() AND 8)==8 THEN COL=1
NEXT
'Collision avec Sprites existants
IF SPHIT(10,11)==1 THEN SPREAD(SPHITNO),XSN,YSN,ASN,ZOOMSN,IMGSN
IF (BUTTON() AND 1) AND SPHIT(10,11) AND Y10>YSN THEN COLS=1
IF (BUTTON() AND 2)==2 AND SPHIT(10,11) AND Y10<YSN THEN COLS=1
IF (BUTTON() AND 4)==4 AND SPHIT(10,11) AND Y10==YSN AND X10>XSN THEN COLS=1
IF (BUTTON() AND 8)==8 AND SPHIT(10,11) AND Y10==YSN AND X10<XSN THEN COLS=1
RESTORE @DATACOLSP
FOR I=11 TO 22
READ SPC
IF SPHITSP(10,SPC) AND SPHITNO!=SPC THEN SPREAD(SPC),XSP,YSP,ASP,ZOOMSP,IMGSP
IF BUTTON()==1 AND SPHITSP(10,SPC) AND Y10>YSP AND SPHITNO!=SPC THEN COLS=1
IF BUTTON()==2 AND SPHITSP(10,SPC) AND Y10<YSP AND SPHITNO!=SPC THEN COLS=1
IF BUTTON()==4 AND SPHITSP(10,SPC) AND Y10==YSP AND X10>XSP AND SPHITNO!=SPC THEN COLS=1
IF BUTTON()==8 AND SPHITSP(10,SPC) AND Y10==YSP AND X10<XSP AND SPHITNO!=SPC THEN COLS=1
NEXT
RETURN
@DATACOLSP
DATA 11,12,13,14,15,16,17,18,19,20,21,22
@DATACOL
DATA 0,217,218
@SPPRIORITE
IF SPHIT(10,11)==1 THEN GOTO @CHPRIO
RETURN
@CHPRIO
SPREAD(SPHITNO),XSN,YSN,ASN,ZOOMSN,IMGSN
ISP=SPHITNO:GOSUB @CHRPAL
SPREAD(10),XDIX,YDIX,ANG10,ZOOM10,IMG10
IF YDIX<YSN THEN SPCHR 10,IMG10,4,0,0,2:SPCHR SPHITNO,IMGSN,PALSN,0,0,1
IF YDIX>YSN THEN SPCHR 10,IMG10,4,0,0,2:SPCHR SPHITNO,IMGSN,PALSN,0,0,2
FOR ISP=11 TO 22
IF SPHITSP(10,ISP) AND SPHITNO!=ISP THEN SPREAD(ISP),XSP,YSP,ASP,ZOOMSP,IMGSP
GOSUB @CHRPAL
IF SPHITSP(10,ISP) AND SPHITNO!=ISP THEN IF YDIX<YSP THEN SPCHR ISP,IMGSP,PALSN,0,0,0
IF SPHITSP(10,ISP) AND SPHITNO!=ISP THEN IF YDIX>YSP THEN SPCHR ISP,IMGSP,PALSN,0,0,2
NEXT
RETURN
@CHRPAL
IF ISP==11 OR ISP==14 THEN PALSN=0
IF ISP==12 OR ISP==13 THEN PALSN=2
IF ISP==15 OR ISP==16 OR ISP==22 THEN PALSN=4
IF ISP==17 THEN PALSN=3
IF ISP==18 THEN PALSN=6
IF ISP==19 THEN PALSN=5
IF ISP==20 OR ISP==21 THEN PALSN=7
RETURN
Si vous avez des questions ou si vous voulez plus de précisions sur certains passages du code, n'hésitez pas à me le signaler,
je rajouterai des commentaires sur ce qui vous semble un peu obscur.
Sur ce, amusez vous bien !!
Sujets similaires
» [Code]IA multiples
» [Code]MGVD
» Aide: Exporter le code ?
» Transformer un programme en QR code
» [Tutoriel][Code] La fonction Dim
» [Code]MGVD
» Aide: Exporter le code ?
» Transformer un programme en QR code
» [Tutoriel][Code] La fonction Dim
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum