Creare Videogiochi - Game Developer
SDL, un piccolo (?) aiuto - 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: SDL, un piccolo (?) aiuto (/thread-SDL-un-piccolo-aiuto)



SDL, un piccolo (?) aiuto - Synlu - 27-02-2013

È da tanto che cerco di combinare qualcosa col C/C++, quando mi imbatto nelle librerie SDL. Stavo lavorando sul mio codice, quando mi accorgo che c'è qualcosa che non va. Il mio codice tende ad essere uno sparatutto a scorrimento verticale, lasciando perdere la grafica (della quale mi occuperò successivamente), ho arrangiato una classe proiettile nella quale ho l'immagine e le coordinate, e con una funzione dovrei riuscire a disegnare il proiettile. Il problema è che non viene disegnato, sono assolutamente sicuro di aver fatto giusto, ho controllato tramite degli if se tutte le funzioni vengono portate a termine con successo, ma non riesco a trovare il problema. Mi sto deprimendo T_T spero che qualche anima gentile mi voglia aiutare, magari trovando l'errore al quale io non riesco a sopperire. Vi allego il codice ma sappiate che non sono alle prime armi, peggio, non ne ho neanche XD
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <math.h>
#include <string>
#include <iostream>
using namespace std;
    SDL_Surface *schermo;
    SDL_Surface *sfondo;
    //int framecount=0;
class proiettile{
    //public:
    int x,y;
    SDL_Rect rec_g;//10*10
    float v,a;
    SDL_Surface *g;
    string f;
    public:
    proiettile(int x, int y, float v, float a, string link);
    ~proiettile();
    int disegna();
    int GetBulletX(){return x;};
    int GetBulletY(){return y;};
    };
proiettile::proiettile(int x, int y, float v, float a, string link){
    SDL_Surface *tomp;
    cout<< link << endl;
    tomp=IMG_Load(link.c_str());
    if(tomp==NULL){
        printf("Impossibile caricare l'immagine: %s\n",IMG_GetError());}
    SDL_SetColorKey(tomp, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(tomp->format,0x00,0x00,0xFF));
    if((g=SDL_DisplayFormat(tomp))==NULL){printf("Impossibile copiare una superfice sull'altra: %s\n",IMG_GetError());}
    SDL_FreeSurface(tomp);
    };
proiettile::~proiettile(){
    SDL_FreeSurface(g);
    };
int proiettile::disegna(){
    
    //if(x<=448+5 || x>=-5 || y>=5 || y<=480+5){
    rec_g.x=x-5;
    rec_g.y=y-5;
    rec_g.w=g->w;
    rec_g.h=g->h;//}else{ this->~proiettile();}
    //x+=v*cos(a);
    //y+=v*sin(a);
    if(SDL_BlitSurface(g, NULL, schermo, &rec_g)!=0){printf("Impossibile disengare nella classe: %s\n",IMG_GetError()); return 1;}
    return 0;
    };
