Creare Videogiochi - Game Developer
Salto allegro c++ - Versione stampabile

+- Creare Videogiochi - Game Developer (https://www.making-videogames.net/giochi)
+-- Forum: Programmazione (https://www.making-videogames.net/giochi/Forum-Programmazione)
+--- Forum: Programmazione in C C++ e C# (https://www.making-videogames.net/giochi/Forum-Programmazione-in-C-C-e-C)
+--- Discussione: Salto allegro c++ (/thread-Salto-allegro-c)



Salto allegro c++ - ferrass - 18-08-2012

Allora il problema risiede nel fatto che se premo space lo sprite salta per se tengo premuto space il salto è infinito ovvero lo sprite vola
Non so se questa è la sezione giusta ... Comunque ecco il codice
Codice:
#include <allegro.h>
#define true 1
#define false 0

// massimo y 140 in basso  //massimo x 300 a destra  //massimo y alto =0
BITMAP*buf,*mario_right,*sfondo,*scorrimento,*cattivo1,*mattone,*mario_left,*mario_down,*mario_space,*mario_run_1,*mario_run_2; //variabili

PALETTE colori;
int x,y,xscorrimento,moltiplica,xcattivo1,ycattivo1,vx,vy,g,salto,change,tempo,contsalto;


void doppiobuffering() {
     vsync();
     blit(buf,screen,0,0,0,0,320,300) ;
     clear(buf);
     }
     void player() {
          
                      
          draw_sprite(buf,mario_right,x,y) ;
          
          }
          
          void movimento() {
               if(key[KEY_RIGHT]) x=x+1 ,vx=20  ;if(x>=300) x=300;vx=0;
               if(key[KEY_LEFT]) x=x-1,vx--,clear (buf),   blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200),draw_sprite(buf,mario_left,x,y); if ( x<=10) x=10;vx=0;    
              if(key[KEY_DOWN])clear(buf) , blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200),draw_sprite(buf,mario_down,x,y);
      if (key[KEY_SPACE] )
  

salto=true;


    if(y>=100 && salto==true )
    
  
{

blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
   draw_sprite(buf,mario_space,x,y);  

vy=1.8;
x +=vx;
y -= vy;
vy += g;
                      
}
   else {
      salto=false;

if(y<=140) {
     x +=vx;  
     y +=vy;
     vy +=g;      
  
      
                      
      
}

}
}

        
  

                
                                    
          
                            
                              
              
  
                                        
                      

            
            
            
            
            
            
            
            
            
               void paesaggio() {
                    
               if(x==300) {
                               xscorrimento++;
                               }
                        
                              
                    
                   blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
                   if(xscorrimento>319){
                                        xscorrimento=0;
                    
                    }
                    }
                    void cattivonumero1() {
                        
                         draw_sprite(buf,cattivo1,xcattivo1,ycattivo1);
                        
                         }
                  
                              

                                                                
        
     int main() {
         allegro_init();
         install_keyboard();
         set_color_depth(32);
set_palette(colori);
         set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0);
        
         buf = create_bitmap(320, 200);
         clear(buf);
          mario_right=load_bmp("mario_right.bmp",colori);
          sfondo=load_bmp("paesaggio.bmp",colori);
          cattivo1=load_bmp("cattivo1.bmp",colori);
          
          mario_left=load_bmp("mario_left.bmp",colori);
          mario_down=load_bmp("mario_down.bmp",colori);
          mario_space=load_bmp("mario_space.bmp",colori);
          mario_run_2=load_bmp("frame2.bmp",colori);
          mario_run_1=load_bmp("frame1.bmp",colori);

        
              
          
         scorrimento = create_bitmap(640, 200);
         clear(scorrimento);
         for (moltiplica=0;moltiplica<=640;moltiplica=moltiplica+320) {
             blit(sfondo, scorrimento, 0, 0, moltiplica, 0, 320, 200);
}
          x=40;y=140;
          xcattivo1=250    ;   ycattivo1=149;
     vy=0;g=0.5;
      contsalto=0;
      
          tempo=0;
    
         while(!key[KEY_ESC]) {
                             doppiobuffering();
                             paesaggio();
                            player();
                            movimento();
                          
                            cattivonumero1();
                      
                      
                            
                  
                            
                            
                          
                            
                             }
                             destroy_bitmap(buf);
                             destroy_bitmap(mario_right);
                             destroy_bitmap(sfondo);
                             destroy_bitmap(scorrimento);
                             destroy_bitmap(cattivo1);
                             destroy_bitmap(mattone);
                             destroy_bitmap(mario_left);
                             destroy_bitmap(mario_down);
                             destroy_bitmap(mario_space);
                             destroy_bitmap(mario_run_2);
                             destroy_bitmap(mario_run_1);
                          
                            
                            
                             }
