Allegro, sprite, timer,masked_blit [Résolu]

noSnoR 62 Messages postés samedi 5 mars 2005Date d'inscription 11 avril 2006 Dernière intervention - 29 déc. 2005 à 19:09 - Dernière réponse : dletozeun 546 Messages postés vendredi 13 février 2004Date d'inscription 9 janvier 2008 Dernière intervention
- 2 janv. 2006 à 15:17
J'ai déjà un peu cherché sur le site, mais je n'ai rien trouvé, et dans
tous les tuto que j'ai pu utiliser rien n'etait dit à ce sujet...

Quelqu'un pourrai m'aider pour afficher qu'une partie d'un fichier image ? Par exemple:



prenons un sprite qui a pour dimension 60*30 (pour les besoins de la science...).

Je déclare tous ce dont j'ai besoin :



bool quit = false;

BITMAP *buffer,*sprite,*layer1,*layer2,*layer3;

... //initialisation et autre rejouissance...



buffer = create_bitmap(WIDTH,HEIGHT);//Respectivement 800*600... Pour
avoir de la place ^^ ... Définis auparavant, inutile de le mettre ici.

sprite = load_bitmap("sprite.bmp",NULL);

layer1 = create_bitmap(20,30);

layer2 = create_bitmap(20,30);

layer3 = create_bitmap(20,30);

while(! quit)

{

blit(sprite,layer1,20,30,0,0,layer1->w,layer1->h)

...//etc, même methode pour le reste... blit avec des dimensions différentes.

if(key[KEY_ESC]) quit = true;

}

Bon, je ne sais pas si c'est vraiment comprehensible, alors voilà ce que je veut faire en gros :

