1
Voilà, je vais présenter mon projet pour cette année ici (j'en aurai peut être d'autre). Sur le site c'est déjà fait, mais ici on pourra en discuter.

Mon projet :

Les Sims z80


Il s'agit d'une adaptation des Sims (version GBA, donc plus orientée vers l'aventure) sur TI z80. Il sera programmé en Basic étendu avec ma propre Lib (faites éxprès pour l'occasion happy). Pour l'instant c'est pas encore très évolué mais le moteur du jeu marche. J'ai déjà fait le système qui gère la faim, l'hygiène et l'ennui. J'ai une petite idée sur l'histoire et les métiers qu'on pourra faire pour gagner du fric (mais c'est à développer). Voilà les screens (elles sont vieilles donc j'en referai peut être d'autres un jour cheeky) :

Sims%2018%20Novembre%202006.gif Sims%2025%20Novembre%202006.gif

Donc si vous avez des idées/commentaire, n'hésitez pas.
2
j'ai un peu joue sur gba aux sims, tu penses mettre quoi comme metiers?
3
Bah j'avais penser à un jeu de pêche, au barman et d'autre chose si j'ai l'envie et si ça prend pas trop de place (je parle de la version Les Sims : Permis de Sortir sur GBA...)
4
ok moi j'ai joue a celui la aussi
5
J'ai ajouter une screens sur le site, il s'agit des deux première maps avec, on peut le voir, le système de comptage des points sur le coté (hygiène, faim et ennui). Pour l'instant l'héro n'est qu'un pixel mais je vais surement le transformer en cercle ou en sprite (ça dépendra de la vitesse finale). Voilà la screen (dites moi ce que vous en pensez) :

Sims%2012%20Janvier%202007.gif

(Au faite, il ne s'agit pas du tout de la même histoire que sur la version GBA, le principe est le même, mais c'est tout.
6
j'aime bien ,c'est classe
7
Mouais mais je trouve que le point est un peu petit, donc il faut que je le transforme en (surement) un rond ou (peut être pas) une sprite... Mais après il faut que je test les collision et tout donc ça risque d'être un peu plus lent...
8
J'ai refait une screen avec PindurTI, et maintenant le titre est bien mieu rendu :

Sims%2027%20Janvier%202007.gif

(J'ai mis à jour sa fiche du jeu sur zContest, mais ça fait un peu bizarre le texte du dessus un peu 'compressé' cheeky).

Sinon, j'ai un problème avec le mouvement et la détection de collision, etc... Voici ce que je voudrai faire :

Le personnage est représenté pas un carré (donc 'Pt-On(Y,X,2' ), et je voudrai tester les collisions avant qu'il n'avance.

Voici une petite image pour illustrer :

pton2gy3.png

Donc, par éxemple, quand je fait avancer le carré, il faut que je test si les trois pixels au dessus du carré son allumé ou non (donc valeur 1). Pour ça, j'ai fait :
If K=25:Then
For(A,X,X+2
If pxl-Test(A,W-1)=1:Then:Goto 1:Else:Pt-Off(X,W,2:W+1->W:End
End End


Avec, W=Coordonné Y et X=Coordonné X du carré. Donc voici le code source en entier :
0->Ymin:0->Xmin:62->Ymax:94->Xmax
AxesOff:GridOff
ClrHome
31->W:48->X
Lbl 1
While 1
Pt-On(X,W,2
Repeat K
getKey->K
End
If K=25:Then
For(A,X,X+2
If pxl-Test(A,W-1)=1:Then:Goto 1:Else:Pt-Off(X,W,2:W+1->W:End
End
End
If K=34:Then
For(A,X,X+2
If pxl-Test(A,W+3)=1:Then:Goto 1:Else:Pt-Off(X,W,2:W-1->W:End
End
End
If K=24:Then
For(A,W,W-2
If pxl-Test(A,X-1)=1:Then:Goto 1:Else:Pt-Off(X,W,2:X-1->X:End
End
End
If K=26:Then
For(A,W,W-2
If pxl-Test(A,X+2)=1:Then:Goto 1:Else:Pt-Off(X,W,2:X+1->X:End
End
End End


Si vous pensez savoir ce qui ne va pas dans le code, dites le moi parce que là je bloque sur ça.
9
Tu veux tester la colision que pour le point ? ( en utilisant le 'carré de sécurité' ) ou tu veux éviter la collision de tout le carré ?

Sinon, si ton point est en (X,W):
-Tu devrais pas tester de X-1 à X+1 si la position du point est X ?
-De même, logiquement tu devrait aller de W-1 à W+1..


Sinon tu peux te dispenser des Then/else sur les pxltests

Bref, si j'ai bien compris j'aurais plutôt qqch comme ça:
0->Ymin:0->Xmin:62->Ymax:94->Xmax
AxesOff:GridOff
ClrHome
31->W:48->X
Lbl 1
While 1
Pt-On(X,W,2
Repeat K
getKey->K
End
If K=25:Then
For(A,X-1,X+1
If pxl-Test(A,W-1)=1:Goto 1
Pt-Off(X,W,2:W+1->W
End
End
If K=34:Then
For(A,X-1,X+1
If pxl-Test(A,W+1)=1:Goto 1
Pt-Off(X,W,2:W-1->W
End
End
If K=24:Then
For(A,W-1,W+1
If pxl-Test(A,X-1)=1:Goto 1
Pt-Off(X,W,2:X-1->X
End
End
If K=26:Then
For(A,W-1,W+2
If pxl-Test(A,X+1)=1:Goto 1
Pt-Off(X,W,2:X+1->X
End
End End

(qui se factorise par ailleurs assez bien)
Mais de toute manière y'a toujours un truc qui me semble douteux: là tu test également les 'coins' du carré, ce qui me parait pas vraiment nécessaires si c'est seulement pour gérer les collisions de ton point (et même très génant: si tu colle un bord, par exemple en étant monté verticalement....ça va t'empécher de te déplacer latéralement ensuite ...)

Moi, j'aurais fait tout simplement un truc du genre:

debut_boucle
Pt-On(X,Y)
+/-1 -> delta_x // correspond à gauche/droite: getkey.. if = gauche :1->delta_x / etc...
+/-1 -> delta y // idem en verticale
If Pxl-test(X+delta_x,y+delta_y):Goto 1 // je te laisse faire l'inversion qu'il faut je crois..
Pt-Off(x,y)
X+delta_x->X
Y+delta_y -> Y
fin_boucle

Y'a autre-chose qui me parait douteux: la différence entre Pxl-instruction et Pt-instruction
Je ne m'en souviens plus de tête, mais si c'est bien ce que je pense ( genre en pxl ça commence en haut à gauche ? ), il faut faire plus que d'inverser les W+1 en W-1.. pour ce qui est des coordonnées verticales (ce sont elles qui posent pb je crois..), il faut faire qqch du genre (64-Y) pour passer de pt à pxl.. (d'ailleurs, je conseils - sauf exception- toujours de travailler le maximum en pxl et le minimum en point )
Tu veux tester la colision que pour le point ? ( en utilisant le 'carré de sécurité' ) ou tu veux éviter la collision de tout le carré ?


Je veux 'éviter' la collision avec tout le carré (sinon ça sert un peu à rien).
Sinon, si ton point est en (X,W):
-Tu devrais pas tester de X-1 à X+1 si la position du point est X ? -De même, logiquement tu devrait aller de W-1 à W+1..


Hé merde. Je viens de me rendre compte que j'avais mal régler les paramètre WINDOW, ce qui fait que je penser que la coordonné (X,W) était en haut à gauche du carré, mais enfaite il est bien au milieu (ce qui est d'ailleur plus logique pour placer un point sur un graphique...cheeky). Donc mon code est faux, il faut que je le refasse (demain si j'ai le temps).
Sinon tu peux te dispenser des Then/else sur les pxltests


Mouais mais ça c'est un détail tongue.
Y'a autre-chose qui me parait douteux: la différence entre Pxl-instruction et Pt-instruction Je ne m'en souviens plus de tête, mais si c'est bien ce que je pense ( genre en pxl ça commence en haut à gauche ? ), il faut faire plus que d'inverser les W+1 en W-1.. pour ce qui est des coordonnées verticales (ce sont elles qui posent pb je crois..), il faut faire qqch du genre (64-Y) pour passer de pt à pxl.. (d'ailleurs, je conseils - sauf exception- toujours de travailler le maximum en pxl et le minimum en point )


Je ferai des tests à propos des tests de pixels/points un jour, mais ça m'a l'air pas très compliqué.
Deeph (./10) :
Y'a autre-chose qui me parait douteux: la différence entre Pxl-instruction et Pt-instruction Je ne m'en souviens plus de tête, mais si c'est bien ce que je pense ( genre en pxl ça commence en haut à gauche ? ), il faut faire plus que d'inverser les W 1 en W-1.. pour ce qui est des coordonnées verticales (ce sont elles qui posent pb je crois..), il faut faire qqch du genre (64-Y) pour passer de pt à pxl.. (d'ailleurs, je conseils - sauf exception- toujours de travailler le maximum en pxl et le minimum en point )

Je ferai des tests à propos des tests de pixels/points un jour, mais ça m'a l'air pas très compliqué.

Bha non, n'empêche que ça garde toute son importance grin

cheeky Ouais mais bon, tester trois pixels de chaques coté du carré c'pas si dur quand même. Et pour ce qui est de savoir si c'est l'axe Y ou X qu'il faut que je mette en premier dans ma fonction 'Pxl-Test(', je trouverai surement la soluce dans le manuel... Mais là j'ai la flemme d'aller le chercher ou de le télécharger, donc bon, ça va un peut attendre (et puis en ce moment j'essai d'apprendre un peu plus l'ASM...).
bha tu tu teste l'instruction on-calc avec 2 couples de valeurs et c'est bon
Oui c'est ce que je vais faire smile.
Bah voilà, j'avais une heure de perm alors j'ai coder un peu sur mon système de collision, mais ça bug encore un peu :

D'après TI, on marque 'Pt-On(X,Y,[valeur])' donc, dans ce cas X et Y sont dans cet ordre, mais pxl-Test ce marque comme ça : 'pxl-Test(Y,X)', donc c'est l'inverse cheeky. Voici donc le code que j'ai fait :
ClrDraw
31→W:47→X
Line(46,39,48,39
Lbl 1
While 1
Pt-On(X,W,2
Repeat K
getKey→K
End
If K=25:Then
For(A,-1,1
If pxl-Test(W+2,X+A)=1:Then:Goto 1:Else:Pt-Off(X,W,2:W+1→W:End
End
End End


Normalement, on ne peut faire bouger le carré que vers le haut, mais il y a une ligne qui doit l'empecher d'avancer. Mais le problème ce que le carré passe dessus sans rien faire. Pourtant, j'ai tout vérifier et ça devrai marcher...
le problème vient toujours du pxl-test:
-en pixel tu par du coin en haut à gauche comme origine (0,0), et les instructions sont de la forme (ligne,colone)
-en point tu pars d'en _bas_ à gauche comme origine, et les instructions sont effectivement de la forme (colone,liggne)

bref, Pt-(X,Y) <=> pxl-(62-Y,X) (modulos les trucs évidents, comme la bonne fenetrisation [0,94]x[0,62] )
-en pixel tu par du coin en haut à gauche comme origine (0,0), et les instructions sont de la forme (ligne,colone) -en point tu pars d'en _bas_ à gauche comme origine, et les instructions sont effectivement de la forme (colone,liggne)


Ah oui... C'est d'ailleur plus logique puisqu'un graphique qui utilise les points est en 2D et que le point d'origine est situé en bas à gauche... Merci smile. Par contre, j'ai pas compris ça :
bref, Pt-(X,Y) <=> pxl-(62-Y,X) (modulos les trucs évidents, comme la bonne fenetrisation [0,94]x[0,62] )


Je suis pas sur d'avoir tout compris mais je vais essayer de faire quelques tests et de réecrire mon code encore une fois.
Deeph (./17) :
Par contre, j'ai pas compris ça :
bref, Pt-(X,Y) <=> pxl-(62-Y,X) (modulos les trucs évidents, comme la bonne fenetrisation [0,94]x[0,62] )


Simple traduction 'mathématique' de ce que j'ai écrit plus haut: par passer des coordonées à la norme 'point' aux coordonées à la norme pixel,il faut:
-inverser X et Y comme tu l'a déjà remarqué
-comme la heuteur de l'écran fait 62 pixels, si ton pixels est le 3ém à partir du bas, c'est le (62-3)iém à partir du haut. Non ?
bha voilà c'est juste cela qu'on fait en bijectant (X,Y) <-> (62-Y,X)

(avec l'hypothèse que tes paramètres 'windows' soient bien mis par rapport à l'écran, mais je suppose que tu le fait ça smile )
(avec l'hypothèse que tes paramètres 'windows' soient bien mis par rapport à l'écran, mais je suppose que tu le fait ça smile )


Oui je l'ai fait.

Donc pour le code, j'ai fait ça :
ClrDraw
31→W:47→X
Line(46,39,48,39
Lbl 1
While 1
Pt-On(X,W,2
Repeat K
getKey→K
End
If K=25:Then
For(A,-1,1
If pxl-Test(62-W+2,X+A)=1:Then:Goto 1:Else:Pt-Off(X,W,2:W+1→W:End
End
End End


Mais ça ne marche toujours pas...
62-W-2 ! ( = 62-(W+2) )
Yeah ça marche trilove ! Merci ! J'vais enfin pouvoir avancer dans le jeu cheeky (il me reste toujours ma lib à améliorer, mais tant qu'elle marche, c'est bon).

edit : Mon code compartai une erreur : enfaite il ne testai qu'une fois la valeur d'un seul pixel (c'est due au fait que ma boucle était mal faite). Voilà ce que ça donne une fois corrigé :
ClrDraw
31→W:47→X
Line(46,39,48,39
Lbl 1
While 1
Pt-On(X,W,2
Repeat K
getKey→K
End
If K=25:Then
For(A,-1,1
If pxl-Test(62-W+2,X+A)=1:Then:Goto 1:End
End
Pt-Off(X,W,2:W+1→W
End End
Bon bah comme j'avais (encore) une heure de perm aujourd'hui, j'ai coder le reste du programme. Voici ce que ça donne :
31→W:47→X
Line(46,39,48,39
Lbl 1
While 1
Pt-On(X,W,2
Repeat K
getKey→K
End
If K=25:Then
For(A,-1,1
If pxl-Test(62-(W+2),X+A)=1:Then:Goto 1:End
End
Pt-Off(X,W,2:W+1→W:End
If K=34:Then
For(A,-1,1
If pxl-Test(62-(W-2),X+A)=1:Then:Goto 1:End
End
Pt-Off(X,W,2:W-1→W:End
If K=24:Then
For(A,-1,1
If pxl-Test(62-(W+A),X-2)=1:Then:Goto 1:End
End
Pt-Off(X,W,2:X-1→X:End
If K=26:Then
For(A,-1,1
If pxl-Test(62-(W+A),X+2)=1:Then:Goto 1:End
End
Pt-Off(X,W,2:X+1→X:End End


Des idées sur l'optimisation ?
-tu peux supprimer les '=1' et dégager les then..end sur les pxl-test.
-c'est trop moche d'utiliser des labels pour un truc pareil.
-Tu peux factoriser:
-plus proprement tu peux également factoriser les for.
-ensuite tu peux te débarrasser des if (c'est ça qui est long ) en faisant du calcul ou en utilisant des listes. je me souviens plus trop si c'est vraiment performant pour de simples tests.

Bref, par exemple:

31→W:47→X
Line(46,39,48,39
While 1
Pt-On(X,W,2
Repeat K
getKey→K
End
0→DX
0→DW
If K=25:1→DW
If K=34:-1→DW
If K=24:-1→DX
If K=26:1→DX

For(A,-1,1
If pxl-test(62-(W+2DW+DW*A),X+2DX+DX*A):Then:0→DX:0→DW:End
End
Pt-Off(X,W,2
X+DX→X
W+DW→W
End


En remplaçant 'DX' et 'DY' par des variables valides, en fonction de ce que tu dispose à ce moment..
Ça ne marche pas sad(Le carré n'avance pas...). Sinon, tant qu'a faire, on peut remplacer :
If pxl-test(62-(W+2DW+DW*A),X+2DX+DX*A):Then:0→DX:0→DW:End


Par :
If pxl-test(62-(W+2DW+DW*A),X+2DX+DX*A):0→DX:0→DW
-heu ouais suis allé un peu vite en tappant, c'est plutôt:
If pxl-test(62-(W+2DW+DX*A),X+2DX+DW*A):Then:0→DX:0→DW:End



Pour ton remplassement, tel quel y'a deux instructions qui dépendent du if, tu peux pas dégager le then..end

Sinon, si t'aime pas trop les if (comme moi ), y'a ça qui est beau à faire:


31→W:47→X
Line(46,39,48,39
While 1
Pt-On(X,W,2
Repeat K
getKey→K
End
0→DX
0→DW

int(K/24)*int(26/K)*(25-K)->DX
int(K/25)*int(34/K)*iPart((K-29.5)/4.5)->DW

For(A,-1,1
If pxl-test(62-(W+2DW+DX*A),X+2DX+DW*A):Then:0→DX:0→DW:End
End
Pt-Off(X,W,2
X+DX→X
W+DW→W
End


edit: -else+end .. cheeky
Et bon si tu ne veux plus du tout de if ( love , mais bon c'est p-t légèrement extrémiste: on perd légèrement en taille, pas mal en compréhension/maintenabilité, et en vitesse faudrait tester mais si l'on gagne qqch ça doit être minime, surtout que c'est pas à chaque 'tour', mais seulement quand le perso bouge.. ):
31→W:47→X
Line(46,39,48,39
While 1
Pt-On(X,W,2
Repeat K
getKey→K
End
0→DX
0→DW

int(K/24)*int(26/K)*(25-K)->DX
int(K/25)*int(34/K)*iPart((K-29.5)/4.5)->DW

1->T
For(A,-1,1
T*(1-pxl-test(62-(W+2DW+DX*A),X+2DX+DW*A))->T
End
Pt-Off(X,W,2
X+DX*T→X
W+DW*T→W End


Pour ton remplassement, tel quel y'a deux instructions qui dépendent du if, tu peux pas dégager le then..else..


Arf, j'avais mal vu.
Et bon si tu ne veux plus du tout de if ( love , mais bon c'est p-t légèrement extrémiste):


Bah je cherche à faire le plus rapide, mais là déjà je comprend plus ton code cheeky...

edit : Finalement, la solution sans les IF est plus longue puisqu'il y a plus de calculs (et les touches sont inversée, mais ça...).
ça marche avec le pxl-test corrigé ? (je teste évidemment pas.. .. )
Deeph (./27) :
Et bon si tu ne veux plus du tout de if ( love.gif , mais bon c'est p-t légèrement extrémiste):


Bah je cherche à faire le plus rapide, mais là déjà je comprend plus ton code mod.gif ...

Comme souvent ce n'est pas bien compliqué... une fois qu'on a compris wink


D'ailleurs j'ai oublié un truc: on n'a plus besoin des affectations 0->DX:0->DW lorsque l'on calcul ou lieu de tester smile
bref, j'espère ma dernière version ( c'est pour m'amuser, tu n'est surtout pas obligé de suivre jusque là cheeky ):

31→W:47→X
Line(46,39,48,39
While 1
Pt-On(X,W,2
Repeat K
getKey→K
End

int(K/24)*int(26/K)*(25-K)->DX
int(K/25)*int(34/K)*iPart((K-29.5)/4.5)->DW
1->T
For(A,-1,1
T*(1-pxl-test(62-(W+2DW+DX*A),X+2DX+DW*A))->T
End
Pt-Off(X,W,2
X+DX*T→X
W+DW*T→W
End
ça marche avec le pxl-test corrigé ? (je teste évidemment pas.. .. )


Oui, ça marche.
Comme souvent ce n'est pas bien compliqué... une fois qu'on a compris wink


> T*(1-pxl-test(62-(W+2DW+DX*A),X+2DX+DW*A))->T

Faut déjà connaitre chaque fonctions et chaques valeurs des variables, etc... 'fin bon, après c'est peut être plus rapide.