1

Voilà, j'essai de faire enfin un pong, mais j'ai plusieurs problèmes... Voilà une screen pour que vous voyez ce qui a été fait :

p0ngz80qa3.gif

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 cheeky)

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 ...

2

Pour les rebond avec la balle, c'est assez simple, tu défninie une variable x_delta que tu ajoute à chaque cycle à "ta variable de coordonnée des x de la balle".
Quand ta balle rebondit sur la raquette, tu calcule la difference du centre de la balle avec le centre de la raquette, cette différence tu l'ajoute à ton x_delta, et comme ça , suivant l'endroit du rebond, ça rebondit plus ou moins fortement suiavnt l'endroti de l'impact
Si t'as pas compris(vu ma capacité d'explication), je te ferais un schéma
Ah ah ! Sacré Gödel, il avait l'idée de vouloir mettre au chômage tous les mathématiciens ce fourbe !

3

Ouais j'ai à peu près compris, mais je voit pas comment je peut faire pour calculer ça (et pour l'instant j'aimerai mieu règler les problèmes autres problèmes...).

edit : Quelqu'un aurai les déscription de toutes les fonctions avec les OP (opérations en virgule flottante) ?

4

Je pense pas que t'ai besoin des OP, vu que c'est très lent d'utilisation...

5

Mouais, mais alors ça va être difficile de faire autrement (personne n'a d'algo pour faire un pong ?).