Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z nauką klas i obiektów

Ostatnio zmodyfikowano 2012-12-23 21:32
Autor Wiadomość
KrzysiekB
Temat założony przez niniejszego użytkownika
Problem z nauką klas i obiektów
» 2012-12-23 19:24:17
Witam!
Jako że jestem nowy na forum to wypadałoby pozdrowić wszystkich ze strony :)

Od jakiegoś czasu pracuje sobie z biblioteką SFML 1.6 (pare miesięcy) dziś nawet zaliczyłem przesiadkę na wersję
2.0 i próbowałem sobie robić w tej bibliotece różne rzeczy i zacząłem sobie tworzyć własną grę.
Projekt szedł sprawnie i ładnie było parę problem co prawda ale znalazłem parę przydatnych linków i "jakoś szło".
Poprzednio nieprogramowałem obiektowo a nawet mało co funkcji robiłem.
Schody zaczeły się gdy kod stawał się coraz bardziej nieczytelny i trudny do zrozumienia.
Wczytując się więc w rady innych na forach doszłem do wniosku że należałoby się nauczyć tej "obiektowości".
No więc proste klasy opanowałem ale niemogę dojść do tego jak zrobić klasy dla mojej gry.
Napisałem klasę Kafelek która na razie ma tylko trzymać informację na temat każdego kafla ale niedziała.
W końcu po szukaniu w bezkresnym morzu internetowych informacji zdecydowałem się zarejestrować tutaj i opisać problem.
Poniżej wklejam kod programu:

main.cpp
C/C++
#include <SFML/Graphics.hpp>
#include "kafelek.hpp"

int main( int argc, char * argv[] )
{
    if( argc > 1 ) return 1;
   
    std::string EXE_PLIK;
    EXE_PLIK = argv[ 0 ];
    std::string EXE_FOLDER;
    EXE_FOLDER = EXE_PLIK;
    EXE_FOLDER.erase( EXE_FOLDER.size() - 17 );
   
    std::string DATA_1 =( EXE_FOLDER + "dirt.png" );
   
    sf::Texture * Textura;
    Textura->loadFromFile( DATA_1 );
   
    sf::RenderWindow window( sf::VideoMode( 800, 600 ), "Test" );
   
    Kafelek MapaKafli[ 3 ][ 3 ];
    for( short int x = 0; x < 3; x++ )
    {
        for( short int y = 0; y < 3; y++ )
        {
            MapaKafli[ x ][ y ].KafelekUstaw( Textura, x << 4, y << 4 );
        }
    }
   
    while( window.isOpen() )
    {
        sf::Event event;
        while( window.pollEvent( event ) )
        {
            if( event.type == sf::Event::Closed )
                 window.close();
           
        }
       
        window.clear();
       
       
       
        window.display();
    }
    return 0;
}

kafelek.hpp
C/C++
#pragma once
#include <SFML/Graphics.hpp>

class Kafelek
    : public sf::Sprite
{
public:
    Kafelek() { Sprite Kafel; }
    ~Kafelek() { }
    void KafelekUstaw( sf::Texture * img, float X, float Y ) { IMG = img; setTexture( * IMG ); setPosition( X, Y ); }
private:
    sf::Texture * IMG;
};

Czy ktoś byłby mi w stanie wytłumaczyć jakie tworzyć klasy w grze opartej na kaflach i jak tworzy się taką przykładową klasę?
Z góry dziękuje i zapraszam do komentowania nawet negatywnego.
P-71776
KrzysiekB
Temat założony przez niniejszego użytkownika
» 2012-12-23 20:21:28
Udało mi się rozwiązać ten problem.
Wystarczyło zamiast tworzyć wskaźnik na zmienną sf::Texture zrobić zmienną sf::Texture takie moje głupie przeoczenie :)
Dodatkowo zrobiłem wyświetlanie tej mapy kafli.
[/code]

