Vous n'êtes pas identifié.
Question conne:Une Sprite est elle oblig. en 8*8??Parce que j ai besoin d un plus gros objet pr mon jeu!!Le 16*16 n est pas envisageable??Pr Bomberman, est ce que le perso est un sprite??? :?: :?: :?:
Hors ligne
un sprite ca peut etre de la taille que l'on veut.
si tu regarde mes sources, je l'ai affiche pixel par pixel parceque ca me suffit je n'ai pas besoin que ce soit hyper rapide.
l'interet de faire des sprites 8*8 est de les afficher octets par octet (un procedé que je ne maitrise mais qui est rapide ), 16*16 ca permet de les afficher mots par mots ! (c'est ultra rapide et c'est ce que tuilise casiomax).
bomberman est meme composé de deux sprites (trop fort ce casiomax) de 16*16, un pour la tete et un pour le reste du corps.
Hors ligne
le plus simple c de dessiner tous les sprites sur une même image (cote à cote par exemple), d'enregistrer en .bmp et apres ds ton prog sur G100, tu lis le bmp et tu charge les sprites ds un tab.
Ou alors si tes sprites sont peu nombreux ou tres petits ( 4*4 p.ex) , ben t peux les "programmer" directement en codant le tableau ds ton code.
Hors ligne
"tu charge les sprites ds un tab." tu fais comment et ensuite pour les dessiner tu fais comment ???
exemple d'un sprite avec un tableau (mais c'est relativment lent, c'est que j'uitlise pour mes jeux )
char punch[1][7][7] =
{1,1,1,1,1,1,1,
1,0,0,0,0,0,1,
1,0,1,1,1,0,1,
1,0,0,0,0,0,1,
1,0,1,1,1,1,1,
1,0,1,0,0,0,0,
1,1,1,0,0,0,0};
"punch" c'est le nom du tableau. le premier chiffre c'est le nombre de sprite qu'il y a dans le tableau. on peut en mettre en effet plusieurs dans un tableau:
char curseur[2][5][6] ={
{
1,1,1,1,0,0,
0,1,1,1,1,0,
0,0,1,1,1,1,
0,1,1,1,1,0,
1,1,1,1,0,0,},
{
0,0,1,1,1,1,
0,1,1,1,1,0,
1,1,1,1,0,0,
0,1,1,1,1,0,
0,0,1,1,1,1,}};
le deuxieme chiffre, c'est le nombre de lignes et le troisieme c'est le nombre du colonnes.
ensuite il te faut une fonction qui lise le tableau et affiche un pixel dès qu'il y a un "1" dans le tableau.
voici la fonction:
/*affiche punch */
void drawpunch(unsigned char x, unsigned char y, unsigned char nb)
{int C,D;
for(C=0;C<7;C++){
for(D=0;D<7;D++){
if(punch[nb][D][C]==1) inv_pixel(x + C,y + D);}}}
inv_pixel c'est la fonction que j'utilise pour afficher un pixel.
punch[nb][D][C]: on retrouve le nom du tableau ou il y a le sprite.
dans drawpunch(unsigned char x, unsigned char y, unsigned char nb):
"x" et "y" sont les coordonnées du sprites et "nb" et le numero du sprites dans le tableau. Attention, on commence à 0. donc le premier sprites dans le tableau "punch" et le sprite de numero "0". mais le deuxieme sprite du tableau "curseur" à le numero "1".
Faire un tableau avec plusieurs sprites est utile quand il ya plusieurs sprites qui ont les meme dimmensions.
[D] est le nombre de ligne == le nombre pixel en hauteur du sprite
[C] est le nombre de colonne == le nombre de pixel en largeur.
si je veux adapter la fonction d'affichage pour le tableau "curseur", la fonction devient:
drawcurseur(unsigned char x, unsigned char y, unsigned char nb)
{int C,D;
for(C=0;E<6;C++){
for(D=0;F<5;D++){
if(punch[nb][D][C]==1) inv_pixel(x + C,y + D);}}}
si dans mon prog je veux afficher le deuxieme sprite du tableau "curseur" je fais texto:
drawcurseur(30,33,1);
j'espere que ca t'a aidé.
Hors ligne
drawcurseur(unsigned char x, unsigned char y, unsigned char nb)
{int C,D;
for(C=0;E<6;C++){
for(D=0;F<5;D++){
if(punch[nb][D][C]==1) inv_pixel(x + C,y + D);}}}
Super tes infos, mais c'ets pas
if(curseur[nb][D][C]==1)
plutot?
Hors ligne
c'est meme:
drawcurseur(unsigned char x, unsigned char y, unsigned char nb)
{int C,D;
for(C=0;C<6;C++){
for(D=0;D<5;D++){
if(curseur[nb][D][C]==1) inv_pixel(x + C,y + D);}}}
j'espere que ca aidera !
Hors ligne
@ mastermage: la facon dont tu stocke tes sprites est très peu économe en place, c pour ca que je te conseille (à toi et à tous) de les stocker bit par bit :
char punch[1][7][7] =
{1,1,1,1,1,1,1,
1,0,0,0,0,0,1,
1,0,1,1,1,0,1,
1,0,0,0,0,0,1,
1,0,1,1,1,1,1,
1,0,1,0,0,0,0,
1,1,1,0,0,0,0};
devient :
char punch[][7] = {127,65,93,65,95,80,112};
la place occupée est divisée par 7 !!!
Hors ligne
mastermage ????? ca doit etre une erreur.
t'aurais une fonction pour les afficher quand ils sont codés quand ca ?
Hors ligne
le @ mastermage est une erreur : c t adressé à toi.
Et pis oui g une fonction puisque c ce type de stockage que jutilise dans MarioKart.
Hors ligne
le fait que la place est divisé par 7 rendra les choses plus rapide ???
si c'est le cas je vais faire une fonction, mais malheureusement en C.
Hors ligne
Les fonctions de mastermage permettent d'afficher octet par octet! Il s'est cassé la tête à les faire, et moi j'en ai fait une librairie: Mx-Draw.h
Va la télécharger sur le site de L@rk (www.fgpstudios.fr.st) si tu veux utiliser ces fonctions. Il y a un exemple de code avec.
Hors ligne
à casioworld: non ca rend pas les choses plus rapides (je suppose que même avec ta méthose de stockage, tu affiche par octets) mais par contre ca libère pas mal de RAM surtout quant le nombre total de sprites s'éleve à 256 !
Mes fonctions d'affichage de MarioKart (1 pour les 8*8 par octet et une pour les 16*16 par mot) sont écrites en C et la rapidité est suffisante. Donc je pense que ca suffira pour toi aussi en C ! :-)
Hors ligne
Au fait en C il faut penser à utiliser les fonctions movemem et movedata qui utilisent (très probablement) l'instruction asm REP, ça va quand même plus vite que de faire une boucle for.
Hors ligne
disp_bmp c pareil. SInon pour copier un écran vous pouvez utiliser movedata, quiest tout aussi rapide! (movedata la ft en C de mxdraw)
Hors ligne
movedata existe dans TC (string.h mem.h)
void movedata(unsigned srcseg, unsigned srcoff, unsigned destseg, unsigned destoff, size_t n);
exemple:
#include <mem.h> #define MONO_BASE 0xB000 char buf[80*25*2]; /* saves the contents of the monochrome screen in buffer */ void save_mono_screen(char near *buffer) { movedata(MONO_BASE, 0, _DS, (unsigned)buffer, 80*25*2); } int main(void) { save_mono_screen(buf); return 0; }
Hors ligne
En fait on peut copier n'importe quel type de données d'une adresse une autre
Mais sinon je voulais savoir quel était l'instruction la plus rapide:
faire une boucle for (certainement pas)
faire une boucle qui fait la même chose mais en utilisant while
ou encore faire pareil mais avec des goto
??
Hors ligne
sans aucun conteste je pense que le goto est le plus rapide. Mais bon dans le genre compliqué ya pas mieux depuis l'invention de l'ASM
Hors ligne
C'est une bonne idée ça, mais fodre aussi mettre des heures le matin si c possible
Et pis chake modo a sa plage horaire ou un utilisateur que l'ondésignera, enfin bon, à ça devient compliké.
Hors ligne