1

je suis en train de refaire un éditeur de niveaux du style planewinapi mais en c++ (avec borland).
Mon problème est que je n'arrive pas correctement à lireles fichiers .lvl et je ne vois pas où ca cloche?
Voilà ce que j'ai codé :

typedef struct
{
unsigned int tile: 10;
unsigned int pal: 3;
unsigned int flipv: 1;
unsigned int fliph: 1;
unsigned int user: 1;
} TILE;

TILE *mon_plan;

... // plus loin

mon_plan = (TILE *)malloc(Longueur*Largeur*sizeof(TILE));
memset(mon_plan, 0, Longueur*Largeur*sizeof(TILE));

FILE *LeNiveau;
LeNiveau = fopen(Nom_Du_Fichier,"rb");
fread(mon_plan, sizeof(TILE), Longueur*Largeur, LeNiveau);
fclose(LeNiveau);

et pour afficher un tile je n'ai plus qu'a récuperer son numéro et l'état des flip : mon_plan[X+Y*map_longueur].tile, .fliph et .flipv;

lorsque j'affiche la map, G 1 tile sur 2 qui disparait? (le 2 affiché correspond au 3 en réalité, le 3 au 5, le 4 au 7, ...)

plan.bmp
au lieu de
A.bmp
PS:ne faite pas attention aux couleurs et aux flip non respectés

2

typedef struct
{
unsigned int tile: 10;
unsigned int pal: 3;
unsigned int flipv: 1;
unsigned int fliph: 1;
unsigned int user: 1;
} TILE;

TILE *mon_plan;

... // plus loin

mon_plan = (TILE *)malloc(Longueur*Largeur*sizeof(TILE));
memset(mon_plan, 0, Longueur*Largeur*sizeof(TILE));

FILE *LeNiveau;
LeNiveau = fopen(Nom_Du_Fichier,"rb");
fread(mon_plan, sizeof(TILE), Longueur*Largeur, LeNiveau);
fclose(LeNiveau);

C'est du C ca pas du c++ roll
La version de planewinapi est obsolete je comprend pourquoi tu veux en faire un..
Je pense pas que c'est un probleme fe format mais plutôt un probleme de code donc sur ca a part avoir le code source je peut pas trop t'aider.
Sinon le screen couleur est bien je me demande comment tu fait pour les obtenirs...
Voila ca fait longtemps que j'avais pas posté. wink

Si dieux existe alors Armin van Buuren en est 1!!
Pour me contacter sur msn:mastergb@hotmail.com

3

typedef struct
{
unsigned int tile: 10;
unsigned int pal: 3;
unsigned int flipv: 1;
unsigned int fliph: 1;
unsigned int user: 1;
} TILE;

il faut aussi savoir que cette structure n'est pas tout a fait portable de ti aux pc.
(Il y a des chances qu'il aligne cette structure sur un mot 32 bits, alors que l'alignement doit rester 16-bits).

4

kler!
PpHd a raison!
Pour PC utilise plutot SHORT pour VC++ et je pense que c'est pareil pour Borland (je vois pas pourquoi ya des gens qui s'entete avec borland lol!)


typedef struct
{
unsigned SHORT tile: 10;
unsigned SHORT pal: 3;
unsigned SHORT flipv: 1;
unsigned SHORT fliph: 1;
unsigned SHORT user: 1;
} TILE;

Tiens 2eme post depuis longtemps.. Ca annonce peut etre un retour grin
Si dieux existe alors Armin van Buuren en est 1!!
Pour me contacter sur msn:mastergb@hotmail.com

5

mastergb1 :
C'est du C ca pas du c++ roll
La version de planewinapi est obsolete je comprend pourquoi tu veux en faire un..
Je pense pas que c'est un probleme fe format mais plutôt un probleme de code donc sur ca a part avoir le code source je peut pas trop t'aider.
Sinon le screen couleur est bien je me demande comment tu fait pour les obtenirs...
Voila ca fait longtemps que j'avais pas posté. wink

oui je sais que cette partie est en C, c'est un peu un abus de language de dire C++ juste parce ce que j'utilise borland mais bon.
avec planewinapi en 1024 tiles le prog plantait quand j'ouvrais ma map, mais c'est surtout sur le fait que je doivent encore remanier les map derrière pour que ça soit utilisable par SM, sinon planewinapi est un bon prog.
pour le screen j'ai trouvé l'arme ultime (rien a voir avec l'anime) : SMILE
un prog conçu exclusivement pour SM

Ca fait longtemps que tu n'as pas posté? désolé de te réveiller grin
PpHd :
il faut aussi savoir que cette structure n'est pas tout a fait portable de ti aux pc. (Il y a des chances qu'il aligne cette structure sur un mot 32 bits, alors que l'alignement doit rester 16-bits).

en tapant
   for(unsigned int i=0;i<Longueur;i++)
   {
    for(unsigned int j=0;j<Largeur;j++)
    {
     valeur = fgetc(LeNiveau);
     valeur += fgetc(LeNiveau)<<8;
     memset(mon_planT+j+i*Largeur, valeur, 1);
    }
   }

ça m'affiche le tout correctement (hormis les flips).
il doit y avoir une histoire d'inversoin des octets quelque part?
quand j'avais fait mon prog en VB je lisait octet par octet => pas de problème mais c'était loooonnnng!

je fais encore des test et je vous informe si j'ai compris d'où vient le pb

6

Je ne suis meme pas sur que ca soit suffisant.
Tu devrais presque y aller a coup de unsigned short + masque et decalage.

7

C'est cool avec des unsigned short ça marche!!!
je vous tire ma casquette!

8

en fait ça trouve le numéro du tile (je n'ai pas testé avec plus de 256 tiles mais les flip ne correspondent pas!
en fait sur un tile flippé H+V, H=0, V=0 et PAL=3.
G l'impression que sur TI on lit xxxxxxxxxxPPPHVU et sur PC xxPPPHVUxxxxxxxx ; à confirmer!

9

J'ai trouvé une solution mais je dois vraiment faire des test avec plus de 256 tiles.
Si vous voulez vous pouvez déjà télécharger ce que j'ai fait ici

10

>G l'impression que sur TI on lit xxxxxxxxxxPPPHVU et sur PC xxPPPHVUxxxxxxxx ; à confirmer!
Je confirme grin

11

short foo;
asm("xchgb %b0,%h0":"+q"(foo));

long bar;
asm("bswap %0":"+r"(bar));

avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

12

et C quoi ça?

13

De l'assembleur inline GCC pour mettre les bits dans le bon ordre sur PC.

L'équivalent 68k (si tu préfères faire tes échanges de bits en temps d'exécution), c'est:
short foo;
asm("ror.w #8,%0":"+d"(foo));

long bar;
asm("swap %0":"+d"(bar));
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

14

Kevin Kofler :
De l'assembleur inline GCC pour mettre les bits dans le bon ordre sur PC.

L'équivalent 68k (si tu préfères faire tes échanges de bits en temps d'exécution), c'est:
short foo;
asm("ror.w #8,%0":"+d"(foo));

long bar;
asm("swap %0":"+d"(bar));


et comment je l'utilise?
Désolé mais l'asm n'est pas encore à ma portée. je comprend juste qu'il y a un décallage de 8bits (équivalent de <<8 je suppose)

15

Tu fais un copier-coller de ma ligne en remplaçant foo ou bar par le vrai nom de la variable.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

16

Si tu preferes:

unsigned short convert (unsigned short x)
{
 return ((x<<8)&0xFF00) | ((x>>8) & 0x00FF);
}