• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed c/c++ SDL podejście obiektowe w przypadku biblioteki, która nie wspiera obiektowości...

Object Storage Arubacloud
0 głosów
461 wizyt
pytanie zadane 6 grudnia 2020 w C i C++ przez edwardkraweznik Dyskutant (9,930 p.)
zamknięte 7 grudnia 2020 przez edwardkraweznik

Witam wszystkich.

Mam napisaną prostą gierkę w cpp z użyciem biblioteki SDL (multiplatformowa gierka)

Gra napisana strukturalnie dzięki czemu zaczyna być spory bałagan w kodzie. Postanowiłem przepisać kod tak aby był w pełni obiektowy, problem w tym, że biblioteka SDL nie wspiera obiektowości jak jest to w przypadku SFML. Stworzyłem w tym celu prosty szkielet, który w mojej ocenie pozwoli na wykorzystanie SDL w sposób obiektowy. Pytanie: czy moje podejście będzie poprawne ? może coś pozmieniać ?

Zaznaczę, że jest to jedynie szkielet, który wyświetla tylko okno aplikacji, chcę się upewnić, że moje podejście jest dobre zanim przepiszę cały kod.

main.cpp

#include <iostream>
#include <string>

#include "main.h"
#include "win.h"

AppInit::AppInit()
{
    SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
}

int main(int argc, char **argv)
{
    AppInit app;
    Win win;
    //------------------------------------------------------------





    SDL_Delay(10000);

}

main.h

#ifndef MAIN_H
#define MAIN_H

#include <SDL.h>

class AppInit
{
    public:
    AppInit();
};

#endif

win.cpp

#include "win.h"

Win::Win()
{
    win = SDL_CreateWindow("SDL Game joszi", 100, 100, 800, 600, SDL_WINDOW_SHOWN);
    src = SDL_GetWindowSurface(win);
}

win.h

#ifndef WIN_H
#define WIN_H

#include <SDL.h>

class Win
{
    public:
    Win();

    SDL_Window *win;
    SDL_Surface *src;
};

#endif

makefile

CXX = g++

SDLFLAGS = /home/joszi/sdl_lin/bin/sdl2-config --cflags
SDLLIBS = /home/joszi/sdl_lin/bin/sdl2-config --libs

OPT = -O2 -Wall

APPNAME = game

OBJDIR = objlin