END_OF_MAIN ();



RE: Salto allegro c++ - MickeyCrashRayman - 18-08-2012

Io non sono un esperto di C++ applicato ai videogiochi, ma dovresti fare due cose:
1) o utilizzi delle librerie per la fisica (le più famose sono Physix o Newton);
2) oppure emuli la fisica inserendo un limite che permetta al personaggio di ricadere a terra non appena raggiunge un certo punto dell'ordinata.

Consiglio la prima.


RE: Salto allegro c++ - ferrass - 18-08-2012

mmmm ok sentiro qualche altro parere e poi scegliero .. Mille grazie comunque per la risposta Big GrinBig Grin


RE: Salto allegro c++ - steve - 18-08-2012

Prima di iniziare a fare un gioco devi avere una buona padronanza del linguaggio che usi:
  • Non serve un define per true e false: a differenza del C, in C++ i valori booleani sono un tipo nativo.
  • Una buona formattazione del codice rende tutto più comprensibile sia per te che per noi, ne è la prova la funzione movimento (sono sicuro che non fa quello che ti aspetti). Inoltre quando dai un nome a una funzione (ma anche a una variabile o a qualsiasi altra cosa) cerca di essere molto esplicativo; per esempio per funzione player ha più senso il nome drawPlayer, visto che serve solo per disegnarlo.
  • L'OOP è molto utile, soprattutto per i giochi.
  • Le variabili globali sono da evitare, ma vendendo il resto direi che per ora sono il problema minore.

Questo è il tuo codice indentato con un po' di senso (sperando che il forum non sputtani tutto), come vedi ci sono un mucchio di cose senza senso che ora saltano subito all'occhio:
Codice:
#include <allegro.h>

// massimo y 140 in basso  //massimo x 300 a destra  //massimo y alto =0
BITMAP    *buf,
        *mario_right,
        *sfondo,
        *scorrimento,
        *cattivo1,
        *mattone,
        *mario_left,
        *mario_down,
        *mario_space,
        *mario_run_1,
        *mario_run_2; //variabili

PALETTE colori;

int    x,
    y,
    xscorrimento,
    moltiplica,
    xcattivo1,
    ycattivo1,
    vx,
    vy,
    g,
    salto,
    change,
    tempo,
    contsalto;


void doppiobuffering()
{
    vsync();
    blit(buf,screen,0,0,0,0,320,300) ;
    clear(buf);
}


void player()
{        
    draw_sprite(buf,mario_right,x,y) ;
}


void movimento()
{
    if(key[KEY_RIGHT])
        x=x+1, vx=20;
    
    if(x>=300)
        x=300;
    
    vx=0;
    
    if(key[KEY_LEFT])
    {
        x=x-1;
        vx--;
        clear(buf);
        blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
        draw_sprite(buf,mario_left,x,y);
    }
    
    if(x<=10)
        x=10;
    
    vx=0;    
    
    if(key[KEY_DOWN])
    {
        clear(buf);
        blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
        draw_sprite(buf,mario_down,x,y);
    }
    
    if(key[KEY_SPACE])
        salto=true;

    if(y>=100 && salto==true )
    {
        blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
        draw_sprite(buf,mario_space,x,y);  
        vy = 1.8;
        x += vx;
        y -= vy;
        vy += g;              
    }
    else
    {
        salto=false;
        
        if(y<=140)
        {
            x += vx;  
            y += vy;
            vy += g;      
        }
    }
}


void paesaggio()
{
    if(x==300)
        xscorrimento++;

    blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
    
    if(xscorrimento>319)
    {
        xscorrimento=0;
    }
}


