Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

51

15.10.2015, 13:38

Nö nur hast du damit eine nicht kopierbare texturklasse. Du kannst natürlich die texturen in einem resourcemanager verwalten, zb dass du zu beginn alle gebrauchten texturen lädst und dann die einzelnen objekte ihn nach einer textur fragen.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

52

15.10.2015, 13:55

Nö nur hast du damit eine nicht kopierbare texturklasse. Du kannst natürlich die texturen in einem resourcemanager verwalten, zb dass du zu beginn alle gebrauchten texturen lädst und dann die einzelnen objekte ihn nach einer textur fragen.

z.B. so?

RessourcenManager.hpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once

#include "core\include\Game.hpp"

#include <string>

class RessourcenManager : public sf::Texture, sf::NonCopyable
{
public:
    RessourcenManager();

    // getter
    sf::Texture getAsteroidTexture() { return mAsteroidTexture; };

private:
    void loadAsteroidTextur();

private:
    sf::Texture mAsteroidTexture;

};


RessourcenManager.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "include\RessourcenManger.hpp"

RessourcenManager::RessourcenManager()
{
    loadAsteroidTextur();
}


void RessourcenManager::loadAsteroidTextur()
{
    if (!mAsteroidTexture.loadFromFile("assets/textures/player/Raumschiff.png"))
        throw std::runtime_error("Konnte die Textur nicht laden - AsteroidManger.cpp");

}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

53

15.10.2015, 14:06

Zum Beispiel. Allerdings gibst Du da *schon wieder* eine sf::Texture by value zurück, erzeugst also fröhlich Kopien. Genau deswegen sollst Du eine eigene Texture-Klasse machen, die einfach nur von sf::Texture und sf::NonCopyable erbt und dann die benutzen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

54

15.10.2015, 14:14

Und objekte dieser klasse dann zb in einem resourcemanager verwenden.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

55

15.10.2015, 14:19

Allerdings gibst Du da *schon wieder* eine sf::Texture by value zurück

Aber wenn ich z.B. ein & vor den Texturnamen setzte, dann bekomme ich einen Fehler. Wie soll ich es denn machen?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

56

15.10.2015, 14:35

Guck doch vielleicht noch mal in ein Lehrbuch. Du scheinst da ja generelle Probleme mit Referenzen zu haben. Es ist einfacher wenn du dir das ganze noch mal selbst anguckst und wir dann gegebenenfalls konkrete Fragen dazu beantworten.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

57

15.10.2015, 14:44

Meint ihr das ungefähr so:

RessourcenManager.hpp:

C-/C++-Quelltext

1
2
3
4
5
private:
    sf::Texture mAsteroidTexture;

    // Referenz auf die Textur
    sf::Texture &m_rTexture = mAsteroidTexture;


RessourcenManager.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
void RessourcenManager::loadAsteroidTextur()
{
    if (!m_rTexture.loadFromFile("assets/textures/player/Raumschiff.png"))
        throw std::runtime_error("Konnte die Textur nicht laden - AsteroidManger.cpp");

}

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

58

15.10.2015, 15:07

Bei einem Manager wäre es doch sinnvoll wenn er seine Texturen einfach im Konstruktor laden würde und pro Textur eine Methode anbietet die diese zurück liefert. Du könntest natürlich genau so gut eine Methode anbieten um eine Textur zu holen wobei du als Parameter angibst welche du haben möchtest. Das könntest du per Enumeration umsetzen. Das wäre zumindest sinnvoller als für jedes einzelne Asset eine Funktion zum laden anzubieten. Wofür sollte man das noch mal explizit machen wollen?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

59

15.10.2015, 15:11

Wofür sollte man das noch mal explizit machen wollen?

Damit die Sprites des Asteroiden auch eine Textur haben. Ein Bild davon habe ich schon einmal gepostet.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

60

15.10.2015, 15:20

Wäre das so richtig?

.hpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    // Die ganzen Texturen
    enum Textures
    {
        ASTEROID = 0,
        PLAYER = 1

    };

    sf::Texture getTexture(Textures textureName);


.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sf::Texture RessourcenManager::getTexture(Textures textureName)
{
    switch (textureName)
    {
    case Textures::ASTEROID:
        return mAsteroidTexture;
        break;

    case Textures::PLAYER:
        break;

    default:
        throw std::runtime_error("Konnte die Textur nicht laden - RessourcenManager.cpp");

    }

}

Werbeanzeige