• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Salto allegro c++
#4
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
 
Rispondi
  


Messaggi in questa discussione
Salto allegro c++ - da ferrass - 18-08-2012, 10:21 AM
RE: Salto allegro c++ - da MickeyCrashRayman - 18-08-2012, 12:15 PM
RE: Salto allegro c++ - da ferrass - 18-08-2012, 04:08 PM
RE: Salto allegro c++ - da steve - 18-08-2012, 04:44 PM
RE: Salto allegro c++ - da MickeyCrashRayman - 19-08-2012, 04:58 PM
RE: Salto allegro c++ - da ferrass - 19-08-2012, 10:53 AM
RE: Salto allegro c++ - da ferrass - 19-08-2012, 12:23 PM

Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  far camminare un personaggio con allegro lakicanna 7 2,222 31-07-2014, 05:21 PM
Ultimo messaggio: Chip

Vai al forum:


Browsing: 2 Ospite(i)