Cpp + SFML Spiel



  • Du kannst es erstmal machen wie Pokemon, also mehr oder weniger kleine Level connected mit Portalen. Das ist sehr einfach. Eine kontinuierliche Welt ist schon etwas komplizierter, da musste dir was ausdenken. Chunks sind dabei schon mal keine schlechte Idee, dann musst du halt noch überlegen wann du was von der Platte lädst etc. Wobei, auf einem PC kannst du bei so einem Spiel wahrscheinlich mehr Strecke auf einmal in den Speicher laden als jemals jemand zurücklegen könnte.



  • Ok, ich denke soweit ist mir das jetzt eigentlich alles klar, aber bei der umsetzung bekomm ich dann doch etwas Schwierigkeiten. Ich habe grad einfachmal versucht eine 10*10 Tile große Fläsche mit der selben Textur zu erstellen.
    Ich denke aber, dass ich das irgendwie falsch angegangen bin, da es erstens doch relativ lange dauert bis etwas geschiet und zweitens, da anstatt der Textur nur ein weißes Feld entsteht.

    #include <SFML/Graphics.hpp>
    #include "Tile.h"
    
    int main() {
    	sf::RenderWindow window(sf::VideoMode(600, 600, 32), "Einfacher Raum", sf::Style::Close);
    	sf::Texture t;
    	t.loadFromFile("texture.png", sf::IntRect(0, 0, 16, 16));
    	std::vector<std::vector<Tile>> tilemap(10, std::vector<Tile>(10));
    	for(unsigned int x = 0; x < tilemap.size(); x++) {
    		for(unsigned int y = 0; y < tilemap[x].size(); y++) {
    			Tile tile;
    			tile.setTexture(t);
    			tilemap[x][y] = tile;
    		}
    	}
    	sf::Event event;
    	while(window.isOpen()) {
    		while(window.pollEvent(event)) {
    			if(event.type == sf::Event::Closed || event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) window.close();
    		}
    		for(unsigned int x = 0; x < tilemap.size(); x++) {
    			for(unsigned int y = 0; y < tilemap[x].size(); y++) {
    				sf::Sprite s;
    				s.setTexture(tilemap[x][y].getTexture());
    				s.setPosition(x * s.getGlobalBounds().width, y * s.getGlobalBounds().height);
    				window.draw(s);
    			}
    		}
    		window.display();
    		window.clear();
    	}
    	return 0;
    }
    
    #ifndef TILE_H
    #define TILE_H
    
    #include <SFML/Graphics/Texture.hpp>
    
    class Tile {
    public:
    	void setTexture(sf::Texture texture) { _texture = texture; };
    	sf::Texture getTexture() { return _texture; };
    private:
    	sf::Texture _texture;
    };
    #endif
    

    Sorry wenn hier gravierende Fehler sind komm grad von Java und will natürlich auch C++ beherschen 😉



  • Schau dir die Dokumentation zu sf::Sprite und sf::Texture an. Du willst sicher nicht pro Tile eine Textur.



  • Sorry, hab nochmal eure Antworten durchgelesen und schon überarbeitet, Tile sieht jetzt so aus, so war das doch gemeint oder ?

    #ifndef TILE_H
    #define TILE_H
    
    #include <SFML/Graphics/Texture.hpp>
    
    class Tile {
    public:
    	void setTyp(unsigned int typ) { _typ = typ; };
    	unsigned int getTyp() { return _typ; };
    	const enum Typs { WOOD, STONE };
    private:
    	unsigned int _typ;
    };
    #endif
    


  • Grundsätzlich ja, aber was soll const enum sein? Und warum nimmst du unsigned int , wenn du extra den Datentyp Typs (englisch wäre übrigens "Type") definierst?

    Das #include brauchst du auch nicht mehr. Und du solltest von der Angewohnheit wegkommen, präventiv für jede Eigenschaft gleich ein get/set-Methodenpaar zu definieren. Ein Konstruktor wäre vielleicht sinnvoll.



  • Sorry bin das mit den unsigned so gewöhnt und typs ist eine art Denglisch ^^
    hab halt die alte Klasse verändert und vergessen den #include rauszunehmen und das set get zu ändern. Mit const hab ich was ausprobiert, frag besser nicht war etwas sinnlos und _typ speichert die Art dieses Tiles während man Typs einfach zum vergleichen verwendet(if(tile.getTyp == Tile::WOOD) usw..
    Ok, das war nur ne schnell ausgetauschte Klasse, tut mir leid, hab einfach keinen 2. Blick drüber geworfen. Und View verschiebe ich mit move? Wie mach ich denn dann die Spielfigur davon unabhängig ?



  • Sorry habs schon, erst denken dann Fragen oder eher sein lassen XD



  • Und kein _ vor Variablen, etc. Das ist für die Implementierung reserviert!!!!!!!!!!!



  • u machst dir eine große Textur (Tilemap) die alle Tiles für das Level hält. Das Aussehen des Levels wird dann definiert durch einen Index in diese map. Den Kram schiebst du in einen VBO (äh, das wäre für OpenGL/DirectX, also, du hälst die Daten irgendwie so vor, dass man sie zeichnen kann) und dann zeichnest du den Kram halt abhängig von der Position der Spie



  • jhhhhhhhhh schrieb:

    Und kein _ vor Variablen, etc. Das ist für die Implementierung reserviert!!!!!!!!!!!

    Nö.

    int _Gross; // Nicht erlaubt !
    int _klein; // Erlaubt !
    int __bla;  // Nicht erlaubt !
    

  • Mod

    Ethon schrieb:

    jhhhhhhhhh schrieb:

    Und kein _ vor Variablen, etc. Das ist für die Implementierung reserviert!!!!!!!!!!!

    Nö.

    int _klein; // Erlaubt !
    

    ausser im globalen Namensraum.


Anmelden zum Antworten