Page 1 of 2

[Prgm] iPong 3D

Unread postPosted: 28 Mar 2014, 19:59
by Wistaro
Bonjour, bonsoir!

Je vous présente aujourd'hui mon nouveau jeu, iPong 3D
Avant toutes choses, voici un petit screen du jeu:
Image
Sympa, non?

Comme son nom l'indique, iPong3D est un jeu de pong, jouable à 2 joueurs pour le moment.
Vous pouvez facilement modifier la taille du plateau de jeu, ainsi que les effets de 3D!


>Pour cela, rien de plus simple: il vous suffit d'aller dans le menu d'options, puis dimensions. Choisissez ensuite la largeur et la longueur de la fenêtre, et le programme arrangera tout seul le reste. Puis allez dans Réglages 3D, et choisissez avec les 4 flèches directionnelles l'effet de perspective que vous souhaitez. Choisissez Tout si vous voulez tout régler (3D + Dimension)

>Une fois dans le jeu, le premier joueur utilise les touches 2nde et Alpha pour jouer, et l'autre les flèches haut et bas.  
>Au bout de 10 buts, le joueur gagne, et la partie continue jusqu'à l'arrêt du programme.

>Appuyez sur CLEAR pour revenir au menu. Toute vos modifications de terrains sont conservées!