void cattivonumero1()
{
    draw_sprite(buf,cattivo1,xcattivo1,ycattivo1);
}

        
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_palette(colori);
    set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0);
    
    buf = create_bitmap(320, 200);
    clear(buf);
    mario_right=load_bmp("mario_right.bmp",colori);
    sfondo=load_bmp("paesaggio.bmp",colori);
    cattivo1=load_bmp("cattivo1.bmp",colori);
    
    mario_left=load_bmp("mario_left.bmp",colori);
    mario_down=load_bmp("mario_down.bmp",colori);
    mario_space=load_bmp("mario_space.bmp",colori);
    mario_run_2=load_bmp("frame2.bmp",colori);
    mario_run_1=load_bmp("frame1.bmp",colori);
      
    scorrimento = create_bitmap(640, 200);
    clear(scorrimento);
    for (moltiplica=0;moltiplica<=640;moltiplica=moltiplica+320)
    {
        blit(sfondo, scorrimento, 0, 0, moltiplica, 0, 320, 200);
    }
    x=40;            y=140;
    xcattivo1=250;    ycattivo1=149;
    vy=0;
    g=0.5;
    contsalto=0;
    tempo=0;
    
    while(!key[KEY_ESC])
    {
        doppiobuffering();
        paesaggio();
        player();
        movimento();
        
        cattivonumero1();
    }
    
    destroy_bitmap(buf);
    destroy_bitmap(mario_right);
    destroy_bitmap(sfondo);
    destroy_bitmap(scorrimento);
    destroy_bitmap(cattivo1);
    destroy_bitmap(mattone);
    destroy_bitmap(mario_left);
    destroy_bitmap(mario_down);
    destroy_bitmap(mario_space);
    destroy_bitmap(mario_run_2);
    destroy_bitmap(mario_run_1);
}
END_OF_MAIN ();

Sistema i no-sense e poi rivediamo come farlo saltare decentemente. Se il salto funziona bene e c'è solo il problema del volo basta cambiare questo:
Codice:
if(key[KEY_SPACE])
    salto=true;
in questo:
Codice:
if(key[KEY_SPACE] && salto==false)
    salto=true;
È abbastanza logica come cosa.


(18-08-2012, 12:15 PM)MickeyCrashRayman Ha scritto: 1) o utilizzi delle librerie per la fisica (le più famose sono Physix o Newton);
Assolutamente no! Aldilà del fatto che quelle che hai citato andrebbero bene per un gioco 3D, usare un engine fisico è solo una complicazione in più. Se devi solo gestire le collisioni, i salti e le cadute fai molto, ma molto prima a scrivertelo da solo.


PS. Benvenuto


RE: Salto allegro c++ - ferrass - 19-08-2012

ti ringrazio per i consigli preziosi adesso faro qualche aggiustamento al codice ... Mi dite solo una cosa? xD il problema perchè se ripremo space in salto lo sprite risalta lo avete capito ? (non in senso offensivo ma almeno che qualcuno sappia come si risolva ) Comunque ringrazio tutti per la vostra immediata disponibilità..Un ultima cosa il post va bene in questa sezione ?


RE: Salto allegro c++ - ferrass - 19-08-2012

Problema salto infinito risolto mille grazie a tutti posto il codice qua di sotto Big Grin
Codice:
#include <allegro.h>


// massimo y 140 in basso  //massimo x 300 a destra  //massimo y alto =0
BITMAP    *buf,
        *mario_right,
        *sfondo,
        *scorrimento,
        *cattivo1,
        *mattone,
        *mario_left,
        *mario_down,
        *mario_space;

PALETTE colori;

int    x,
    y,
    xscorrimento,
    moltiplica,
    xcattivo1,
    ycattivo1,
    vx,
    vy,
    g,
    salto;
    

        


void doppiobuffering()
{
    vsync();
    blit(buf,screen,0,0,0,0,320,300) ;
    clear(buf);
}


void draw_player()
{        
    draw_sprite(buf,mario_right,x,y) ;
}