Une fois le sprite chargé, ne prendre que ce qu'il y a dans le
rectangle (0,0)(20,30), le transferer au layer1 (d'où dimmension),
ensuite prendre ce qu'il y a dans le rectangle (20,30)(40,30), faire de
même avec le layer2, ainsi de suite, de sorte à avoir des calques que
le pourrai faire alterner...



Ce n'est pas mon seul problème... J'aimerai en apprendre plus sur le
timer. Je sais le définir, et ainsi l'incrémenter toute les secondes,
de manière constance, mais j'aimerai savoir, une fois ceci fais,
comment m'en servir dans le programme...



Une dernière : comment utiliser masked_blit ? Où trouver des infos
complete sur cette fonction, autrement que dans draw.h (j'imagine qu'il
est dedans... enfin dans tous les .h que reunis allegro quoi).



Voilà, merci d'avance !
Afficher la suite 

10 réponses

Répondre au sujet
dletozeun 546 Messages postés vendredi 13 février 2004Date d'inscription 9 janvier 2008 Dernière intervention - 30 déc. 2005 à 20:10
+3
Utile
oula bon alors moi ca fais un moment que j'ai pas fait de Allegro! ;) Je suis passé a opengl donc je v essayer de te renseigner mais ca va peut etre pas etre precis!

J'espere a voir bien compris....donc tu as une image de 60*30 et tu veux la diviser en 3 partie que tu mettrais dans les differents buffers layer1, layer2...

Mais je vois pas bien une chose parce que avec blit tu peux justement prndre une certaine zone du buffer pour le copier dans un autre?
blit c comme ca: ?
blit(source,destination,Xsource,Ysource,Xdest,Ydest,width, height);

avec les coordonnées Xdest,Ydest,Xsource,Ysource comme coordonnées du coin en haut a gauche du buffer des dest ou source...si je me souviens bien?
donc ou est le prb? tu peux faire:

blit(sprite,layer1,0,0,0,0,layer1->w,layer1->h);
puis,
blit(sprite,layer2,20,0,0,0,layer1->w,layer1->h);
puis,
blit(sprite,layer3,40,0,0,0,layer1->w,layer1->h);
non?


Et puis pour les timers c pas compliqué du tout , j'ai des cours la dessus venat de programmation world mais ils ont des prb echniques pour le moment....
donc voila, premierement on initialise le timer:

dans ta fct d'initilalisation tu mets:

//cette variable est declarée en entete
volatile int timer=0;

// dans ta fct d'init
install_timer();//installe le timer d'allegro
install_int_ex(time,MSEC_TO_TIMER(10)); // appelle la fct time(), au dessous toutes les 10 ms
LOCK_VARIABLE(timer);// ca je sais plus ce que ca veux dire mais fo pas l'oublier
LOCK_FUNCTION(time); //ca aussi
//fin de l'init

ensuite tu doit declarer cette fct qui va ectre appelée justement toutes les 10 ms et qui vas incrementer la varialble timer toutes les 10 ms
void time()
{
timer++;
}
END_OF_FUNCTION(time); //ne surtout pas oublier cette macro

sinon tu peux initialiser ton timer de plein de facons:

//Appelle la fonction time toutes les 2 secondes
install_int_ex(time,SECS_TO_TIMER(2));

//Appelle la fonction time() toutes les 10 millisecondes
install_int_ex(time,MSEC_TO_TIMER(10));

//Appelle la fonction time() 2 fois par seconde
install_int_ex(time,BPS_TO_TIMER(2));

//Appelle la fonction time() 4 fois par minute
install_int_ex(time,BPM_TO_TIMER(4));

voila!

donc ce que tu fais c'est que en reprenant l'initialisation du debut, tu appelle la fct qui se charge des calcul dans ton prog tant que la variable timer n'a pas pas atteind la valeur 200 ( par exemple) Et des que cette caleur est atteinnte tu mets a 0 la var timer et tu affiche ce qu'il faut afficher.
Ainsi ta fct logique (chargée de tout les calculs ) est appelée un certain nombre de fois (que tu a fixé avec la valeur 200) avant chaque nouvel affichage de de facon constante!
Il faut aussi que tu veille a ne pas demander a allegro d'afficher tant que la valeur 200 (ici) n'est pas atteinte, sinon c'est inutile...

J'espere que c'est comprehensible...mais c difficile de faire un petit courd la dessus dans un post!
Sinon si tu me donne ton adresse email ou msn je pourrais t'envoyer ce que j'ai ma dessus...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de dletozeun
noSnoR 62 Messages postés samedi 5 mars 2005Date d'inscription 11 avril 2006 Dernière intervention - 29 déc. 2005 à 19:11
0
Utile
Barf ! Erreur dans les dimensions :

les voici :

rectangle 1 : (0,0,20,30)

rectangle 2 : (20,0,40,30)

Ainsi de suite...
Commenter la réponse de noSnoR
noSnoR 62 Messages postés samedi 5 mars 2005Date d'inscription 11 avril 2006 Dernière intervention - 30 déc. 2005 à 22:44
0
Utile
Très bien exactement ce qu'il me fallait par rapport à blit ! Je me
disais qu'il y avais quelque chose de resemblant pour les coordonnées
source et destination...

Pour le timer aussi c'est ce que je cherchais... Merci bien !



si tu a des cours, doc ou autre utilisation, mon adresse msn est delafontaynesecheoyfonddelaforest@hotmail.fr ()... Vala !

(PS : Si tu a aussi quelques trucs sur l'utilisation des palettes... Si
je charge un TGA, pour m'en faire un curseur decent, je me retrouve
avec le canal alpha devenu blanc... enfin bref ^^ )
Commenter la réponse de noSnoR
dletozeun 546 Messages postés vendredi 13 février 2004Date d'inscription 9 janvier 2008 Dernière intervention - 30 déc. 2005 à 23:44
0
Utile
de rien!
T'a pas plus cours come adresse email?? :D Par contre t'aurais mieux fais de me la donner dans un message privé...
Je t'enverrais ca quand je pourrais...

Et pour la transparence Pour ton curseur il suffit de mettre la partie que tu veux rendre transparente en rose fushia dans ton tile . C'est a dire que tu choisi une couleur pour le fond qui les composantes rvb suivantes: 255,0,255
Et tu rajoute dans ta fct d'init d'allegro : text_mode(-1);
Quoique des fois ca marche sans ca mais on sait jamais...

Par contre ca c'est juste une transparence brutale! Ca te permet pas de rendre plus ou monis opaque certaines parties de tes tiles! Pour ca il faut des textures en tga ou autre formats qui conserve la couche alpha.
Commenter la réponse de dletozeun
noSnoR 62 Messages postés samedi 5 mars 2005Date d'inscription 11 avril 2006 Dernière intervention - 31 déc. 2005 à 15:26
0
Utile
ok, ce sera juste pour mon curseur de toute manière... Mais justement,
normalement mon TGA conserve ce canal, aussi je ne devrai pas avoir à
mettre le fond rose... Etant donné que j'ai choisi ce format justement
pour ça.



N'y a-t-il pas de fonction permettant de rendre tranparents tous les
pixels d'une certaine couleurs, rapidement (je pourrai balayer mon
bitmap, faire un get pixel, et si je trouve la valeur qui me gène, je
fait un putpixel de la couleur d'un autre bitmap juste créé, c'est à
dire sans couleur... Je ne sais pas si ça marcherai très bien
premièrement, et je sais qu'en plus getpixel/putpixel est très lent
(enfin très... Disons assez lent)... Donc si il y a déjà des fonctions
pour cela...)



