Posté le 28/08/2013 00:11
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 127 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 28/08/2013 00:30 | #
j'ai trouvé ca dans les sources de gravity duck, ca pourrait peut-etre intéresser
static void tileset_horizontal_symmetry(Tileset* tileset)
{
int byte_width, i, x, y;
unsigned char* line;
byte_width = (tileset->width-1)/8+1;
line = malloc(byte_width);
if(!line) return;
for(i=0 ; i<tileset->length ; i++) {
for(y=0 ; y<tileset->height ; y++) {
memset(line, 0, byte_width);
for(x=0 ; x<tileset->width ; x++) {
if(*(tileset->tile[i]+y*byte_width+x/8) & 128>>(x%8))
line[(tileset->width-x-1)/8] |= 128>>((tileset->width-x-1)%8);
}
memcpy(tileset->tile[i]+y*byte_width, line, byte_width);
}
}
free(line);
}
static void tileset_vertical_symmetry(Tileset* tileset)
{
int byte_width, i, y;
unsigned char* line;
byte_width = (tileset->width-1)/8+1;
line = malloc(byte_width);
if(!line) return;
for(i=0 ; i<tileset->length ; i++) {
for(y=0 ; y<tileset->height/2 ; y++) {
memcpy(line, tileset->tile[i]+y*byte_width, byte_width);
memcpy(tileset->tile[i]+y*byte_width, tileset->tile[i]+(tileset->height-1-y)*byte_width, byte_width);
memcpy(tileset->tile[i]+(tileset->height-1-y)*byte_width, line, byte_width);
}
}
free(line);
}
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 28/08/2013 00:43 | #
C'était justement ce que j'étais en train de regarder
Mais je n'arrive pas l'appliquer à mon projet, j'aimerais que ça me renvoie juste le sprite inversé, mais là ça renvoie rien et j'ai l'impression que ça modifie celui que je pourrais mettre en arguement.
Citer : Posté le 28/08/2013 11:48 | #
Tu peux faire 2 sprites, ça prend 3 secondes d'inverser avec paint et coder avec sprite coder.
Citer : Posté le 28/08/2013 12:58 | #
ben le probleme c'est que si tu as beaucoup de sprites, c'est assez long a faire et ca prend 2* plus de place que de faire une fonction qui inverse le sprite
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 28/08/2013 13:03 | #
Oui surtout que en plus j'ai un masque pour chaque sprite, c'est juste embêtant. Mais si personne n'a de solutions, alors je vais faire comme ça :/
Citer : Posté le 28/08/2013 16:46 | #
j'avais fait une formule pour des sprites de 2*2 a maximum 8*8 (écrite sur du papier durant un moment ou je me fessais chier), si tu veux je peux te la passer (a vrai dire, j'avais fait des formules de rotation et de symétrie ce jour là, mais je n'avais pas prévu pour plus large qu'un char).
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 28/08/2013 16:59 | #
Merci mais mes sprites sont trop grands du coup :/
Pas grave j'ai fait des images symétriques à la main
Citer : Posté le 28/08/2013 18:30 | #
Adapte celle-ci, tirée de Orton :
{
[purple]int[/purple] x, y, byte_width = ((width-1)>>3)+1;
[b][blue]for[/blue][/b](y=[maroon]0[/maroon] ; y<height ; y++) {
[b][blue]for[/blue][/b](x=[maroon]0[/maroon] ; x<byte_width ; x++) destination[y*byte_width+x] = [maroon]0[/maroon];
[b][blue]for[/blue][/b](x=[maroon]0[/maroon] ; x<width ; x++) {
[b][blue]if[/blue][/b](source[y*byte_width+(x>>3)] & (128>>(x&7)))
destination[y*byte_width+((width-x-1)>>3)] |= [maroon]128[/maroon]>>((width-x-1)&7);
}
}
}
Citer : Posté le 28/08/2013 21:01 | #
Ninestar, si tu veux, je peux faire une version pour des Short (16 pixels) ou même des Int (32 pixels)
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 28/08/2013 21:40 | #
Merci Al3x.
Oui je veux bien une pour les shorts Limachi
Attention c'est pour la symétrie horizontale celle là
Ajouté le 28/08/2013 à 21:43 :
Enfin, non en fait puisque j'ai que des unsigned char. c'est juste que si la largeur c'est 8 alors il suffit d'inverser, mais si c'est 16 alors il faut inverser et inter changer deux char consécutifs en plus
Citer : Posté le 28/08/2013 23:14 | #
tu en as besoins quand?
et pour les char que tu transforme en short, il suffit de faire cela:
short_sprite[0]=char_sprite[1]|char_sprite[0]<<8; //non, je n'ai pas interverti les cases
et a la fin
sprite[1]=(unsigned char) short_sprite[0];
sprite[0]=(unsigned char)(short_sprite[0]>>8);
Ajouté le 28/08/2013 à 23:15 :
l'avantage d'utiliser un short est qu'il y a moins de manipulations a faire que si on doit passer par deux char (et la formule est plus propre 8) )
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 28/08/2013 23:52 | #
J'en ai besoin juste pour l'affichage, pas besoin de le garder.
En gros j'ai mis une condition :
si direction == 1
ML_bmp_or(sprite_d_poissons[1], ...);
si direction == -1
ML_bmp_or(sprite_g_poissons[1], ...);
Il faudrait que ça fasse :
si direction == 1
ML_bmp_or(sprite_poissons[1], ...);
si direction == -1
ML_bmp_or(symetrie_verticale(sprite_poissons[1], largeur, hauteur), ...);
avec largeur = 4 ou 8 et hauteur ce qu'on veut.
sprite_poissons est un tableau de char
Après comment est faite la fonction c'est toi qui vois, moi tant que ça fonctionne c'est bon
Citer : Posté le 29/08/2013 00:01 | #
ok, je te ferais cette fonction, je pense que je te la donnerais demain, (ou aujourd'hui, vu qu'on est minuit) cette nuit je ne vais pas coder.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 29/08/2013 00:20 | #
Ok c'est parfait, merci beaucoup !
Citer : Posté le 29/08/2013 00:33 | #
poste la aussi sur ce topic, au cas ou quelqu'un en aurait besoin
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 29/08/2013 22:43 | #
J'ai etrouvé ma formule, voici ce que ça donne en pseudo C-Mathématique:
A=0 i=0
S[A] = Σ| ((T[A]&(1<<(M-i)))>>(2*(M/2-i)))
A→M i→M
et donc en c, je le traduis en:
void symetrie_verticale(unsigned [purple]char[/purple] *sprite, [purple]int[/purple] width, [purple]int[/purple] height)
{
[purple]unsigned int[/purple] tmpIn,tmpOut;
[purple]int[/purple] x,y,i;
[b][blue]for[/blue][/b](y=[maroon]0[/maroon];y<height;++y)
{
[green]//ces 4 [b][blue]if[/blue][/b] peuvent être optimisés, mais j'ai eut la flemme de le faire[/green]
[b][blue]if[/blue][/b](width<=[maroon]8[/maroon]) tmpIn=sprite[y];
[b][blue]if[/blue][/b](width<=[maroon]16[/maroon]&&width>8) tmpIn=sprite[2*y]<<8|sprite[2*y+1];
[b][blue]if[/blue][/b](width<=[maroon]24[/maroon]&&width>16) tmpIn=sprite[3*y]<<16|sprite[3*y+1]<<8|sprite[3*y+2];
[b][blue]if[/blue][/b](width>24) tmpIn=sprite[4*y]<<24|sprite[4*y+1]<<16|sprite[4*y+2]<<8|sprite[4*y+3];
tmpOut=[maroon]0[/maroon];
[b][blue]for[/blue][/b](x=[maroon]0[/maroon];x<width;++x)
{
tmpOut|=(tmpIn&(1<<(width-x)))>>(2*(width/2-i)));
}
[green]//de même ici les If aurraient pu être simplifiés[/green]
[b][blue]if[/blue][/b](width<=[maroon]8[/maroon]) sprite[y]=tmpOut;
[b][blue]if[/blue][/b](width<=[maroon]16[/maroon]&&width>8) {sprite[y*2]=tmpOut>>8;sprite[y*2+1]=(unsigned char)tmpOut};
[b][blue]if[/blue][/b](width<=[maroon]24[/maroon]&&width>16) {sprite[y*3]=tmpOut>>16;sprite[y*3+1]=(unsigne char)tmpOut>>8;sprite[y*3+2]=(unsigned char)tmpOut};
[b][blue]if[/blue][/b](width>24) {sprite[y*4]=tmpOut>>24;(unsigne char)sprite[y*4+1]=tmpOut>>16;sprite[y*4+2]=(unsigne char)tmpOut>>8;sprite[y*4+3]=(unsigned char)tmpOut};
}
}
j'ai écrit cette fonction en direct, je ne l'ai pas testée, dis moi si il y a des problèmes.
(de toute façon, je vais faire des formules de rotation et de symétrie dans ma Lib graphique, je vais sans doute refaire une nouvelle version de cette formule)
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 29/08/2013 23:06 | #
Merci, cependant la code ne fait rien :/
Il faudrait qu'il me renvoie un unsigned char*
J'ai corrigé les diverses erreurs de syntaxes qui trainaient (unsigne au lieu de unsigned ...)
{
[purple]unsigned int[/purple] tmpIn,tmpOut;
[purple]int[/purple] x,y,i;
[b][blue]for[/blue][/b](y=[maroon]0[/maroon];y<height;++y)
{
[green]//ces 4 [b][blue]if[/blue][/b] peuvent être optimisés, mais j'ai eut la flemme de le faire[/green]
[b][blue]if[/blue][/b](width<=[maroon]8[/maroon]) tmpIn=sprite[y];
[b][blue]if[/blue][/b](width<=[maroon]16[/maroon]&&width>8) tmpIn=sprite[2*y]<<8|sprite[2*y+1];
[b][blue]if[/blue][/b](width<=[maroon]24[/maroon]&&width>16) tmpIn=sprite[3*y]<<16|sprite[3*y+1]<<8|sprite[3*y+2];
[b][blue]if[/blue][/b](width>24) tmpIn=sprite[4*y]<<24|sprite[4*y+1]<<16|sprite[4*y+2]<<8|sprite[4*y+3];
tmpOut=[maroon]0[/maroon];
[b][blue]for[/blue][/b](x=[maroon]0[/maroon];x<width;++x)
{
tmpOut|=(tmpIn&(1<<(width-x)))>>(2*(width/2-i));
}
[green]//de même ici les If aurraient pu être simplifiés[/green]
[b][blue]if[/blue][/b](width<=[maroon]8[/maroon]) sprite[y]=tmpOut;
[b][blue]if[/blue][/b](width<=[maroon]16[/maroon]&&width>8) {sprite[y*2]=tmpOut>>8;sprite[y*2+1]=(unsigned char)tmpOut;}
[b][blue]if[/blue][/b](width<=[maroon]24[/maroon]&&width>16) {sprite[y*3]=tmpOut>>16;sprite[y*3+1]=(unsigned char)tmpOut>>8; sprite[y*3+2]=(unsigned char)tmpOut;}
[b][blue]if[/blue][/b](width>24) {sprite[y*4]=tmpOut>>24;(unsigned char)sprite[y*4+1]=tmpOut>>16;sprite[y*4+2]=(unsigned char)tmpOut>>8;sprite[y*4+3]=(unsigned char)tmpOut;}
}
}
Ajouté le 29/08/2013 à 23:13 :
D'ailleurs il existe une astuce pour remplir un tableau avec des valeurs choisies ?
Par exemple pouvoir faire comme à l'initialisation.
int tab[] = {1,2,3}
Parce que faire plus tard
tab[] = {1,2,3}
ça fonctionne pas :/
Citer : Posté le 29/08/2013 23:23 | #
j'ai deja essayé, non (au vu de mes connaissance, donc peut-etre)
mais si tu es en C++, tu peut faire
//code inutile
int tableauTemp[20]={1,2,3,4};
for(int a =0;a<20;a++)tableau[a]=tableauTemp[a]
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 30/08/2013 00:28 | #
a, pardon, il devait te renvoyer un tableau? bon, je te fais la modif qui permet de l'utiliser correctement alors:
unsigned char* symetrie_verticale(unsigned [purple]char[/purple] *sprite, [purple]int[/purple] width, [purple]int[/purple] height)
{
[purple]unsigned int[/purple] tmpIn,tmpOut;
[purple]unsigned char[/purple] *out;
[purple]int[/purple] x,y,i;
out=(unsigned char*)malloc(height*(width>>8));
[b][blue]for[/blue][/b](y=[maroon]0[/maroon];y<height;++y)
{
[green]//ces 4 [b][blue]if[/blue][/b] peuvent être optimisés, mais j'ai eut la flemme de le faire[/green]
[b][blue]if[/blue][/b](width<=[maroon]8[/maroon]) tmpIn=sprite[y];
[b][blue]if[/blue][/b](width<=[maroon]16[/maroon]&&width>8) tmpIn=sprite[2*y]<<8|sprite[2*y+1];
[b][blue]if[/blue][/b](width<=[maroon]24[/maroon]&&width>16) tmpIn=sprite[3*y]<<16|sprite[3*y+1]<<8|sprite[3*y+2];
[b][blue]if[/blue][/b](width>24) tmpIn=sprite[4*y]<<24|sprite[4*y+1]<<16|sprite[4*y+2]<<8|sprite[4*y+3];
tmpOut=[maroon]0[/maroon];
[b][blue]for[/blue][/b](x=[maroon]0[/maroon];x<width;++x)
{
tmpOut|=(tmpIn&(1<<(width-x)))>>(2*(width/2-i));
}
[green]//de même ici les If aurraient pu être simplifiés[/green]
[b][blue]if[/blue][/b](width<=[maroon]8[/maroon]) out[y]=tmpOut;
[b][blue]if[/blue][/b](width<=[maroon]16[/maroon]&&width>8) {out[y*2]=tmpOut>>8;out[y*2+1]=(unsigned char)tmpOut;}
[b][blue]if[/blue][/b](width<=[maroon]24[/maroon]&&width>16) {out[y*3]=tmpOut>>16;out[y*3+1]=(unsigned char)tmpOut>>8; out[y*3+2]=(unsigned char)tmpOut;}
[b][blue]if[/blue][/b](width>24) {out[y*4]=tmpOut>>24;(unsigned char)out[y*4+1]=tmpOut>>16;out[y*4+2]=(unsigned char)tmpOut>>8;out[y*4+3]=(unsigned char)tmpOut;}
}
[b][blue]return[/blue][/b] out;
}
la version précédente modifiait directement le sprite, celle-ci crée un nouveau sprite inversé horizontalement du sprite entré en param.
Et oui, il est possible de modifier de manière brute le contenu d'un tableau avec des memcpy() (fonction de je ne sais plus quelle lib, une des disponibles dans le SDK de casio) qui permet de copier rapidement des zones de mémoire. Si tu as besoins d'un exemple, je t'en trouverais un.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 30/08/2013 00:48 | #
memcpy est dans "string.h"
je l'utilise pour les fond d'écrans :
unsigned char fond[] = {0x42, ...};
memcpy(ML_vram_adress(), fond, 1024);
ML_display_vram();
ce qui est bien plus rapide que ML_bmp_or(fond, 0, 0, 128, 64)