troublemvker
@troublemvker
Учусь

Классы C++. Почему программа не выполняет второй класс?

Собственно код
Программа выполняет первый класс 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)
{

}
  • Вопрос задан
  • 382 просмотра
Пригласить эксперта
Ответы на вопрос 3
У вас есть две странные строчки:
// В конструкторе класса level
cruiser cruiser(SDL_Surface *screen);

// В конце функции main
level level(screen);

У вас level и screen - это названия классов (по сути имена типов) и названия конструкторов этих классов. И в любом случае эти строки не правильны.

Если вы хотите создать объекты, то стоит написать так:
cruiser cruiser_obj = cruiser(SDL_Surface *screen);
level level_obj = level(screen);

// Или проще:

cruiser cruiser_obj(SDL_Surface *screen);
level level_obj(screen);

А если вы хотите просто вызвать конструкторы, то это можно сделать так:
cruiser(SDL_Surface *screen);
level(screen);
Ответ написан
@Sasha_88
в конструкторе level после закрывающей фигурной скобки не должно быть точки с запятой. Она ставиться в конце класса только. А в cruiser конструктор вы назвали bcruiser
Ответ написан
@koronabora
Человек
cruiser cruiser(SDL_Surface *screen);
поменяйте на
cruiser=cruiser(screen);

friend cruiser;
на
cruiser cruiser;

И получится наркомания.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы