1

j'aimerais une fonction fonctionnant comme GpBitBlt (GpTransBlt) mais inscrivant la partie recopiée dans un tableau (vers un Xdestination et Ydestination donné)

comme le font les fonctions de la lib definIt.h (spirit, mirror...) mais en allant chercher un sprite à un x et un y donné (pour un width et height donné) alors que ces fonctions travaillent sur un sprite unique (x = y = 0).

j'espère être a peu prés clair smile

merci !
gamer oui, mais gamer avant tout

2

-

3

oui ca ne m'avance pas bien plus !

j'ai bien evidemment essayé avant de venir poster ici, tu pense bien, mais je m'en sors pas avec les coordonnées.

ensuite, si tu lis bien je ne veux pas de l'ecran video comme tu dis, je veux construire une image à partir des tiles que je vais placer à des x y donnés.

si quelqu'un a une réponse plus constructive smile

en fait déjà je comprends pas vraiment le fonctionnement d'un tableau "image", et son système de coordonnées (apparemment on a 2 coordonnées pour chaque pixel en 8 bits) et donc encore moins comment aller checrher la bonne partie au bon endroit pour la coller dans un autre tableau au bon endroit.
je souhaite justement faire sans le SDK qui ne propose pas cette fonction (à ma connaissance) et donc je me retrouve un peu dans l'impasse, voila pourquoi quand on me dit "t'as qu'à te passer du SDK" je bondis smile


Q : "bonjour je suis un newbie, et je voudrais connaitre la fonction pour dessiner un carré"
R : "code en assembleur c'est bien tu verras et tu feras des scrolling différentiel sur 7 plans"


... il y a erreur sur la personne smile
si on veut progresser, laissez le temps à chacun de faire les choses à sa manière et à son rythme non ?

bon maintenant si quelqu'un à la réponse, mon rythme n'en serais que décuplé ^___^ !!
gamer oui, mais gamer avant tout

4

si g bien compris, tu as une grosse image et tu veut en afficher qu'une partie ?

ben si c ca, les fonction gp le fons déjà smile

tu donne au bitblt le x et y de depart ds ton image source, et la taille que tu veut afficher

c avec ca que gdl n'affiche que la partie 'reelle' des sprite, pour grapiller un peu de temps ^^

sinon, tu peut avoir tout tes sprites les uns a la suite des autre (attention, un seul sprite en hauteur) ds la meme image et afficher juste le sprite qui t'interesse

uchar * mon_sprite_qui_m_interesse = addresse_de_la_grosse_image + (numero_du_sprite*size_x*size_y*(bbp/2)) ;

apres donne l'add a gpbitblt, ainsi que la taille x et y du sprite et c bon smile
et la le mec il le pécho par le bras et il lui dit '

5

merci pour ta réponse, mais je crois pas que c'est exactement ce que je veux :

plus precisement, puisqu'apparemment je me suis pas clairement expliqué, je veux dupliquer à partir d'une image donnée un bout, un "sprite" quoi (x1, y1, width1, height1), vers une autre image donnée (pas l'écran) à x2, y2...
ce que fais gpBitBlt vers l'écran en fait.
quelqu'un m'avait-il compris ?

mon souci plus particulierement c'est que l'image source et destination n'ont pas la meme taille, quand je copie le sprite, je le fais au bon endroit mais j'ai qu'un gros gribouilli pasque je tape pas au bonnes coordonnées :confus
gamer oui, mais gamer avant tout

6

-

7

j'ai converti mon image avec gp32converter (8bits)
je copie l'image source vers l'image destination avec une double boucle
for (i..., i2..., ++i, ++i2)
for (j..., j2..., ++j, ++j2)


et j'arrive à la caser sur les bons X Y de destination, mais pas à prendre les bons X Y de l'image de départ.
donc, lorsque j'affiche l'image finale à chaque endroit ou je devrais avoir un sprite, j'ai un gribouilli parceque j'ai tapé au mauvais endroit dans la mémoire sur l'image source.

c'est la honte, mon problème doit être tout con, mais j'avoue que je suis coincé et que j'arrive pas à comprendre ce qui déconne dans mes coordonnées sad
gamer oui, mais gamer avant tout

8

-

9

(...) je capte pas trop la, p koi tu recopie l'image pour apres utiliser gpblit ?

tout simplement parceque mon image (image_dest) doit être générée à l'avance et pas à l'affichage, à partir de différents éléments de mon image de départ (tileset), mais ça je l'ai déjà expliqué.
ensuite je fais un GPBitBlt sur l'image "image_dest" mais là n'est pas le problème, je coince avant smile

tiens si ça peut t'éclairer voila le principe (ça ne marche pas du tout) :

for (i=x1, i2=x2; i<w1+width; ++i, ++i2) {
	for (j=y1, j2=y2+height; j<y1+height; ++j, --j2) {
		m = height - 1 - j + (height * i);
		if (*(tileset + m) != TRANSPARENT) {
			*(image_dest + j2 + (largeur_im * i2)) = *(tileset + m);
		}
	}
}


voila (en gros) ce que j'ai (j'ai zappé des variables pour faire plus simple)