void movimento()
{
    if(key[KEY_RIGHT])
    {
        x=x+1, vx=20;
}
    if(x>=300) {
        x=300;
    
    vx=0;
}
    if(key[KEY_LEFT])
    {
        x=x-1;
        vx--;
        clear(buf);
        blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
        draw_sprite(buf,mario_left,x,y);
    }
    
    if(x<=10)
        x=10;
    
    vx=0;    
    
    if(key[KEY_DOWN])
    {
        clear(buf);
        blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
        draw_sprite(buf,mario_down,x,y);
    }



    
    
    if(key[KEY_SPACE] &&y==140 )
        salto=true;

    if(y>=100 && salto==true )
    {
        blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
        draw_sprite(buf,mario_space,x,y);  
        vy = 1.8;
        x += vx;
        y -= vy;
        vy += g;              
    }
    else
    {
        salto=false;
        
        if(y!=140)
        {
            x += vx;  
            y += vy;
            vy += g;      
        }
        
    }
}


void paesaggio()
{
    if(x==300)
        xscorrimento++;

    blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
    
    if(xscorrimento>319)
    {
        xscorrimento=0;
    }
}


void cattivonumero1()
{
    draw_sprite(buf,cattivo1,xcattivo1,ycattivo1);
}

        
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_palette(colori);
    set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0);
    
    buf = create_bitmap(320, 200);
    clear(buf);
    mario_right=load_bmp("mario_right.bmp",colori);
    sfondo=load_bmp("paesaggio.bmp",colori);
    cattivo1=load_bmp("cattivo1.bmp",colori);
    
    mario_left=load_bmp("mario_left.bmp",colori);
    mario_down=load_bmp("mario_down.bmp",colori);
    mario_space=load_bmp("mario_space.bmp",colori);

      
    scorrimento = create_bitmap(640, 200);
    clear(scorrimento);
    for (moltiplica=0;moltiplica<=640;moltiplica=moltiplica+320)
    {
        blit(sfondo, scorrimento, 0, 0, moltiplica, 0, 320, 200);
    }
    x=40;            y=140;
    xcattivo1=250;    ycattivo1=149;
    vy=0;
    g=0.5;


    
    while(!key[KEY_ESC])
    {
        doppiobuffering();
        paesaggio();
        draw_player();
        movimento();
        
        cattivonumero1();

    }
    
    destroy_bitmap(buf);
    destroy_bitmap(mario_right);
    destroy_bitmap(sfondo);
    destroy_bitmap(scorrimento);
    destroy_bitmap(cattivo1);
    destroy_bitmap(mattone);
    destroy_bitmap(mario_left);
    destroy_bitmap(mario_down);
    destroy_bitmap(mario_space);
    
}
END_OF_MAIN ();
[code]



RE: Salto allegro c++ - MickeyCrashRayman - 19-08-2012

(18-08-2012, 04:44 PM)steve Ha scritto: Prima di iniziare a fare un gioco devi avere una buona padronanza del linguaggio che usi:
  • Non serve un define per true e false: a differenza del C, in C++ i valori booleani sono un tipo nativo.
  • Una buona formattazione del codice rende tutto più comprensibile sia per te che per noi, ne è la prova la funzione movimento (sono sicuro che non fa quello che ti aspetti). Inoltre quando dai un nome a una funzione (ma anche a una variabile o a qualsiasi altra cosa) cerca di essere molto esplicativo; per esempio per funzione player ha più senso il nome drawPlayer, visto che serve solo per disegnarlo.
  • L'OOP è molto utile, soprattutto per i giochi.
  • Le variabili globali sono da evitare, ma vendendo il resto direi che per ora sono il problema minore.

Questo è il tuo codice indentato con un po' di senso (sperando che il forum non sputtani tutto), come vedi ci sono un mucchio di cose senza senso che ora saltano subito all'occhio:
Codice:
#include <allegro.h>

// massimo y 140 in basso  //massimo x 300 a destra  //massimo y alto =0
BITMAP    *buf,
        *mario_right,
        *sfondo,
        *scorrimento,
        *cattivo1,
        *mattone,
        *mario_left,
        *mario_down,
        *mario_space,
        *mario_run_1,
        *mario_run_2; //variabili

PALETTE colori;

int    x,
    y,
    xscorrimento,
    moltiplica,
    xcattivo1,
    ycattivo1,
    vx,
    vy,
    g,
    salto,
    change,
    tempo,
    contsalto;


