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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

1

05.12.2011, 03:34

Probleme bei Spielrealisierung

Hey,
ich habe mir gedacht ich mache mal ein Spiel wo es Ziel ist 3 gleichfarbige Kugeln nebeneinander zukriegen damit sie Zerstört werden.

Da dies mein erstes Projekt ist in dem ich mich mal richtig an den Klassen wage, ist es mir sehr wichtig das ich die Klassen auch richtig verwende.
Leider habe ich bei der Realisierung ein paar Schwierigkeiten z.b kann ich meine Klasse: CKugel kein Array verpassen z.b so CKugel Kugel[10] (Farbe, X,Y);
obwohl es bei einer einzigen Kugel geht. Ich poste mal meine Klasse hier rein es währe cool wenn ihr mir Tipps geben könntet was ich verbessern könnte oder gar falsch mache.

Headerdatei:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ############################################
//  Headerdatei: CKugel.hpp
// ############################################

class CKugel
{
    private:
        // Membervariablen
        int m_Farbe;    // Kugel Farbe
        float m_X;      // X-Koordianten
        float m_Y;      // Y-Koordinaten
        sf::Image m_Image;
        sf::Sprite m_Sprite;


    public:
        // Memberfunktionen
        CKugel (int Farbe, float X, float Y);
        void Zeichnen (sf::RenderWindow &Game);
};


Quellcode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// ############################################
//  Quelldatei: CKugel.cpp
// ############################################

#include <SFML\Graphics.hpp>
#include "CKugel.hpp"
#include <iostream>

using namespace std;

// Konstruktor
CKugel::CKugel (int Farbe, float X, float Y)
{
    // Startwerte setzen
    m_Farbe = Farbe;
    m_X = X;
    m_Y = Y;

    // Image Laden
    switch (m_Farbe)
    {
        // Weis
        case 0:
        {
            // Image laden
            m_Image.LoadFromFile ("gfx/Spiel_Kugel_Weis.png");

            // Sprite erstellen
            m_Sprite.SetImage (m_Image);
            m_Sprite.SetPosition (m_X, m_Y);
        } break;

        // Blau
        case 1:
        {
            // Image laden
            m_Image.LoadFromFile ("gfx/Spiel_Kugel_Blau.png");

            // Sprite erstellen
            m_Sprite.SetImage (m_Image);
            m_Sprite.SetPosition (m_X, m_Y);
        } break;

        // Gelb
        case 2:
        {
            // Image laden
            m_Image.LoadFromFile ("gfx/Spiel_Kugel_Gelb.png");

            // Sprite erstellen
            m_Sprite.SetImage (m_Image);
            m_Sprite.SetPosition (m_X, m_Y);
        } break;
    }
}

// Zeigen
// Aufgabe: Zeichnet eine Kugel ins Spiel
void CKugel::Zeichnen (sf::RenderWindow &Game)
{
    Game.Draw (m_Sprite);
}


EDIT:
Ich habe einen Standard Konstruktor vergessen ich hatte vorher nur einen mit Parameter.
Aber ich währe euch trotzdem dankbar wenn ihr mir ein paar Tipps geben könntet.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Raidenkk« (05.12.2011, 03:58)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

05.12.2011, 07:11

Du kannst deshalb in CKugel kein Array von CKugel anlegen, weil diese Art von Speicherdefinition rekursiv wäre. Es ginge aber CKugel& oder CKugel*. Ansonsten müsste der Compiler ja das machen:
1) Lege eine CKugel A an
2) Packe 10x CKugel in A, nenne sie B-K
3) Für jede Kugel aus 2) starte wieder bei 2)
Das das keinen Sinn macht, sollte deutlich sein. Aber auch vom Design her ist es mehr als fraglich, wieso eine Kugel 10 weitere Kugeln besitzen sollte.
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]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

3

05.12.2011, 07:34

Ausserdem solltest du überlegen, ob es eine gute Idee ist jeder Kugel eine eigene Kopie vom Image zu geben.
Wenn du jetzt mitten im Spiel eine neue Kugel erstellst kann es durchaus sein, dass dein Spiel für ne halbe Sekunde stehen bleibt.
"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?

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

4

05.12.2011, 09:05

