
D'abord, sur la raquette, il y a des pixels qui s'affichent puis qui s'éteignent aléatoirement, et j'ai pas trouver comme règler ça... Ensuite, le balle peut traverser la raquette (on le voit sur la screen...). J'ai seulement fait la direction de la balle vers le haut/bas, je ferai le reste quand j'aurai déjà regler ça (et si quelqu'un à un algo..?).
Voilà la source :
.nolist
#include "ion.inc"
#define Var1 8265h
#define CoorXBalle 8266h
#define CoorYBalle 8267h
#define CoorX 8268h
#define CoorY 8269h
;Groupe1 : 0feh
kDown .equ 254
kLeft .equ 253
kRight .equ 251
kUp .equ 247
;Groupe2 : 0fdh
kEnter .equ 254
kClear .equ 191
;Groupe7 : 0bfh
k2nd .equ 223
.list
#ifdef TI83P
.org ProgStart-2
.db $bb,$6d
#else
.org ProgStart
#endif
ret
jr nc,Start
.db "P0ng - Deeph",0
Start:
bcall(_ClrScrnFull)
bcall(_grbufclr)
bcall(_indicatorOff)
call Deeph_Aff ;appelle ma routine qui n'est pas dans le meme fichier.
ld a,40
ld (CoorX),a
ld (CoorXBalle),a
ld a,0
ld (CoorYBalle),a
ld a,50
ld (CoorY),a
ld a,1
ld (Var1),a
call Aff
getKey: ;getKey en direct input.
ld a,0ffh
out (1),a
ld a,0feh
out (1),a
in a,(1)
cp kLeft
jr z,Left
cp kRight
jr z,Right
ld a,0ffh
out (1),a
ld a,0fdh
out (1),a
in a,(1)
cp kClear
jr z,Fin
call Mvt
jr getKey
Left:
ld a,(CoorX)
cp 0
jr z,getKey
dec a
ld (CoorX),a
call Mvt
call Aff
jr getKey
Right:
ld a,(CoorX)
ld b,16
add a,b ;on a besoin de savoir si à droite de la raquette (donc à 16 pixels plus loins), c'est le bord
cp 96
jr z,getKey
ld b,-16 ;si c'est bon, on décrémente la valeur de b pour l'ajouter à l'accu puis à la coordonnée X de la raquette.
add a,b
inc a
ld (CoorX),a
call Mvt
call Aff
jr getKey
Fin:
bcall(_ClrScrnFull)
bcall(_grbufclr)
bcall(_indicatorOn)
ret
Mvt:
ld a,(Var1)
cp 1
call z,Down
cp 2
call z,Up
ret
Up:
call Collision
ld a,(CoorYBalle)
inc a
ld (CoorYBalle),a
call Aff
ret
Down:
call Collision
ld a,(CoorYBalle)
dec a
ld (CoorYBalle),a
call Aff
ret
Collision:
ld a,(CoorY)
ld b,a
ld a,(CoorYBalle)
cp 0
call z,Up2
cp b ;compare la coordonnée Y de la raquette et de la balle
call z,Touche ;si c'est bon on va vérifier la coordonnée X
cp 56
jr z,Fin
ret
Up2:
ld a,2
ld (Var1),a
ret
Touche:
ld a,(CoorX)
ld b,a
ld a,(CoorXBalle)
ld hl,0
Touche2:
inc hl
cp b
call z,Down2
inc b
ld de,16
bcall(_CpHLDE) ;compare 16 fois (car la raquette fait 16 pixels de longueurs)
jr nz,Touche2
ret
Down2:
ld a,1
ld (Var1),a
ret
Aff:
bcall(_grbufclr)
ld a,(CoorYBalle)
ld l,a
ld b,8
ld c,1
ld a,(CoorXBalle)
ld ix,Balle
call ionLargeSprite
ld l,56
ld b,8
ld c,2
ld a,(CoorX)
ld ix,raquette
call ionLargeSprite
call ionFastCopy
ret
#include "Deeph.z80" ;routine qui affiche le truc qui défile au début (style les premières game boy)
raquette:
.db %00000000,%00000000
.db %00000000,%00000000
.db %01111111,%11111110
.db %10101010,%10101011
.db %11010101,%01010101
.db %01111111,%11111110
.db %00000000,%00000000
.db %00000000,%00000000
balle:
.db %00111100
.db %01000010
.db %10011001
.db %10000101
.db %10000101
.db %10000001
.db %01000010
.db %00111100
.end END
Pour les collisions avec les bords (de la balle), j'avais penser à faire ça avec les OP, puisqu'on peut inverser les OP très facilement ...