Allegro help !

Résolu
waste49 Messages postés 7 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 18 février 2014 - 18 févr. 2014 à 10:36
 jmg49 - 18 févr. 2014 à 16:38
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

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
18 févr. 2014 à 11:13
Hello,
Je ne connais pas allegro mais, dans ton code, je ne vois ni déclaration, ni initialisation des variables
screen
et
buffer
...
0
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);
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
18 févr. 2014 à 13:52
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();
} 

0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
18 févr. 2014 à 14:46
@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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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;
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
18 févr. 2014 à 15:59
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
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
18 févr. 2014 à 16:03
Arf....je mélanges Java et C++ !?
Bon, jmg49, je te laisse entre de bonnes mains ;)
0
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 ...
0
Rejoignez-nous