1

Salut à tous!
J'ai commencé à programmer un beat them all, et j'ai des problèmes avec le scrolling de la map.
J'ai uniquement besoin de scroller vers la droite. J'ai des tiles 8x8 et un tableau à deux dimensions qui est la "map", chaque case donne le numéro de la tile.
Pour l'instant, ce que je fais, c'est que au début j'affiche des tiles pour remplir l'écran. Ensuite, quand on scroll, on décale tout l'écran d'un pixel, et tous les 8 pixels scrollés, on redessine une colonne de tiles à la fin à droite de l'écran (on charge la suite de la map)
Voici ma fonction qui permet le scroll des 2 buffers (light et dark):
void shiftBackGround(void *buf0, void *buf1)
{
int i, j;
unsigned long int *light_pointeur, *dark_pointeur, light_pix, dark_pix;
light_pointeur = (unsigned long int *)buf0;
dark_pointeur = (unsigned long int *)buf1;
for (i=0;i<120;i++)
{
for(j=0;j<5;j++)
{
light_pix = *light_pointeur;
light_pix <<= 1;
light_pix |= *(light_pointeur+1)>>31;
*light_pointeur = light_pix;
light_pointeur++;

dark_pix = *dark_pointeur;
dark_pix <<= 1;
dark_pix |= *(dark_pointeur+1)>>31;
*dark_pointeur = dark_pix;
dark_pointeur++;
}
}
}
Le problême c'est que c'est pas très beau, les planes ne scrollent pas en même temps. J'ai essayé d'utiliser un double buffer, j'ai regardé et copié d'autres sources, mais rien y fait, ça reste moche quand on scroll.
J'ai packeté le code complet et un binaire si vous voulez juste voir le résultat: http://dd2.freezee.org/dd2.rar
Si quelqu'un trouve ou connait une solution, je prend smile

ps: le but est de faire un clone du jeu double dragon 2 pour game boy

2

Il y a un topic interessant ici.
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

3

Intéressant en effet. J'ai essayé et le code en assembleur est carrément plus rapide (environ d'un facteur 2)
Par contre j'y connais vraiment rien en assembleur, et le petit défaut de ce code est qu'il scroll uniquement la partie visible de l'écran. Il faudrait qu'il scroll au moins 8 pixels de plus, si par hasard quelqu'un veut bien m'expliquer cmt faire.
Je sais pas si t'as essayé mon code, mais en fait le problème je croie que c'est à cause des FastCopyScreen: j'en fait un pour copier les 2 buffers dans leur plane et je crois que c'est à cause de ça que j'ai des tout petits décalages entre les deux plane qui donnent des effets gênants.

4

remik (./3) :
Intéressant en effet. J'ai essayé et le code en assembleur est carrément plus rapide (environ d'un facteur 2)

je sais pas trop de quel code tu parles, mais il ne faut pas utiliser le code du post 0, il est lent c'était un test.
remik (./3) :
Par contre j'y connais vraiment rien en assembleur, et le petit défaut de ce code est qu'il scroll uniquement la partie visible de l'écran. Il faudrait qu'il scroll au moins 8 pixels de plus, si par hasard quelqu'un veut bien m'expliquer cmt faire.
Je sais pas si t'as essayé mon code, mais en fait le problème je croie que c'est à cause des FastCopyScreen: j'en fait un pour copier les 2 buffers dans leur plane et je crois que c'est à cause de ça que j'ai des tout petits décalages entre les deux plane qui donnent des effets gênants.

je vais regarder. mais pourquoi n'utilise tu pas les routines de scroll de extGraph tout simplement ? (puisque tu utilise extGraph)
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

5

Je parlais du code du post 3.
En fait ça ne m'est même pas venu à l'idée qu'il y avait une fonction de scroll dans extgraph. En tout cas elle a a peu près les mêmes performances que le scroll du post 3 (c-a-d bien mieux que ma fonction), donc merci pour cette suggestion parce que c'est une bonne idée
Il reste plus qu'à résoudre le problême de cette image qui ne tient pas en place smile

6