w main.cpp pomiędzy czyszczeniem a wyświetlaniem dodatkowo:
C/C++
window.clear();
for( short int x = 0; x < 3; x++ )
{
    for( short int y = 0; y < 3; y++ )
    {
        window.draw( MapaKafli[ x ][ y ] );
    }
}
window.display();
P-71786
Mrovqa
» 2012-12-23 20:21:52
C/C++
sf::Texture * Textura;
Textura->loadFromFile( DATA_1 );
Wskaźnik Textura nie wskazuje na żaden obiekt - odwołujesz się do nieswojej pamięci.
Ponadto:
Kafelek() { Sprite Kafel; }
O co tu chodzi? Tworzysz tymczasowy obiekt, z którego nawet nie korzystasz - ten kod nic nie zmienia w Twojej grze.

/edit: widzę, iż autor poradził sobie przed wysłaniem mojego postu. Gratuluję ;)
P-71787
DejaVu
» 2012-12-23 20:22:31
Próbuję zebrać myśli :P Jak je odpowiednio poskładam do kupy to jakąś poradę konkretną Ci napiszę, która powinna być dla Ciebie wygodna w użyciu :)

/edit:
... ale skoro problem rozwiązany to nie będzie wywodu ;p
P-71788
KrzysiekB
Temat założony przez niniejszego użytkownika
» 2012-12-23 20:29:52
@UP Dziękuje za pomoc choć trochę późną :D
A gdybym teraz chciał dorobić klasę chunków do tego programu to jak by ona mogła wyglądać?
Chodzi mi o to że konkretna mapa składała by się z klasy mapy=>klasy chunka=>klasy kafla
Klasa chunka przyjmuje dane z zewnątrz(z klasy mapy ale na czas testów sztywne dane) i zapisuje je do pola obiektu i na podstawie tych pól wyświetla takiego chunka
czy dobrze myślę czy można prościej?

Edit:/
Czy da się zrobić tak aby klasa kafelek dziedziczyła jednocześnie z klasy sprite i chunk?
P-71790
DejaVu
» 2012-12-23 21:00:31
@up: da się. Jednak na Twoim miejscu unikałbym stosowania jakichkolwiek dziedziczeń, dopóki nie nauczysz się prawidłowo tworzyć i pracować z prostymi klasami.
P-71794
KrzysiekB
Temat założony przez niniejszego użytkownika
» 2012-12-23 21:15:41
Więc jakie jeszcze klasy mogą zawierać gry bo szczerze to niemam pojęcia?
Probuję napisać grę w której mapa generuję sie do pliku a następnie do pamięci ładowana jest jej część (CHUNK)
dany chunk przechowuje dane kafli w nim zawartych i ogólnie całego wycinka jego mapy np. obejmuje 300x300 kafli
system chunków chcę wprowadzić po to że gra pobierała by zbyt wiele pamięci bo gdybym niemiał takiego systemu to
nawet tablica dwuwymiarowa typu np.short int[3000][3000] zajmowałaby sporo pamięci a przecierz mapa ta to nie tylko kafle na pierwszej warstwie ale
o wiele więcej więc nawet pare GB pamięci było by zajęte
dochodząc do granicy chunka ładowałby się następny a poprzedni usunął by się po przekroczeniu odpowiedniej odległości

A tak to z danego chunka wybieram sobie obszar rysowania czyli okno + trochę (aby zlikwidować efekt doczytywania)
czyli po +-3 kafle więcej w każdą stronę ekranu

Ponadto zauważyłem że SFML 2 pommimo lepszych opini na temat wydajności niejest jakimś demonem prędkości
bo na SFML 1.6 miałem lepszą wydajność przy podobnym progamie

Zapisywanie i wczytywanie oraz obszar renderu zrobiłem już kiedyś tylko problem jest z tymi chunkami
aby dynamicznie doładowywać obszar mapy

Edit:/
Poza tym chunki mają jeszcze jedną ogromną zaletę oprócz oszczędności pamięci a mianowicie
pozwalają na stworzenie nieskończonej mapy
P-71795
DejaVu
» 2012-12-23 21:29:41
Nie ma sensu rozważać tak zaawansowanych mechanizmów, skoro nie znasz dobrze języka C++. Po prostu najpierw zakopiesz się w takim projekcie, a potem go porzucisz.
P-71800
« 1 » 2
  Strona 1 z 2 Następna strona