Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Zamykanie gry


Rekomendowane odpowiedzi

Opublikowano

Witam.

 

Posiadam pewien problem w C++ z moją gierką "Nie dotykaj igieł". Wiem, już było to parę razy robione, jednak jak dla mnie to całkiem łatwa gra do zrobienia na początek z C++, oczywiście gra jest pisana w SDL! (Aby ułatwić szukanie, to posegregowałem kod)

 

Kod:

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_ttf.h>
#include <windows.h>
#include "fps.cpp"
#include <sstream>

using namespace std;

SDL_Window * okno;
SDL_Surface * ekran;
SDL_Event wylaczanie;
SDL_Rect napis;
SDL_Rect tlo_koordynaty;
SDL_Rect postac_koordynaty;

int frame = 0;

int main(int argc, char*args[])
{
    klasa_fps fps;
    SDL_Init(SDL_INIT_EVERYTHING);
    okno = SDL_CreateWindow("Nie dotykaj igiel",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,320,480,NULL);
    ekran = SDL_GetWindowSurface(okno);
    int pozX = 142;
    int pozY = 215;
    int numer;
    TTF_Init();
    TTF_Font * czcionka = TTF_OpenFont("Ubuntu.ttf",60);
    SDL_Color kolor = {175,178,179};
    while(true)
    {
        if(frame==0)
        {
            SDL_Surface * tekst = TTF_RenderText_Blended(czcionka,"0",kolor);
            SDL_Surface * tlo = IMG_Load("GRAFIKA/TLO.png");
            SDL_Surface * postac = IMG_Load("GRAFIKA/PRAWO.png");
            while(frame==0)
            {
                {//napisy
                    //numer = numer + 1;
                    //stringstream konwersja;
                    //konwersja << numer;
                    //tekst = TTF_RenderText_Blended(czcionka,konwersja.str().c_str(),kolor);
                }
                {//render
                    tlo_koordynaty.x = 0;
                    tlo_koordynaty.y = 0;
                    tlo_koordynaty.h = 480;
                    tlo_koordynaty.w = 320;
                    SDL_BlitScaled(tlo,NULL,ekran,&tlo_koordynaty);
                    napis.x = 145;
                    napis.y = 195;
                    SDL_BlitSurface(tekst,NULL,ekran,&napis);
                    postac_koordynaty.x = pozX;
                    postac_koordynaty.y = pozY;
                    postac_koordynaty.h = 28;
                    postac_koordynaty.w = 42;
                    SDL_BlitScaled(postac,NULL,ekran,&postac_koordynaty);
                }
                {//fps start
                        fps.start();
                }
                {//zdarzenia
                    {//wylaczanie
                        while(SDL_PollEvent(&wylaczanie))
                        {
                            if(wylaczanie.type==SDL_QUIT)
                            {
                                exit(0);
                            }
                        }
                    }
                    {//zmiana frame
                        if(GetAsyncKeyState(VK_LBUTTON))
                        {
                            frame = 1;
                        }
                    }
                }
                {//odswiezanie ekranu
                    SDL_UpdateWindowSurface(okno);
                    SDL_Delay(16.666666);
                    SDL_UpdateWindowSurface(okno);
                    fps.koniec();
                }
            }
            {//zwalnianie pamieci
                SDL_FreeSurface(tekst);
                SDL_FreeSurface(tlo);
                SDL_FreeSurface(postac);
            }
            while(frame==1)
            {
                {//napisy
                    //numer = numer + 1;
                    //stringstream konwersja;
                    //konwersja << numer;
                    //tekst = TTF_RenderText_Blended(czcionka,konwersja.str().c_str(),kolor);
                }
                {//render
                    tlo_koordynaty.x = 0;
                    tlo_koordynaty.y = 0;
                    tlo_koordynaty.h = 480;
                    tlo_koordynaty.w = 320;
                    SDL_BlitScaled(tlo,NULL,ekran,&tlo_koordynaty);
                    napis.x = 145;
                    napis.y = 195;
                    SDL_BlitSurface(tekst,NULL,ekran,&napis);
                    postac_koordynaty.x = pozX;
                    postac_koordynaty.y = pozY;
                    postac_koordynaty.h = 28;
                    postac_koordynaty.w = 42;
                    SDL_BlitScaled(postac,NULL,ekran,&postac_koordynaty);
                }
                {//fps start
                        fps.start();
                }
                {//zdarzenia
                    {//wylaczanie
                        while(SDL_PollEvent(&wylaczanie))
                        {
                            if(wylaczanie.type==SDL_QUIT)
                            {
                                exit(0);
                            }
                        }
                    }
                    {//sterowanie
                        if(GetAsyncKeyState(VK_LBUTTON))
                        {
                            pozY-=5;
                        }
                    }
                }
                {//odswiezanie ekranu
                    SDL_UpdateWindowSurface(okno);
                    SDL_Delay(16.666666);
                    SDL_UpdateWindowSurface(okno);
                    fps.koniec();
                }
            }
            {//zwalnianie pamieci
                SDL_FreeSurface(tekst);
                SDL_FreeSurface(tlo);
                SDL_FreeSurface(postac);
            }
        }
    }
}

Błąd jest taki, że kiedy klikam lewy przycisk myszy to się wyłącza, kompilator nie wytyka błędów.

Wiecie może gdzie ja popełniłem błąd?

 

Wersja SDL: 2.0.4

Kompilator: MinGW

Edytor: CodeBlocks

 

(Gdyby się jeszcze przydał kod klasy fps:

#include <SDL2/SDL.h>
#include <time.h>

class klasa_fps
{
public:
    int fps_poczatek;
    int fps_koniec;
    int roznica;
    float delay;
    int fps = 0;

    void start()
    {
        fps_poczatek=clock();
    }
    void koniec()
    {
        fps_koniec = clock();
        roznica = fps_koniec-fps_poczatek;
        delay = (1000.0/fps)-roznica;
        if(delay>0)
        {
            SDL_Delay(delay);
        }
    }
};

)

Opublikowano

Skorzystaj z debugera i podepnij go pod funkcję obsługującą kliknięcie myszą.

RAsfepN.png
Opublikowano

Skorzystaj z debugera i podepnij go pod funkcję obsługującą kliknięcie myszą.

Jeżeli dobrze rozumiem, to mam wejść w Debug i wybrać Start / Continue? (używam CodeBlocks) a następnie kliknąć myszką? Jeżeli dobrze zrobiłem to mi wyszło: G8HOX3W.png

Opublikowano

Już tam wyżej @Pancake znalazł przyczynę takiego zachowania. Ustawiasz fps na 0, a później dzielis 1000.0 przez fps, czyli przez 0. Dzielenie przez zero powoduje wyjątek i zamknięcie programu ;)

RAsfepN.png
Opublikowano

Zmieniłem kod i teraz jest taki: 

#include <SDL2/SDL.h>
#include <time.h>

class klasa_fps
{
public:
    int fps_poczatek;
    int fps_koniec;
    int roznica;
    float delay;
    int fps = 60;

    void start()
    {
        fps_poczatek=clock();
    }
    void koniec()
    {
        fps_koniec = clock();
        roznica = fps_koniec-fps_poczatek;
        delay = (1000.0/fps)-roznica;
        if(delay>0)
        {
            SDL_Delay(delay);
        }
    }
};

Jednak nadal to samo...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...