all: $(OBJDIR)/main.o $(OBJDIR)/win.o
	rm -f bin/$(APPNAME)
	$(CXX) $(OBJDIR)/*.o `$(SDLLIBS)` -o bin/$(APPNAME)

clean:
	rm -f $(OBJDIR)/*.o

$(OBJDIR)/main.o: src/main.cpp src/main.h
	$(CXX) src/main.cpp $(OPT) -c `$(SDLFLAGS)` -o $(OBJDIR)/main.o

$(OBJDIR)/win.o: src/win.cpp src/win.h
	$(CXX) src/win.cpp $(OPT) -c `$(SDLFLAGS)` -o $(OBJDIR)/win.o

 

komentarz zamknięcia: ok
komentarz 6 grudnia 2020 przez adrian17 Ekspert (346,000 p.)

A na boku:

SDL_GetWindowSurface

nie chcesz renderować kartą graficzną?

komentarz 6 grudnia 2020 przez edwardkraweznik Dyskutant (9,930 p.)
adrian prawdopodobnie tak, jednak najpierw muszę zając się przepisaniem tego na obiekty bo gubię się w swoim kodzie :)
komentarz 6 grudnia 2020 przez adrian17 Ekspert (346,000 p.)

zając się przepisaniem tego na obiekty bo gubię się w swoim kodzie

OOP to nie automatyczne panaceum na słaby kod, to tylko inne podejście - na oba sposoby można pisać kod ładny lub nieczytelny.

komentarz 6 grudnia 2020 przez edwardkraweznik Dyskutant (9,930 p.)
no tak ale w przypadku SDLA trzeba używać zmiennych globalnych, Jeśli zastosuję OOP nie muszę

Tak mi wyszedł ten kod... stałych globalnych nie udało mi się zastosować (muszę zmieniać rozmiar okna w trakcie działania programu, problem jest tylko z oknem)
komentarz 6 grudnia 2020 przez adrian17 Ekspert (346,000 p.)

no tak ale w przypadku SDLA trzeba używać zmiennych globalnych, Jeśli zastosuję OOP nie muszę

...nie, przepraszam ale to zdanie nie ma sensu. OOP nie "zmniejsza użycia zmiennych globalnych". Co dokładnie masz na myśli?

komentarz 6 grudnia 2020 przez edwardkraweznik Dyskutant (9,930 p.)
OOP pozwala na uporządkowanie kodu, wiem, że gdybym posiedział nad wskaźnikami i referencjami to prawdopodobnie nie musiałbym tworzyć zmiennej globalnej...

Nie znam zbyt dobrze cpp, uczę się (dlatego zrobiłem bałagan w swoim kodzie)

OOP jest dla mnie czytelniejsze (dlatego chcę to przepisać)

1 odpowiedź

0 głosów
odpowiedź 6 grudnia 2020 przez adrian17 Ekspert (346,000 p.)
wybrane 6 grudnia 2020 przez edwardkraweznik
 
Najlepsza

Po pierwsze, istota "podejścia obiektowego" oznacza "obiekty komunikujące się ze sobą". Nie oznacza "zamieniam wszystko na klasę jak popadnie".

Więc to:

AppInit::AppInit()
{
    SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
}

int main(int argc, char **argv)
{
    AppInit app;

na chwilę obecną nie ma żadnej wartości ani przewagi (a tylko konfunduje) nad:

void init_sdl()
{
    SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
}

int main(int argc, char **argv)
{
    init_sdl();

Po drugie, w C++ie, jedną z największych sił C++a i jego systemu klas są destruktory pozwalające na automatyczne zarządzanie zasobami. Tutaj:

Win::Win()
{
    win = SDL_CreateWindow("SDL Game joszi", 100, 100, 800, 600, SDL_WINDOW_SHOWN);
    src = SDL_GetWindowSurface(win);
}

Tworzysz zasoby w konstruktorze, ale zgubiłeś destruktor zwalniający te zasoby (SDL_DestroyWindow etc).

komentarz 6 grudnia 2020 przez edwardkraweznik Dyskutant (9,930 p.)

Słuszna uwaga, zrobiłem tak:

#include <iostream>
#include <string>

#include "main.h"
#include "win.h"

AppInit::AppInit()
{
    SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
}

AppInit::~AppInit()
{
    SDL_Quit();
}

int main(int argc, char **argv)
{
    AppInit app;
    Win win;
    //------------------------------------------------------------





    SDL_Delay(10000);

}
#ifndef MAIN_H
#define MAIN_H

#include <SDL.h>

class AppInit
{
    public:
    AppInit();
    ~AppInit();
};

#endif
#include "win.h"

Win::Win()
{
    win = SDL_CreateWindow("SDL Game joszi", 100, 100, 800, 600, SDL_WINDOW_SHOWN);
    src = SDL_GetWindowSurface(win);
}

Win::~Win()
{
    SDL_DestroyWindow(win);
    SDL_FreeSurface(src);
}
#ifndef WIN_H
#define WIN_H

#include <SDL.h>

class Win
{
    public:
    Win();
    ~Win();

    SDL_Window *win;
    SDL_Surface *src;
};

#endif

 

komentarz 6 grudnia 2020 przez edwardkraweznik Dyskutant (9,930 p.)
Jeszcze pytanie odnośnie sprzątania...

Nie jest tak, że tworzony jest domyślny destruktor, który to posprząta gdy obiekt jest usuwany ?
komentarz 7 grudnia 2020 przez adrian17 Ekspert (346,000 p.)
A skąd C++ ma wiedzieć, że wskaźnik stworzony przez `SDL_CreateWindow` należy zwolnić przez `SDL_DestroyWindow`? ;)
komentarz 7 grudnia 2020 przez edwardkraweznik Dyskutant (9,930 p.)
No fakt, dzieki za pomoc :D

Podobne pytania

–2 głosów
1 odpowiedź 805 wizyt
pytanie zadane 8 października 2017 w C i C++ przez Igor Użytkownik (740 p.)
0 głosów
1 odpowiedź 146 wizyt
pytanie zadane 6 grudnia 2022 w C i C++ przez koleś34 Gaduła (3,270 p.)
0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 29 kwietnia 2020 w C i C++ przez Badzonor Obywatel (1,410 p.)

92,666 zapytań

141,564 odpowiedzi

320,019 komentarzy

62,031 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...