et puis mon adresse euh... Nan pas d'autre, et puis c'est pas très grave...
Commenter la réponse de noSnoR
noSnoR 62 Messages postés samedi 5 mars 2005Date d'inscription 11 avril 2006 Dernière intervention - 31 déc. 2005 à 21:03
0
Utile
Arf... Bon, je met une première source online, elle plante
completement... Enfin presque. need help ! juste pour me dire ou ça
plante, le reste je veux le faire seul...



http://smirkin.free.fr/sources/

main.txt pour la source... Si quelqu'un veut essayer de compiler, il n'a qu'a DL le dossier tga aussi...



vala :)
Commenter la réponse de noSnoR
noSnoR 62 Messages postés samedi 5 mars 2005Date d'inscription 11 avril 2006 Dernière intervention - 1 janv. 2006 à 01:02
0
Utile
J'ai arrangé quelques trucs, il n'y a plus de bugs (problèmes de
gestion de mémoire apparemment... Plus quelques autres trucs...
On peut faire des pointeurs de pointeurs de pointeurs ? Si non, ya des
chances que ça fasse une partie des problèmes ^^ )



Enfin tout de même cette petite chose genant : Lorsqu'on passe le
curseur sur le sprite une fois affiché, c'est pas très esthetique, et
de plus le fushya du sprite n'est pas transparent... Barf ^^
Commenter la réponse de noSnoR
dletozeun 546 Messages postés vendredi 13 février 2004Date d'inscription 9 janvier 2008 Dernière intervention - 1 janv. 2006 à 19:16
0
Utile
lol! tu te casse la tete! Pas de getpixel ou de putpixel! J'ai en fait oublié de te dire que pour pouvoir mettre certaines zones (en rose) transparente il faut que tu enregistre tes sprites en bmp et que tu les charge avec:
BITMAP*sprite=load_bitmap("sprite.bmp",NULL);

Et la toute la parit e rose autour de ton cuseur est rose!
Donc au final, si tu veux des sprites avec des zones completement transparente -> choisis le bmp et mets les zones transparentes en rose.
Si tu veux des sprites semi transparents-> choisis le tga ou autre format qui conserve la couche alpha ; mais apres je sais pas du tout comment tu envoie ca a allegro! A mon avis ya surement des fct toutes faites qui le permette...renseigne toi.
Commenter la réponse de dletozeun
noSnoR 62 Messages postés samedi 5 mars 2005Date d'inscription 11 avril 2006 Dernière intervention - 1 janv. 2006 à 21:09
0
Utile
Ooooh, tout de suite, la lumière est
... Mouais... Bien, je vais déjà lire l'ensemble des cours que tu m'a
envoyé, j'arrête de floder ici, puis je posterai ma source pour charger
et animer un sprite... Ce sera mieux ^^ ... Merci pour tout quand même !
Commenter la réponse de noSnoR
dletozeun 546 Messages postés vendredi 13 février 2004Date d'inscription 9 janvier 2008 Dernière intervention - 2 janv. 2006 à 15:17
0
Utile
de rien, c'est normal.
Commenter la réponse de dletozeun

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.