Voici le code:
Code: Select all
:DelVar I
:0→Xmin:1→∆X
:0→Ymax:‾62→Ymin
:GridOff:AxesOff
:77→D:45→C:‾33→Z:47→Θ
:ClrDraw
:Lbl 7
:"IPONG→Str1
:1→B
:For(A,13,46,7
:   Text(A,3,sub(Str1,B,1
:   B+1→B:End
:‾55→A
:For(B,‾10,‾28,‾1
:   Line(9,B,86,B
:   Line(9,A,86,A
:   A+1→A
:End
:Text(29,28,"BY WISTARO
:For(T,9,86
:   For(U,‾29,‾36,‾1
:      Pt-Change(T,U
:   End:End
:For(T,‾36,‾29
:   Line(9,T,86,T
:   69!-69!
:End
:StorePic 3
:Lbl C
:DelVar IClrDraw:RecallPic 3
:Menu("  °IPONG°  ","> JOUER",5,"> OPTIONS",3,"> QUITTER",4
:Lbl 3
:Menu("OPTIONS","DIMENTIONS",6,"REGLAGES 3D",8,"TOUT",B,"RETOUR",C
:Lbl 8:1→I:Goto 5
:Lbl B:1→I
:Lbl 6
:ClrHome:ClrDraw
:Disp "LARGEUR?
:Input "DEFAUT=46:",C
:Disp "LONGUEUR?
:Input "DEFAUT=77:",D
:For(A,Θ-D/2,Θ+D/2
:   Line(A,Z-C/2,A,Z+C/2
:End
:StorePic 3
:Lbl 5
:StorePic 2
:7→G:7→H
:Repeat K=105 or not(I
:   getKey→K
:   G+(K=26)-(K=24→G
:   H+(K=25)-(K=34→H
:   If max(K={24,25,26,34:Then
:      ClrDraw
:      RecallPic 2:End
:   Line(Θ-D/2,Z+C/2,Θ+G-D/2,Z+H+C/2
:   Line(Θ+D/2,Z+C/2,Θ+G+D/2,Z+H+C/2
:   Line(Θ+G-D/2,Z+H+C/2,Θ+G+D/2,Z+H+C/2
:   If G≥0:Then
:      Line(Θ+D/2,Z-C/2,Θ+G+D/2,Z+H-C/2
:      Line(Θ+G+D/2,Z+H+C/2,Θ+G+D/2,Z+H-C/2
:   Else
:      Line(Θ-D/2,Z-C/2,Θ+G-D/2,Z+H-C/2
:      Line(Θ+G-D/2,Z+H+C/2,Θ+G-D/2,Z+H-C/2
:   End:End
:Lbl A
:StorePic 1
:DelVar VDelVar W
:Lbl 1
:RecallPic 1
:44→A:32→B
:randInt(0,1→M
:randInt(0,1→N
:Z→E:E→F
:Θ+4-D/2→O
:round(O,0→O
:O+(O/2=int(O/2))→O
:Θ-4+D/2→P
:round(P,0→P
:P+(P/2=int(P/2))→P
:Z+C/2→Q
:Z-C/2→R
:int(abs(R)-1→L
:int(abs(Q)+1→S
:Repeat A≥P or A≤O or K=45
:   getKey→K
:   Text(57,25,V
:   Text(57,68,W
:   If max(K={21,31:Then:Line(O,Q,O,F:Line(O,F+3,O,R:End
:   If max(K={25,34:Then
:      Line(P,Q,P,E:Line(P,E+3,P,R
:   End
:   Line(P,E,P,E+3,0
:   Line(O,F,O,F+3,0
:   E-2(K=34)+2(K=25→E
:   F-2(K=31)+2(K=21→F
:   A+2M-2not(M→A
:   B+2N-2not(N→B
:   If not(Pxl-Test(B+3,A:DelVar N
:   If not(Pxl-Test(B,A+3:DelVar M
:   If B≠S:Then
:      Pt-Off(A,‾B
:      Pt-On(A+2,‾B+2
:   End
:   If B≠L:Then
:      Pt-On(A+2,‾B-2
:      Pt-On(A-2,‾B-2
:   End
:   Pt-On(A-2,‾B+2
:   If not(Pxl-Test(B-3,A:1→N
:   If not(Pxl-Test(B,A-3:1→M
:End
:If K=45:Goto C
:V+(A≥P→V
:W+(A≤O→W
:ClrHome
:If V=10:Pause "VICTOIRE J1
:If W=10:Pause "VICTOIRE J2
:If V<10 or W<10:Goto 1
:Goto C
:Lbl 4
:Stop



Laissez vos avis, et vos suggestions! :)


Je suis actuellement en train de travailler sur un v3 du programme. Elle comportea un mode 1 joueur avec ia sur lequel je suis en train de travailler :)



Voilà, voilà :)

Re: [Prgm] iPong 3D

Unread postPosted: 28 Mar 2014, 21:41
by florian66
pas mal du tout :)
par contre le top du top ce serai que tu arrive a creer une interface en asm pour jouer a 2 caltos :D
+ facile a dire qu a faire ;)

Re: [Prgm] iPong 3D

Unread postPosted: 29 Mar 2014, 09:27
by Wistaro
Merci ;-)

Déjà,le mode contre l'IA et après pourquoi pas le mode 2 calculatrice ;-)

Re: [Prgm] iPong 3D

Unread postPosted: 29 Mar 2014, 15:45
by grosged
Hey Wistaro, Chouette ton "Pong" !
ça me rappelle des souvenirs ! (console de jeu vidéo , image en noir & blanc, branché sur la prise antenne de la télé)
Au sujet de l'IA je me souviens que , dans ce mode "contre la machine" , les mouvements de la raquette étaient simplement calqués sur ceux de la balle ( même coordonnée Y)
Après...y a certainement d'autres façons de programmer l' IA ;)

Re: [Prgm] iPong 3D

Unread postPosted: 29 Mar 2014, 16:55
by Wistaro
Mon IA est différente: elle anticipe le mouvement de la balle.
En fait, lorsque la balle arrive sur la partie supérieure ou inférieure du terrain, quelle vient de la droite vers la gauche (le joueur contrôle le pad de droite) et que elle est à moins de la largeur du terrain de l'extrémité gauche, alors je stocke dans une variable la distance (ordonnée) qui reste à parcourir pour atteidre le bord gauche (-3 à cause de la raquette située à 4px du bord).Cette valeur est stocké dans U

Je soustrais cette valeur à celle de A (ordonné de la balle), j'ai l'ordonnée du point de chute de la balle.

Deux cas se présentent: 1)la balle a touchée le haut du terrain: je fais B + la valeur de U
2) Sinon je fais B -U.

Donc j'ai l'ordonnée du point de chute de la balle.(V)

Enfin, suivant si B>V ou B<V, la valeur de F (le pad: celle que contrôle le joueur avec le pad en mode 2j) est incrémentée ou decrementé. Et la raquette s'arrête pour stopper la balle. Lorsque elle repart, toutes les variables de l'Ia se réinitialisent.

Et le tout en prenant en compte que le terrrain est entièrement modulable ^^


Ce n'est peut être la meilleure solution, je sais pas....J'ai trouvé que cette méthode pour le moment. Le seul truck, c'est que si la largeur > longueur, le pad ne s'arrêtera pas au bon endroit...Et le programme est fortement ralentit, même si j'ai essayé d'optimiser l'IA à fond

Re: [Prgm] iPong 3D

Unread postPosted: 29 Mar 2014, 17:33
by grosged
mm je vois...
après renvoi de la balle, La raquette de l'IA se repositionnerait au milieu ? ...comme au tennis ;)
Ainsi ça limiterait les distances de déplacement

Re: [Prgm] iPong 3D

Unread postPosted: 29 Mar 2014, 17:50
by Wistaro
Bonne idée, mais cela va obliger d'utiliser un Then--End dans 2 conditions...En effet, les données de l'IA sont stockées dans une liste. La première valeur de cette liste est un booléen: 1=déplacement de la raquette activé, 0=raquette immobile.. Lorsque la balle touche l'extremité gauche et rebondit, je DelVar L1(1) en plus du pxtest et comme on peut cumuler un Delvar + une autre fonction sans utiliser de Then--End, c'est cool.

Et replacer la balle demanderait une autre condition genre If not(l1(1: -33->F. Une autre source de rralentissement.


Je pense aussi régler la difficulté de l'IA en modification le pas d'incrémentation/de decrerementation de F. Facile: 1, difficile: 3

Re: [Prgm] iPong 3D

Unread postPosted: 29 Mar 2014, 19:10
by grosged
J'ai pas encore bien déchiffré tout le listing, mais j'ai déjà vu ça:

Dans ta boucle principale, je pense que tu pourrais encore optimiser
-les scores (qui font ralentir car affichés à chaque passage)
-les limites de mouvement des raquettes sur le terrain (que tu pourrais inclure directement dans la modification des variables E & F
ainsi , au lieu de E-2(K=34)+2(K=25→E
on aurait (par ex) E+2((K=34 and E<LimiteV1)-(K=25 and E>limiteV2→E

Re: [Prgm] iPong 3D

Unread postPosted: 29 Mar 2014, 19:43
by Wistaro
Pour les limites, sa ralentira encore plus le programme pour pas grand chose...
En mode 2 joueurs, si l'utilisateur sort son curseur du plateau, il perdra juste le point...

Par contre, en mode auto (IA) , là il faut mettre des limites (inutile, d'ailleurs si l'IA est fonctionnelle...)

Re: [Prgm] iPong 3D

Unread postPosted: 29 Mar 2014, 19:49
by grosged
Je ne pense pas que ça ralentirait, faut juste faire la chasse aux "IF" ;)

et pour ce qui est des raquettes, je parlais d'inclure les limites dans la gestion de E & F
pour que , dans la boucle principale, l'on affiche systématiquement les raquettes "blanches" avec à chaque extrémité un point noir (donc pas besoin de IF en cas de changement dans E ou F puisque qu'à chaque déplacement de raquette vers le haut/bas les points noirs effaceraient automatiquement toute trainée blanche

Tu peux également optimiser en te passant de la fonction de test pixel :
gérer les tests de collision uniquement au moyen des variables concernées

en ce qui concerne la gestion de la balle, je la "vois" comme ça:
bx,by coordonnées de la balle
sx,sy directions de la balle (ainsi dès qu'il y a obstacle, on fait un -sx->sx ou -sy->sy

et dans la boucle principale : bx+sx->bx by+sy->by
puis -(sx and bx=limit1 or bx=limit2 ->sx
-(sy and by=limit1 or by=limit2 ->sy