si j'ai bien compris ton problème est qu'il y a un petit décalage de temps entre la copie des deux buffer vers l'écran.
FastCopyScreen_R(buf1, GrayGetPlane(1)); pourtant tu fais bien les deux en même tempsFastCopyScreen_R(buf0, GrayGetPlane(0));
J'ai pas ma TI, je teste sous vti donc je peux pas trop voir tongue mais ça m'est jamais arrivé.
sinon l'image est très jolie smile
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

7

Ben moi ça me le fait sur ma ti et sur tiemu, pour appuyer mes dires voici une petite animation au ralentie qui illustre très bien le problême: http://dd2.freezee.org/anim.gif
On voit que le clair est dessiné avant le plane foncé

8

On ne peut pas accéder à l'image (403 - forbidden)
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

9

Fait actualiser ou copie coller le lien dans une nouvelle fenêtre, je crois que c'est à cause d'une protection du serveur

10

j'ai essayé.
edit : ah en fait ça ne fonctionne pas sous opera mais sous IE si cheeky
edit2: ah non ça marche partout maintenant t'as changé quelque chose ?
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

11

non non j'ai rien changé :/

12

Par ailleur quelqu'un sait comment comment on inverse (miroire) un sprite horizontalement? J'ai vu qu'on pouvait faire ça avec des sprites de largeur 8 avec extgraph...

13

> J'ai vu qu'on pouvait faire ça avec des sprites de largeur 8 avec extgraph...
Des sprites de largeur _multiple de_ 8 wink
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

14

lol merci! En plus c'est une routine efficace et rapide smile
Sinon personne n'a d'idée pour mon décalage des planes?

15

j'ai testé ton projet, et moi j'ai pas vu de décalage. C'est peut être du à la config de VTI /Ti-Emu...
Si tu utilise VTI, fais: clique droit, Emulation options, High LCD update frequency.

16

Nan sur ma calto je l'ai aussi le décalage, j'ai la version 3.10 de l'os

17

Après des heures et des heures et des nuits passées à chercher j'ai trouvé LA solution ultime à mon problème: GrayWaitNSwitches
J'appelle ça dans ma boucle principale et juste après j'appelle ma fonction redraw, et miracle, ça marche! Tout simplement parce que un switch de plane vient de s'opérer, alors en attendant le suivant on redessine l'écran. Fallait y penser smile Vous pouvez pas imaginer comme je suis soulagé d'avoir trouvé un truc qui marche et qui est pas du bidouillage de code.
D'ailleurs quelqu'un a essayé double dragon 2? Vous le trouvez pas excellent?

18

Hmmm va voir la doc de tigcc à la section double buffering y'aura peut-être des trucs qui t'intéresseront wink
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

19

