Собственно код
Программа выполняет первый класс level.
И сразу вылетает с кодом ошибки 0
Вопрос заключается в том, что я написал неправильно по части класса cruiser, что он не работает.
Программа должна открывать окно, на котором будет картинка космоса + кораблик, которым можно управлять по горизонтали
#include <SDL.h>
#include <SDL_draw.h>
#include <SDL_ttf.h>
#include <cstdlib>
#include <time.h>
#include <SDL_image.h>
using namespace std;
class cruiser;
class level
{
public:
level_obj(SDL_Surface *battleground)
{
screen = battleground;
SDL_Surface *background = SDL_LoadBMP("textures/phone.bmp");
SDL_BlitSurface(background,NULL,screen,NULL);
SDL_Flip(screen);
cruiser cruiser(SDL_Surface *screen, level);
//SDL_Delay(4000);
}
private:
SDL_Surface *screen;
// friend cruiser;
friend cruiser;
};
int main(int argc, char *argv[])
{
SDL_Surface *screen;
if(SDL_Init(SDL_INIT_EVERYTHING)) //проверка на ошибку вывода SDL_init
{
fprintf(stderr,"Ошибка SDL: %s\n",SDL_GetError());
return 1;
}
atexit(SDL_Quit); //выход после успешного включения SDL_init
screen = SDL_SetVideoMode(1024,768,32,SDL_ANYFORMAT); //пока юзается ток разрешения формата 4:3, мб исправлю чё, но вроде норм
if(!screen)
{
fprintf(stderr,"Unable to set 1024x768 video: %s\n",SDL_GetError());
return 1;
}
// SDL_Quit();
level(screen);
return 0;
}
class cruiser
{
public:
cruiser_obj(SDL_Surface *screen, level obj_level)
{
SDL_Surface *battleship = IMG_Load("textures/battleship.png");
SDL_Rect dstrect;
SDL_Event event;
dstrect.x = 1024/2;
dstrect.y = 768/2;
SDL_BlitSurface(battleship,NULL,level.screen,&dstrect);
SDL_Flip(level.screen);
while(1)
{
if(SDL_PollEvent(&event))
{
if(event.key.keysym.sym==SDLK_LEFT&&dstrect.x>70)
{
dstrect.x-=5;
battleship = IMG_Load("textures/battleship.png");
SDL_BlitSurface(battleship,NULL,level.screen,&dstrect);
SDL_Flip(level.screen);
event.key.keysym.sym==NULL;
}
if(event.key.keysym.sym==SDLK_RIGHT&&dstrect.x<(1024-200))
{
dstrect.x+=5;
battleship = IMG_Load("textures/battleship.png");
SDL_BlitSurface(battleship,NULL,level.screen,&dstrect);
SDL_Flip(level.screen);
event.key.keysym.sym==NULL;
}
if(event.key.keysym.sym==SDLK_ESCAPE)
{
exit(0);
}
SDL_Delay(100);
battleship = IMG_Load("textures/battleship.png");
SDL_BlitSurface(battleship,NULL,level.screen,&dstrect);
SDL_Flip(level.screen);
}
}
}
//private:
//friend
};
В этом коде всё работает так как надо по отображению картинки, а вот по части управления корабликом ничего не выходит.
Я сделал две версии кода.. один для меня проще (вот этот), а другой на мой взгляд красивый (тот что выше)
#include <SDL.h>
#include <SDL_draw.h>
#include <SDL_ttf.h>
#include <stdio.h>
#include <stdlib.h>
#include <SDL_image.h>
using namespace std;
void draw_battleship_physics(SDL_Surface *screen);
void draw_asteroids(SDL_Surface *screen,Sint16 x1,Sint16 y1);
void move_battleship(SDL_Surface *screen);
void move_right(SDL_Surface *screen); //пока не нужны
void move_left(SDL_Surface *screen); //
SDL_Surface *background = SDL_LoadBMP("textures/phone.bmp");
SDL_Surface *battleship = IMG_Load("textures/battleship.png");
int main(int argc, char *argv[])
{
SDL_Surface *screen = NULL;
SDL_Event event;
if(SDL_Init(SDL_INIT_EVERYTHING)) //проверка на ошибку вывода SDL_init
{
fprintf(stderr,"Ошибка SDL: %s\n",SDL_GetError());
return 1;}
atexit(SDL_Quit); //выход после успешного включения SDL_init
screen = SDL_SetVideoMode(1024,768,32,SDL_SWSURFACE); //пока юзается ток разрешения формата 4:3, мб исправлю чё, но вроде норм
if(!screen)
{
fprintf(stderr,"Unable to set 1024x768 video: %s\n",SDL_GetError());
return 1;
}
move_battleship(screen);
SDL_Quit();
return 0;
}
void move_battleship(SDL_Surface *screen)
{
SDL_Event event;
SDL_Rect dstrect;
dstrect.x = screen->w/2-100;
dstrect.y = screen->h-120;
while (1)
{
if(SDL_PollEvent(&event))
{
if(event.key.keysym.sym==SDLK_LEFT)
{
move_left(screen);
}
if(event.key.keysym.sym==SDLK_RIGHT)
{
move_right(screen);
}
if(event.key.keysym.sym==SDLK_ESCAPE)
{
exit(0);
}
}
SDL_BlitSurface(background, NULL, screen, NULL ); //рисовка космоса
SDL_BlitSurface(battleship, NULL, screen, &dstrect ); //рисовка кораблика
SDL_Flip(screen);
//draw_asteroids(screen,x1,y1); //прорисовка астероидов, их движения
//++x; //тут должно быть --y1, но игра вылетает
//}
SDL_FreeSurface( screen );
}
}
void move_right(SDL_Surface *screen)
{
SDL_Surface *stay_b;
SDL_Rect dstrect;
SDL_Event event;
//dstrect.x = screen;
//dstrect.y = screen;
stay_b = IMG_Load("textures/battleship.png");
while(1)
{
if(SDL_PollEvent(&event))
{
if(event.key.keysym.sym==SDLK_RIGHT&&dstrect.x<(1024-150))
{
dstrect.x+=10;
stay_b = IMG_Load("textures/battleship.png");
SDL_BlitSurface(stay_b, NULL, background, &dstrect);
SDL_Flip(background);
event.key.keysym.sym==NULL;
}
if(event.key.keysym.sym==SDLK_LEFT)
{
move_left(screen);
}
if(event.key.keysym.sym==SDLK_UNKNOWN)
{
}
else if(event.key.keysym.sym==SDLK_ESCAPE)
{
exit(0);
}
}
SDL_BlitSurface(battleship,NULL,screen,&dstrect);
}
}
void move_left(SDL_Surface *screen)
{
SDL_Event event;
Uint16 x=0,y=screen->h/2+70;
while(1)
{
if(SDL_PollEvent(&event))
{
if(event.key.keysym.sym==SDLK_LEFT)
{
}
if(event.key.keysym.sym==SDLK_RIGHT)
{
move_right(screen);
}
else if(event.key.keysym.sym==SDLK_UNKNOWN)
{
}
else if(event.key.keysym.sym==SDLK_ESCAPE)
{
exit(0);
}
}
}
}
/*void draw_asteroids(SDL_Surface *screen,Sint16 x1,Sint16 y1)
{
Sint16 x2=10; //неудачные попытки сделать рандомное
появление астероидов ((99(
Sint16 y2=rand()%384;
Draw_FillCircle(screen,x1,y1,32,0x663300);
/*while(1)
{
Sint16 x1=1024;
Sint16 y1=rand()%384;
draw_asteroids(screen,x1,y1);
}
}*/
//почему игра вылетает при --y1
void draw_battleship_physics(SDL_Surface *screen)
{
}