on recoit x1, y1 coordonnées du sprite dans l'image source (tileset), et width, height de ce sprite.
on recoit x2, y2 coordonnées vers lesquels on copie le sprite dans l'image de destination (image_dest), et largeur_im la largeur de cette image.

la c'est le dernier code en date (qui marche pas plus que les autres tongue) mais j'ai essayé avec hauteur, largeur, en changeant les index i et j, en incrementant et decrementant... bref, pas la peine de me donner un code en disant "essaye ça", ça risque d'avoir déjà été le cas, j'aimerais un code "certain". merci !
gamer oui, mais gamer avant tout

10

au cas où tu ne saurais pas : --i ou ++i s'execute avant l'instruction "for" et i-- ou i++ aprés l'instruction "for" rien que là tu foire totalement dés la prémiére boucle puisque la valeur de depart est skipé , aprés autre chose , ça te serts striquement à rien de taper du code psedo optimisé pour faire mega bô si ça marche pas , d'autant plus que ça na jamais marché, alors fais comme tout le monde, établit un prototype simple de ta fonction avec des boucles "for" simples et un code plus lisible , bien rangé , si besoin declare une structure pour unifier tes variables, t'y gagneras en visibilité .


deux mots sur l'optimisation de code : une boucle ne pompe pas grand chose en ressources comparé à une some ou surtout à une multiplication , donc si tu veux optimiser tes boucles et en faire le moins possible ,faut faire ça:
fonction_2 (int i) {    // ton code } il faut cliquer dans la petit icone à droite main() {       for (i =0; i<5;i++)       {             fonction_1 (i);             fonction_2 (i);       } } fonction_1 (int i) {    // ton code }


d'aprés se que j'ai compris tu veux créer un sprite à parti de plusiers élements ds un buffer temporaire (ou tout simplement en faire un copie) puis l'afficher

il te fo savoir quelque chose , ds le system de la gp le depart de l'affichage se trouve en bas à gauche et non pas en haut à gauche comme les fonction blt laissent penser, donc ça parts du coin en bas à gauche vers le haut( si je ne me trompe pas)

donc le plus simple c'est de créer un tableau "unsigned char buffer_temp []" avec la taille de sprite final et de recopier les divers sprites dedans , aprés il te suffit de filler buffer_temp en paramétre à GpBitBlt ou à une des ces amies smile

bonne routewink

11

mouarf autant pour moi triso, avec mes ++variables, j'avais pas fait gaffe, tu fais bien de me le signaler !

bon OK merci de m'indiquer le sens de lecture du tableau, je vais déjà voir avec ça si ça marche mieux.
gamer oui, mais gamer avant tout

12

sinon tu peut utiliser un truc comme ca, avec des get/put pixel, c plus lent mais plus simple

for(cpt_x=0;cpt_x<width_a_copier;cpt_x++)
for(cpt_y=0;cpt_y<height_a_copier,cpt_y++)
set_color_buffer(x2+cpt_x, y2+cpt_y, size_y_img_dest, (uchar *)img_dest, get_color_buffer(cpt_x+x1, cpt_y+y1, size_y_img_src, (uchar *)img_src)) ;


void set_color_buffer(short x, short y, short size_y, unsigned char *buffer, unsigned char color)
{
*(buffer + x*size_y + (size_y-1-y)) = color ;
}

unsigned char get_color_buffer(short x, short y, short size_y, unsigned char *buffer)
{
return *(buffer + x*size_y + (size_y-1-y)) ;
}
et la le mec il le pécho par le bras et il lui dit '

13

encore mieux, met set_color_buffer et get_color_buffer en fonction inline.
Tu gagnes 2 appels de fonctions et avec des bouvles imbriqué qui risquent d'etre appeler pas mal de fois, a la fin on y gagne.
Arretez de m'appeler serge !

14

ok merci beaucoup, mes premiers tests ont l'air concluant ! ^___^
j'ai tout mis inline comme l'indique lama, les fonctions de rov (vu que c'est pas du temps réel ces fonctions font trés bien l'affaire)

je déconnais sur le sens de lecture, c'était bien ça ! en lisant comme pour une matrice (y*largeur + x au lieu de x*hauteur + y)

je vais pouvoir avancer, en espérant plus vous faire chier avec mes questions de nioub' wink
gamer oui, mais gamer avant tout