Allegro help ! [Résolu]

Signaler
Messages postés
7
Date d'inscription
lundi 2 mars 2009
Statut
Membre
Dernière intervention
18 février 2014
-
 jmg49 -
Bonjour,

J'ai deux codes qui chacun de leur côté fonctionnent bien, j'essaie de les fusionner, et évidement plantage, je compile bien , il commence à s'exécuter mais ferme avec nomduprocess a cessé de fonctionner .... pas de access violation etc..

le premier code utilise la lib allegro pour générer un starfield , l'autre un scroll text avec allegro aussi,

j'ai a peu près réussi à localiser ce qui me génère le plantage, ce serait la fonction Draw_Sprite



draw_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y);

si quelqu'un peut m'aider, je peux faire passer les projets DEVC++ par mail , le C++ n'est pas mon premier langage ...


ma fonction main :



int main(int argc, char *argv[]) {

int framecount;
framecount=0;

allegro_init();
install_keyboard();

LOCK_VARIABLE(speed_counter);
LOCK_FUNCTION(increment_speed_counter);
install_int_ex(increment_speed_counter, BPS_TO_TIMER(60));

set_color_depth(8) ; // 8 bit colour
if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, screen_x, screen_y, 0, 0)<0)
{
//set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, screen_w, screen_h, 0, 0);

allegro_message("Failure to init video mode!\n%s\n", allegro_error);
exit(1); // force abort
}

off_screen = create_bitmap(screen_x, screen_y);


Init_Music();
Init_Font();
install_timer();
Play_Music();
srand(time(NULL));
Star star[maxstars];

while ((!key[KEY_ESC])&&(!key[KEY_SPACE]))
{

clear_bitmap(off_screen);





DrawString((framecount % 2550)-820,508,"TEST SCROLL LEFT TO RIGHT...NO SINUS EFFECT FIRST....");
framecount+=6;
vsync();
blit(off_screen, screen, 0, 0, 0, 0, screen_x, screen_y);
rest(1);
};
while(speed_counter > 0)
{
for(int i = 0; i < maxstars; ++i)
{
star[i].movestars();
}
speed_counter --;
}

draw_sprite(screen, buffer, 0, 0); // La fonction qui semble poser problème


destroy_bitmap(off_screen);
Kill_Music();
Kill_Font();
remove_timer();
return 0;
}
END_OF_MAIN();

J'ai donc la fonction DrawString qui va afficher le texte à l'écran, ( il y a une fonction drawcharacter qui récupère les lettres dans une fonte en .pcx) , et la fonction drawsprite pour génerer le starfield,

ensuite il y a une classe qui place les pixels en position start sur l'écran et qui effectue le mouvement en utilisant buffer :






Star::Star()
{
posx = (rand() % screen_w);
posy = (rand() % screen_h);
speed = (rand() % 5) + 1;
putpixel(buffer, posx, posy, makecol(255, 255, 255));

void Star::movestars()
{
putpixel(buffer, posx, posy, makecol(0, 0, 0));
posx -= speed;
if (posx <= 0)
{
posx = screen_w;
}
putpixel(buffer, posx, posy, makecol(255, 255, 255 ));
}

merci à vous

8 réponses

Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
93
Hello,
Je ne connais pas allegro mais, dans ton code, je ne vois ni déclaration, ni initialisation des variables
screen
et
buffer
...
ils sont déclarés en début de code
BITMAP *buffer;
int screen_h = 600; //screen height
int screen_w = 800; //screen width

le problème survient quand j'utilise la classe Star

si je mets ces trois ligne en commentaires, le scroll text apparait le prog ne plante pas mais pas d'etoiles du coup ...
Star star[maxstars];
star[i].movestars();
draw_sprite(screen, buffer, 0, 0);
Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
93
Dans le cas de ton tableau star, tu réserve la place pour maxstars cases mais tu ne les initialises pas:

for (int i=0; i<maxstars; i++)
{
    star[i] = new Star();
} 

Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
@Buno:
Pas nécessaire. C'est un tableau de "Star" et non de "Star*". (Attention, dans le cas d'un new sans argument, on ne met pas de "()").

@jmg49:
Peux-tu faire voir comment est alloué ton "buffer" ?
D'où vient "screen" ?

__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
screen vient de la fonction allegro
draw_sprite(screen, spaceship, x, y);
 extern BITMAP *screen; 

créé par le
set_gfx_mode()

buffer est initialisé en début de code par :
BITMAP *buffer;
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
screen vient de la fonction allegro
draw_sprite(screen, spaceship, x, y);
extern BITMAP *screen;
créé par le
set_gfx_mode()
Beurk une variable globale :(

buffer est initialisé en début de code par :
BITMAP *buffer;
Ceci est ta déclaration, mais où est ton initialisation ? ("Buffer" vaut une valeur indeterminée si on ne lui donne aucune valeur).

__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
93
Arf....je mélanges Java et C++ !?
Bon, jmg49, je te laisse entre de bonnes mains ;)
En effet , vous avez l'oeil !!!!

buffer = create_bitmap(screen_w, screen_h);

voila le problème de plantage fixé !! , j'ai juste les effets un apres l'autre mais pas simultanés maintenant !!!!
c'est à dire, que mon scroll text defile, et quand je quite le prog , j'apperçois les étoiles ....

mais un grand merci pour ça déjà , pffff quelle erreur ...