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.
|