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

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

1

21.10.2010, 19:55

Topdown Shooter mit SFML Hilfe

Hi!

Ich wollte mal ein kleines Topdown-shooter-game schreiben. Das klappt auch soweit, aber
jetzt frage ich mich, wie ich eine rotation hinbekomme, sodass nicht die position des Sprites verändert wird.
Deshalb fällt "setRotation(<float>);" schonmal weg...

Hat jemand einen Tipp wie ich das lösen kann?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

21.10.2010, 20:07

das sollte helfen.(das ist nicht nur der punkt um dem gedreht wird sondern auch der mittelpunkt(0|0) bei der position. ist dein sprite 30x30pixel groß und stellst das center auf 15|15 musst du es mit setPosition auf 15|15 setzen damit es sich nicht an der position von vorher befindet.)
hoffe das war verständlich.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

21.10.2010, 20:34

Hallo,

ich verweise hier mal noch auf das Tutorial von E122, der erklärt wie das auch mit der SDL (und entsprechender Zusatzbibliothek) funktioniert, wenn man kein Rotationszentrum beliebig setzen kann. Dort findest du auch eine kleine Grafik von mir, die das noch einmal verdeutlicht.

Aber solange du mit der SFML arbeitest solltest du das wirklich so machen wie NachoMan das bereits geschrieben hat.

Gruß
SaRu_

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

4

21.10.2010, 21:37

@NachoMan: Danke! Genau sowas habe ich gebraucht! Eigentlich hätte ich auch selbst darauf kommen müssen... aber naja, danke!

@SaRu: Ja, sein Tut habe ich mir schon angesehen, aber Ich finde SFML doch viel einfacher als SDL... Und da SDL fast eine ganze andere Art hat, Sprites, bzw. Images zu blitten, ist das umdenken auf sdl schon etwas schwerer. Trotzdem danke!

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

5

23.10.2010, 21:36

So, jetzt habe ich wieder eine Frage:

Um ein Spiel zu schreiben, dass "kein Ende nimmt", muss ich die Gegner aus einer Klasse laden.
Aber wie genau sollte so eine Klasse aussehen?
Ich habe das so versucht:

Gegner.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#include <SFML/Graphics.hpp>

class Gegner : public sf::Sprite
{
public:
    Gegner();
    void doDamage();
};


Gegner.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#include <SFML/Graphics.hpp>

Gegner::Gegener()
{
    sf::Image _gegner;
    _gegner.LoadFromFile("Data/Textures/Gegner.png");
    this.SetImage(_gegner);
}


Dann lade ich die Gegner - Klasse ins Spiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include <SFML/Graphics.hpp>

int main()
{
    ...
    Gegner *gegner1;
    ...
    App.Draw(gegner1);
    ...
}


So, dann bekomme ich so eine Meldung:

Quellcode

1
Konvertierung von 'Gegner *' in 'const sf::Drawable' nicht möglich


Ich weiß, da ist etwas extrem falsch, aber was ist es?
Darf "Gegner" vielleicht nicht als sf::Sprite definiert werden(public sf::Sprite)?

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

6

23.10.2010, 21:42

Darf "Gegner" vielleicht nicht als sf::Sprite definiert werden(public sf::Sprite)?


Warum sollte er es nicht dürfen?
Die Fehlermeldung sagt dir doch was Sache ist... dereferenzier den Zeiger und fertig.

Quellcode

1
App.Draw(*gegner1);

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

7

23.10.2010, 21:51

hmmm. jetzt läufts zwar, aber das, was eigentlich als bild dargestellt werden sollte, ist jetzt ein weißer kasten...

C-/C++-Quelltext

1
2
3
4
...
Gegner gegner1;
...
App.Draw(gegner1);


Die Pfadangaben sind richtig...

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

23.10.2010, 21:59

in deinem konstruktor wird ein temporäres image erzeugt, zugeteilt und wieder freigegeben. die images solltest du mit einem imagemanager oder wenigstens eine stufe tiefer laden(in der klasse, die die gegner spawnt z.b.) und dann die gegnerklasse übergeben.

das design würde mir aber nicht gefallen. sprite kannst du genau so gut als member nehmen und der klasse eine rendermethode geben. wenn du mit vererbung arbeiten willst kannst du eine allgemein lasse für alle(beweglichen) objekte auf deinem spielfeld schreiben und die gegner und den spieler davon erben lassen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

9

23.10.2010, 22:00

Du solltest nachschauen, ob "LoadFromFile" false zurückgibt. Vielleicht wird das Bild nicht richtig geladen bzw. er kann es überhaupt nicht finden - dann kommt gerne mal ein weißer Kasten.

Ansonsten solltest Du evtl. dein Design überdenken. Stell dir beispielsweise die Frage: Ist der Gegner ein Sprite oder hat er ein Sprite?

EDIT: Stimmt, du erstellst ja erst ein Image im Konstruktor, wie NachoMan erwähnt hat.

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

10

23.10.2010, 22:09

@Luinechor:
Ich habe es nochmal so probiert:

Gegner.h

C-/C++-Quelltext

1
2
3
4
5
...
public:
    Gegner();
    bool init(const std::string& file);
...


Gegner.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
...
Gegner::Gegner()
{
}

bool init(const std::string& file)
{
    sf::Image _gegner;
    if(!_gegner.LoadFromFile(file)
        return EXIT_FAILURE;
    SetImage(_gegner);
}


Main.cpp

C-/C++-Quelltext

1
2
3
4
5
...
Gegner gegner1;
gegner1.init("Data/Textures/gegner.png");
...
App.Draw(gegner1);

So müsste ich ja eine Rückmeldung bekommen, ob die Datei nicht geladen werden konnte, aber das passiert nicht....
Da ist immernoch ein weißer kasten...


@NachoMan:
Ich werde mal einen ImageManager einbauen und dann an die Gegner Klasse übergeben.
Wenn ich mehrere Gegner - Typen habe, dann ist das so auch einfacher denke ich...


Danke an euch :)

Werbeanzeige