Vous n'êtes pas identifié.
tu as deja posté un message sur une facon de reduire considerablement la place que prennet les sprites dans un programme. Mais je n'ai rien compris. pourrait expliquer comment faire ???
en fait j'essaie de reduire au max scorch pour le faire fonctionner sur graph100+. quelle est la taille max sur graph100+ pour un exe ?
Hors ligne
sans modifier l'histoire des sprites ont peut faire tomber le prog à49142 octets au lieu de 52356 octets. Mais le probleme c'est que dans les sources de duobab y a une "erreur synthax" et c'est un truc en ASM donc je n'y comprend rien. est ce que quelqu'un pourrait prendre les sources de duobab et corriger l'erreur pour que je continue d'essayer de reduire l'exe.
Hors ligne
je te repond .
en fait les sprites sur scorch sont en fait un tableau comme ca:
0 0 0 0 0 0 0 0
0 1 1 1 0 0 0 0
1 1 1 1 1 0 0 0
pour dessinner le tank .
Seulement ce sont du type char .
Masi on peut économiser de la plce en réflechissant.
regarde :
0 0 0 0 0 0 0 0 est un chiffre binaire de 8 digits et un char est un octet .
Vu que 1 octets est en fait un nombre binaire de 8 digits , on peut economiser de la plca comme ceci .
1-on se fait une table comme celle plus haut.
2- sachant que la conversion en décimal se fait comme ceci:
unsigned char =1ligne=1octet=a*128+b*64+c*32+d*16+e*8+f*4+g*2+h*1
Les lettres sont dans l'ordres des pixel.
(j' ai fait un exe visaul qui permet de dessinner un sprite et de le convertir en 8 octets si tu veux !)
Ensuite pour le dessiner faut faire une routine comme celle-ci :
unsigned char sprite[8]={0,0,0,0,0,0,0,0}
//met po des zero mais ce que t'as trouvé par ligne .
void drawsprite(x,y)
{unsigned char octetlu, i;
for[i=0;i<8;i++]
{
octetlu=sprite[i];
if(octetlu-128>=0) {octetlu=octetlu-128;pixelnoir(x,y+i);}
if(octetlu-64>=0) {octetlu=octetlu-64;pixelnoir(x+1,y+i);}
if(octetlu-32>=0) {octetlu=octetlu-32;pixelnoir(x+2,y+i);}
if(octetlu-16>=0) {octetlu=octetlu-16;pixelnoir(x+3,y+i);}
if(octetlu-8>=0) {octetlu=octetlu-8;pixelnoir(x+4,y+i);}
if(octetlu-4>=0) {octetlu=octetlu-4;pixelnoir(x+5,y+i);}
if(octetlu-2>=0) {octetlu=octetlu-2;pixelnoir(x+6,y+i);}
if(octetlu-1>=0) {octetlu=octetlu-1;pixelnoir(x+7,y+i);}
}
}
Normallement ça marche .
Hors ligne
je te remercie enormement mais pour l'instant je ne peux rien puisqu'il y a un bug "synthax error" que je ne sais pas resoudre car c'est de l'asm!
Hors ligne
son email : lionel.baboud@wanadoo.fr
c la seul ke g trouvé en 1 mois !
Hors ligne
Mail moi le bug ou/et passe moi les sources je verrai ce ke je peux faire (Avec mes povres connaissances
)
Hors ligne
Excusez moi je m'y connais pas bien (du tout ) en C mais bien plus en routines...
Alors juste comme ca, j'ai vu ca:
for[i=0;i<8;i++] { octetlu=sprite[i]; if(octetlu-128>=0) {octetlu=octetlu-128;pixelnoir(x,y+i);} if(octetlu-64>=0) {octetlu=octetlu-64;pixelnoir(x+1,y+i);} if(octetlu-32>=0) {octetlu=octetlu-32;pixelnoir(x+2,y+i);} if(octetlu-16>=0) {octetlu=octetlu-16;pixelnoir(x+3,y+i);} if(octetlu-8>=0) {octetlu=octetlu-8;pixelnoir(x+4,y+i);} if(octetlu-4>=0) {octetlu=octetlu-4;pixelnoir(x+5,y+i);} if(octetlu-2>=0) {octetlu=octetlu-2;pixelnoir(x+6,y+i);} if(octetlu-1>=0) {octetlu=octetlu-1;pixelnoir(x+7,y+i);} }
On pourrait pas faire ceci ou un truc du genre? (y'a surement des erreurs de syntaxe, et il fut déclarer j)
for[i=0;i<8;i++] { octetlu=sprite[i]; for [j=7;j>-1;j--] { if(octetlu-2^j>=0) {octetlu=octetlu-2^j;pixelnoir(x+7-j,y+i);} }}
Evidemment je ne sais pas si on peut mettre 2 exposant qq chose comme ca... mais si vous cherchez a gagner de la place, ca devrait vous aider non?
Hors ligne
ouais ça pourrait aller mais mon code doit etre sensiblement plus rapide, et comme il n'y a que 8 digits ...
Hors ligne
non "^" en C ne corespond pas a puissance mais au ou exclusif XOR
ton code devrait plutôt ressembler à ça :
for[i=0;i<8;i++] { octetlu=sprite[i]; for [j=0;j<8;j++] { if(octetlu-(1 << j)>=0) { octetlu = octetlu - (1 << j); pixelnoir(x + 7 - j, y + i); } } }
en C << et >> servent a décaller de tant de bits vers la droite ou vers la gauche, ça correspond à shl et shr en assembleur.
Hors ligne
Je me permet de faire 1 petite remarque:
C'est cette méthode de "compression" (entre "" car c pô ce qu'on peut appeler 1 vrai compression, just 1 type économique de codage) que jutilise dans MK.
Et donc, selon mon expérience personnelle, les routines d'affichage que vous proposez + haut sont bien trop lentes pour 1 jeu qui doit remplir l'ecran de sprites à chaque frame et en + le faire défiler (comme MK; donc.) Dc pour l'affichage, si vous utilisez cette méthose de stockage des données ( 8 pts/bit), je vous conseille d'ecrire directement ces octets dans la mémoire vidéo comme ca vs affichez les pts 8 par 8 et dc c bcp + rapide !
Voila ;-)
Hors ligne
Oui en effet au fait 'j'ai implémenté cette méthode dans TOUCHE, les sprite sont codés en en ascci dans le fichiers .dat et sont décodé en live.
Le problème pour afficher directement dans la mem vidéo 8 / 8 c'est que ça dépend où t'affiche sur l'écran, t'as trouvé une parade ?
Hors ligne
Je comprend pas trop ce que tu veix dire.
Mais ce que je fais, (comme l'écran défile point par point et non pas 8pts par 8 pts), je décale en live chaque rangée de 8 vers la gauche en fonction de la position de l'acran par rapport aux sprites, et comme ca je px faire défiler l'écran pt par pt. et tt ca en ASM bien sur.
Et je fais en sorte que les sprites en haut a gauche et en bas à droite ne sortent pas de la mémoire vidéo.
Et la g une routine parfaitement fiable et tres rapide (~12 fps).
Hors ligne
En fait mon pb c que l'écran est organisé par colonne de 8 pixels de large en partant d'en bas à droite donc si on veux écrir directement un sprite de de largeur <= 8 pixels dans une de ces colonnes, pas de problème mais quand c'est à cheval sur deux colonnes on ne peux plus utiliser cette méthode.
Hors ligne
sauf si tu passe en mode D3 qui est codé par lignes !!!
Mais de tt facons, même en C3 ma methode marche: au début je codais dans ce mode et pis g changé. En fait je fessais comme je t espliké : en calculant 1 décalage blablabla ...
voilou !
Hors ligne
essayez de faire cette méthode pour scorch, je voudrais po regarder le résultat ...
d' autre part c vrai que pour faire un remplissage d' éecran c la mellieure methode.
A rpopos de mode video ,vous avez déjà essayer d' eteinder la caltos dans 3Dtest.exe et Cube.exe ? le gars a du utiliser le mode D3 ou une conneri comme ça ...
Hors ligne