int main()
{
    SDL_Surface *pg;
    SDL_Surface *temp;

    if( SDL_Init(SDL_INIT_VIDEO)<0){
            printf("Errore init SDL: %s\n", SDL_GetError());
            return 1;}
    atexit(SDL_Quit);

    if(!(schermo=SDL_SetVideoMode(448, 480, 0,((SDL_GetVideoInfo()->hw_available)?(SDL_HWSURFACE):(SDL_SWSURFACE))))){
        printf("Problemi con il settaggio dello schermo: %s\n", SDL_GetError());
        return 1;}
    
    temp=IMG_Load("gui3.png");
    if(temp==NULL){
        printf("Impossibile caricare l'immagine: %s\n",IMG_GetError());}
    sfondo=SDL_DisplayFormat(temp);
    SDL_FreeSurface(temp);
    //SDL_BlitSurface(sfondo, NULL, schermo, NULL);

    temp=IMG_Load("1.png");
    if(temp==NULL){
        printf("Impossibile caricare l'immagine: %s\n",IMG_GetError());
    }
    SDL_SetColorKey(temp, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(temp->format,0x00,0x00,0xFF));
    pg=SDL_DisplayFormat(temp);
    SDL_FreeSurface(temp);

    SDL_Rect rect_pg;
    rect_pg.x=224;
    rect_pg.y=400;
    rect_pg.h=pg->h;
    rect_pg.w=pg->w;

    int passo=2;
    int fine=0;
    int full_s=0;
    Uint32 flags=SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN;
    SDL_Event evento;
    bool posizioni[4]={false,false,false,false};

    proiettile bul(120,120,0,90,"3.png");

    while(!fine){
        while(SDL_PollEvent(&evento)){
        if(evento.type==SDL_QUIT){fine=1;}
            if(evento.type==SDL_KEYDOWN){
                switch(evento.key.keysym.sym){
                    case SDLK_LSHIFT:
                        passo=1;
                        break;
                    case SDLK_DOWN:
                        posizioni[3]=true;
                        break;
                    case SDLK_UP:
                        posizioni[1]=true;
                        break;
                    case SDLK_LEFT:
                        posizioni[0]=true;
                        break;
                    case SDLK_RIGHT:
                        posizioni[2]=true;
                        break;
                    default:
                        break;
                    }
                if(evento.key.keysym.sym==SDLK_SPACE){
                    if(!full_s){
                        schermo= SDL_SetVideoMode(448, 480, 0,flags);
                        full_s++;
                            flags=SDL_HWSURFACE|SDL_DOUBLEBUF;
                    }else{
                        schermo = SDL_SetVideoMode(448, 480, 0,flags);
                        full_s--;
                        flags=SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN;}
                }
            }
            if(evento.type==SDL_KEYUP){
                switch(evento.key.keysym.sym){
                    case SDLK_LSHIFT:
                        passo=2;
                        break;
                    case SDLK_ESCAPE:
                        fine=1;
                        break;
                    case SDLK_DOWN:
                        posizioni[3]=false;
                        break;
                    case SDLK_UP:
                        posizioni[1]=false;
                        break;
                    case SDLK_LEFT:
                        posizioni[0]=false;
                        break;
                    case SDLK_RIGHT:
                        posizioni[2]=false;
                        break;
                    default:
                        break;
                    }}}
        if(posizioni[0]){if(rect_pg.x>0){rect_pg.x-=passo;}}
        if(posizioni[1]){if(rect_pg.y>0){rect_pg.y-=passo;}}
        if(posizioni[2]){if(rect_pg.x<448-25){rect_pg.x+=passo;}}
        if(posizioni[3]){if(rect_pg.y<480-30){rect_pg.y+=passo;}}

        //SDL_BlitSurface(sfondo,NULL,schermo,NULL);
        if(bul.disegna()==0){printf("disegnato\n");}else{printf("errore");}
        SDL_BlitSurface(pg, NULL, schermo, &rect_pg);
        //if(framecount>=60){

        //framecount=0;}
        SDL_Flip(schermo);
        //framecount++;
        SDL_Delay(1);
    }
    SDL_FreeSurface(pg);
    SDL_FreeSurface(sfondo);
    SDL_FreeSurface(schermo);
    return 0;
}
Vi invierò anche i file se necessario, non sono granché, dei mucchi di quadratini, anche se non credo che l'immagine sia il problema. Grazie in anticipo a tutti quelli che si interesseranno al mio problema.


RE: SDL, un piccolo (?) aiuto - steve - 27-02-2013

Da me il proiettile viene stampato a schermo normalmente nel bordo in alto a sinistra, ho SDL 1.2 e per comodità ho sostituito gli IMG_Load con SDL_LoadBMP (prova a farlo pure tu). Non so quale possa essere il tuo problema, prova a cambiare l'immagine del proiettile...

PS.
Rivediti un po' il C++ perché ci sono delle cose insensate.


RE: SDL, un piccolo (?) aiuto - Synlu - 09-03-2013

Pare che sia riuscito in qualche modo a risolvere... Grazie dell'aiuto.