Ben justement j'avais essayé le double buffering et en fait dans mon cas ça ne m'est pas utile (ou du moins pas pour l'instant). En fait le principal c'est que l'on dessine de façon synchronisée avec les switch de planes. Pour l'instant ça me suffit, si j'ai de nouveau des problêmes je me pencherais alors sur le double buffering

20

Euh pour le système de fichiers, dans quoi est-ce que je met mes sprites? Sachant que j'ai des données brutes (qui constituent les sprites) que j'ai besoin d'accéder. Quel type de fichier convient? Est-ce qu'un fichier str conviendrait, sachant que dans mes sprites il y a des caractères 0?

21

Si tu utilise pas énormément de sprites, autant mettre les sprites directement dans le programme comme ça tu bénéficie de la compression ppg.
Sinon, tu peux les mettre dans n'importe quel type de fichier (je conseillerais de faire des fichiers "data" ou "dat", il déja plusieurs jeu qui utilisent cette pseudo convention).
Perso je trouve qu'utiliser le type "str" est bête, parceque de toute façon l'OS va pas pouvoir l'ouvrir en tant que string, et ça pourrait induire en erreur des utilisateurs.

22

Ben en fait il se trouve que j'utilise énormément de sprites (et de tiles). En plus ya plusieurs niveaux, c'est un peu une perte de mémoire de charger tout les niveaux d'un coup (ça m'étonnerais que ce soit possible d'ailleurs, avec la restriction de 68k)
Moi je disais str parce que je sais pas quels sont les types de fichiers.
D'après la doc tigcc: DD DATA_TAG data tag (not used in expressions)
J'en fait quoi? Ca veut dire je fait un fichier avec toutes mes données dedans et je le finis en mettant le tag data?

23

./21:
> Perso je trouve qu'utiliser le type "str" est bête, parceque de toute façon l'OS va pas pouvoir l'ouvrir en tant que string, et ça pourrait induire en erreur des utilisateurs.
Non seulement ça, mais vu qu'un certain nombre de versions de TI-Connect font n'importe quoi avec, il ne faut surtout pas l'utiliser. Sauf exception, les programmes qui utilisaient des STR et ont été embêtés par cette connerie sont passés à d'autres fichiers:

./22: ce que tu veux est un OTH_TAG (0xF8). Il y a peut-être un exemple dans TIGCC (doc ou exemples). Au pire, il y a des tutorials par ci par là pour ce faire, et de nombreux programmes qui utilisent des fichiers spécifiques sont open source. Parmi ces programmes, TI-Chess et TI-Miner/TI-MineSweeper (à prendre sur http://tict.ticalc.org, pas sur http://ticalc.org tant que je ne me serai pas bougé les fesses pour mettre à jour ticalc...).
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

24

tu peux donner n'importe qu'elle "type" a ton fichier de données, la calculette s'en fou.

Je crois que DATA_TAG n'a rien à voir avec la création de fichiers de fichiers externes.

Regarde comment on crée un fichier avec la doc TIGCC ("I want to create a variable without using functions from stdio.h."). Une fois que tu sais faire ça, il suffit de modifier qlq octets à la fin du fichier pour changer le "type".

25

Ah ouaip excellent la doc de tigcc, j'ai trouvé les réponses à mon problème là http://tigcc.ticalc.org/doc/faq.html#55
Merci pour vos conseils smile

26

Pour charger mon fichier j'utilise le code suivant, que j'ai trouvé dans la fonction load highscore du démineur de la tict

HSym hsym;

unsigned char *p;

hsym=SymFind(SYMSTR_CONST("dd2sprt"));

if(!hsym.folder)

return;

p = (unsigned char*)(HeapDeref(DerefSym(hsym)->handle));
p += 2;

Ce qui marche très bien mais quand le fichier n'existe pas, la calculatrice crash avec une address error ou un truc dans le genre. En plus elle crash au moment où on test hsym.folder. Des suggestions pour éviter ça?
Sinon j'ai une autre question: au début, pour initialiser le jeu je fait pleins de malloc. Si il y en a un qui échoue (pointeur null), je quitte le programme avec return. Sauf que dans ce cas, je ne libère pas les malloc et je n'appelle pas GrayOff() et je ne restore pas l'écran. Est-ce que je drevait faire tout ça?

27

Oui.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

28

Pour savoir si un fichier existe, j'utilise SymFindPtr:

	SYM_ENTRY *sym = SymFindPtr(SYMSTR(FILE_NAME),0);
	if (!sym) {
		//fichier existe pas
	}


Faire plein de malloc et tester à chaque fois si ils réussissent ou pas, c'est lourd. Parfois tu peux simplement faire un gros malloc qui regroupe toute la mémoire. Pour rendre ça encore plus simple (merci Pollux), tu peux regroupper ce que tu veux allouer dans une structure:

au lieu de


char *a = malloc(100);
if (a==NULL)
return;
char *b = malloc(100);
if (b==NULL) {
free(a);
return;
}


tu peux faire

typedef struc AB {
char a[100];
char b[100];
};
AB *ab=malloc(sizeof(AB));
if (ab==NULL)
return;


29

Ben j'ai essayé ça:
if (SymFindPtr(SYMSTR_CONST("dd2sprt"), 0) == NULL)
return;

Et si le fichier existe pas il crash avant le return mourn quand il appelle SymFindPtr

Sinon je vais faire un gros malloc, merci pour l'idée top