@NachoMan Also währe es besser jedes Image einmal zu laden und dann jede den die Passende Farbe zu vergeben?

Das mit dem Array habe ich gelöst. Aber ich hätte da noch eine Frage was würdet ihr für meine Kugeln nehmen Vectoren,Listen?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

05.12.2011, 12:18

Das Problem ist nicht dein Array. BlueCobold hat ja schon beschrieben was das eigentliche Problem ist. Du erstellst eine Kugel. Diese Kugel hat dann ein Array von 10 Kugeln. Jede dieser 10 Kugeln hat dann wieder ein Array von 10 Kugeln. Das geht dann unendlich so weiter.
Mach dir doch eine Klasse für dein Spielfeld, in der du dann ein Array von allen Kugeln hast. Natürlich kannst du auch gerne mit einem Vector oder einer List arbeiten. Diese Datenstrukturen haben einige Vorteile. Wenn du damit schon gearbeitet hast, dann verwende ruhig diese, ansonsten guck dir vielleicht noch mal an wie sie funktionieren, um sie dann richtig einzusetzen.
Wenn du dir Gedanken darüber machst, wie deine Klasse aussehen soll, hilft es vor allem am Anfang weiter, wenn du einfach Bildlich denkst. Stell dir vor du hast das Spiel als Brettspiel vor dir liegen. Du hast ein Spielfeld und Kugeln. Die Kugeln befinden sich auf dem Spielfeld, von daher könnte es Sinn machen, dass die Spielfeldklasse die Kugeln kennt. Die Kugeln haben eine Farbe, von daher sollten die Kugeln ihre Farbe kennen. So vereinfacht es manchmal zu entscheiden wo etwas gespeichert werden soll. Das funktioniert nicht immer 100%, hilft in vielen Fällen aber schon mal weiter.
„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.“

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

6

05.12.2011, 12:49

@NachoMan Also währe es besser jedes Image einmal zu laden und dann jede den die Passende Farbe zu vergeben?

Das mit dem Array habe ich gelöst. Aber ich hätte da noch eine Frage was würdet ihr für meine Kugeln nehmen Vectoren,Listen?

Ich habe es früher auch so gemacht, dass meine Objekte eine Kopie ihres Sprites hatten. Mittlerweile habe ich mir dafür einen ImageHandler geschrieben, der wiederum eine Map für alle Sprites des Spiels hat. Beim Zeichnen der Objekte greife ich dann auf das richtige Sprite für das Objekt zu. Von daher würde ich dir eine Map für deine Kugeln empfehlen. Sprites ein mal zu laden und dann an der richtigen Stelle zu verwalten ist sowieso eine gute Idee, meiner Meinung nach.

grüße
Saik0

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

05.12.2011, 13:40

Ich habe es früher auch so gemacht, dass meine Objekte eine Kopie ihres Sprites hatten.

Es ist auch richtig ein Sprite für jedes Objekt zu haben. Das Image sollte aber nur einmal geladen werden.
Das Image enthält das Bild selbst und das Sprite einen Zeiger auf das Image und z.b. die Position an der es gezeichnet wird. :D

Wo liegt der Vorteil einer Map gegenüber einer List oder eines Vectors? Hier sehe ich nur Nachteile.

@Raidenkk: Informier dich über die Unterschiede der verschiedenen Container. Falls du nicht ständig neue Kugeln erstellst oder löschst würde ich einen Vector nehmen, ansonsten eine List.
"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?

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

8

05.12.2011, 13:55

Naja die Objekte, die ich zeichnen möchte, kennen nur die Position an die sie gezeichnet werden. Das Image selbst oder der Pfad zu dem Image kennen sie nicht ^^ Ich verwende eine Map weil ich ein Freund von Key Value Paaren bin. Das ist so der große Vorteil für mich.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

9

05.12.2011, 14:02

Ich verwende eine Map weil ich ein Freund von Key Value Paaren bin. Das ist so der große Vorteil für mich.

Ja, aber was bringt es dir in dem Fall?
"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?

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

10

05.12.2011, 14:08

Weil ich in diesem Fall meine Bilder anhand eines Key zeichnen kann ohne, dass das dazugehörige Objekt weiß wie sein Bild heißt und ich mir dann ein paar getter und setter sparen kann.

Werbeanzeige