void doppiobuffering()
{
    vsync();
    blit(buf,screen,0,0,0,0,320,300) ;
    clear(buf);
}


void player()
{        
    draw_sprite(buf,mario_right,x,y) ;
}


void movimento()
{
    if(key[KEY_RIGHT])
        x=x+1, vx=20;
    
    if(x>=300)
        x=300;
    
    vx=0;
    
    if(key[KEY_LEFT])
    {
        x=x-1;
        vx--;
        clear(buf);
        blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
        draw_sprite(buf,mario_left,x,y);
    }
    
    if(x<=10)
        x=10;
    
    vx=0;    
    
    if(key[KEY_DOWN])
    {
        clear(buf);
        blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
        draw_sprite(buf,mario_down,x,y);
    }
    
    if(key[KEY_SPACE])
        salto=true;

    if(y>=100 && salto==true )
    {
        blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
        draw_sprite(buf,mario_space,x,y);  
        vy = 1.8;
        x += vx;
        y -= vy;
        vy += g;              
    }
    else
    {
        salto=false;
        
        if(y<=140)
        {
            x += vx;  
            y += vy;
            vy += g;      
        }
    }
}


void paesaggio()
{
    if(x==300)
        xscorrimento++;

    blit(scorrimento, buf, xscorrimento, 0, 0, 0, 320, 200);
    
    if(xscorrimento>319)
    {
        xscorrimento=0;
    }
}


void cattivonumero1()
{
    draw_sprite(buf,cattivo1,xcattivo1,ycattivo1);
}

        
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_palette(colori);
    set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0);
    
    buf = create_bitmap(320, 200);
    clear(buf);
    mario_right=load_bmp("mario_right.bmp",colori);
    sfondo=load_bmp("paesaggio.bmp",colori);
    cattivo1=load_bmp("cattivo1.bmp",colori);
    
    mario_left=load_bmp("mario_left.bmp",colori);
    mario_down=load_bmp("mario_down.bmp",colori);
    mario_space=load_bmp("mario_space.bmp",colori);
    mario_run_2=load_bmp("frame2.bmp",colori);
    mario_run_1=load_bmp("frame1.bmp",colori);
      
    scorrimento = create_bitmap(640, 200);
    clear(scorrimento);
    for (moltiplica=0;moltiplica<=640;moltiplica=moltiplica+320)
    {
        blit(sfondo, scorrimento, 0, 0, moltiplica, 0, 320, 200);
    }
    x=40;            y=140;
    xcattivo1=250;    ycattivo1=149;
    vy=0;
    g=0.5;
    contsalto=0;
    tempo=0;
    
    while(!key[KEY_ESC])
    {
        doppiobuffering();
        paesaggio();
        player();
        movimento();
        
        cattivonumero1();
    }
    
    destroy_bitmap(buf);
    destroy_bitmap(mario_right);
    destroy_bitmap(sfondo);
    destroy_bitmap(scorrimento);
    destroy_bitmap(cattivo1);
    destroy_bitmap(mattone);
    destroy_bitmap(mario_left);
    destroy_bitmap(mario_down);
    destroy_bitmap(mario_space);
    destroy_bitmap(mario_run_2);
    destroy_bitmap(mario_run_1);
}
END_OF_MAIN ();

Sistema i no-sense e poi rivediamo come farlo saltare decentemente. Se il salto funziona bene e c'è solo il problema del volo basta cambiare questo:
Codice:
if(key[KEY_SPACE])
    salto=true;
in questo:
Codice:
if(key[KEY_SPACE] && salto==false)
    salto=true;
È abbastanza logica come cosa.


(18-08-2012, 12:15 PM)MickeyCrashRayman Ha scritto: 1) o utilizzi delle librerie per la fisica (le più famose sono Physix o Newton);
Assolutamente no! Aldilà del fatto che quelle che hai citato andrebbero bene per un gioco 3D, usare un engine fisico è solo una complicazione in più. Se devi solo gestire le collisioni, i salti e le cadute fai molto, ma molto prima a scrivertelo da solo.


PS. Benvenuto

Meno male che sei intervenuto, tu sei al pari di Yoda. asd