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

TigerClaw25

unregistriert

21

15.05.2013, 12:53

Genau, in Heikos Buch wird z.B. nur das hier gezeigt:

CSpieler *p_Zeiger = NULL;

p_Zeiger = new CSpieler[AnzahlSpieler];

Für mich als unerfahrener Anfänger ist das ungewohnt, da ich new nur so kenne, dass ich Speicher auf dem Heap von einem bestimmten Datentyp reserviere. Daher würde ich spontan eher schreiben p_Zeiger[AnzahlSpieler] = new CSpieler ... Da reicht das Buch vllt nicht aus.

Und wie gesagt ist das hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
  // Hintergrundbild (Sprite) laden
    p_Spritemap = new CSprite [TOTAL_TILES];

    p_Spritemap[0].Load ("Data/red.bmp");
    p_Spritemap[1].Load ("Data/green.bmp");
    ...
...


mit dem Punktoperator anders als das hier:

C-/C++-Quelltext

1
2
3
4
5
6
  // Hintergrundbild (Sprite) laden
    p_Spritemap[0] = new CSprite;
    p_Spritemap[0]->Load ("Data/red.bmp");
   ...
    ...
...


Den Unterschied erkenne ich nicht.

Nun ja, ich habe ja derzeit genau vier unterschiedliche Tiles (Red, Green, Blue und Yellow). Und ich dachte mir, dass es sinnvoll wäre, den sichtbaren Bereich (Höhe und Breite des Bildschirms z.B. 800x600) auch in der Größe der Tiles, die hinenpassen, aufzuteilen. Und dann jede Fläche mit einem der Tiles füllen.

Das ist ja mein jetziger Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
        // Neuen Spieler initialisieren
    m_pPlayer = new CPlayer;
    m_pPlayer->Init ();
    m_pPlayer->Reset ();

            p_Spritemap = new CSprite [TILES_SPRITES];
            p_Spritemap[0].Load ("Data/red.bmp");
            p_Spritemap[1].Load ("Data/green.bmp");
            p_Spritemap[2].Load ("Data/yellow.bmp");
            p_Spritemap[3].Load ("Data/blue.bmp");

    // Spiel läuft
    m_bGameRun = true;


Dann dachte ich an sowas:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // Neuen Spieler initialisieren
    m_pPlayer = new CPlayer;
    m_pPlayer->Init ();
    m_pPlayer->Reset ();

    CSprite *tiles[TOTAL_TILES];

    for (int i = 0; i < TOTAL_TILES; i++)
    {
        tiles[i] = new CSprite [TILEMUMBER];
        tiles[TILEMUMBER]->Load ("Data/red.bmp");
    }
    // Spiel läuft
    m_bGameRun = true;


Oder reicht die erstgenannte Möglichkeit fürs erste aus?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (15.05.2013, 12:59)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

22

15.05.2013, 13:11

Dir fehlt es wirklich massiv an Grundlagen.
Im einen Fall erzeugst du ein Array. Im anderen Fall erzeugst du ein Array auf Zeiger und füllst dann an der Stelle 0 im Array mit einem Wert, eben mit einem Zeiger auf eine Instanz. Und dein unterer Code sagt recht wenig aus. Einmal füllst du ein Array mit verschiedenen Daten und einmal lädst du die selbe Ressource über eine Schleife in ein Array. Wenn es nur darum geht ob du das was du lädst selbst schreibst oder das irgendwie mit einer Schleife löst, dann mach es doch so wie es dir selbst besser gefällt;) Und jetzt guck dich mal nach einem Buch um;)
„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.“

TigerClaw25

unregistriert

23

15.05.2013, 14:36

Also hab jetzt mal eine andere Möglichkeit versucht, aber mein Programm spinnt irgendwie total, es stürzt ständig ab, hat mit den RECTS zutun :(

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include "Game.hpp"

// Tiles - Konstanten
const unsigned int TILE_WIDTH = 80;
const unsigned int TILE_HEIGHT = 80;
const int TOTAL_TILES = 64;
const int TILES_SPRITES = 4;
    
// Map Größe
const unsigned int map_breite = 16;
const unsigned int map_hoehe = 4;

// Map selbst
unsigned int tilemap[map_hoehe][map_breite] =  
  { 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,
  3,2,1,0,0,1,2,3,0,1,2,3,0,1,2,3,
  0,0,0,0,0,1,2,3,0,1,2,3,0,1,2,3,
  3,3,3,3,0,1,2,3,0,1,2,3,0,1,2,3
};

//The different tile sprites
const int TILE_RED = 0;
const int TILE_BLUE = 1;
const int TILE_YELLOW = 2;
const int TILE_GREEN = 3;
SDL_Rect clips[TILES_SPRITES];
// Konstruktor
//
// Aufgabe: Allgemeine Initialisierungen
//
CGame::CGame ()
{
    m_pPlayer = NULL;
    p_tileSheet = NULL;

} // Konstruktor

// ClipTiles
//
void CGame::ClipTiles()
{ 

    for (int i = 0; i<TILES_SPRITES; i++)
    {
    clips[i] = p_tileSheet->GetRect();
}
    clips[TILE_RED].x = 0;
    clips[TILE_RED].y = 0;
    clips[TILE_RED].w = TILE_WIDTH;
    clips[TILE_RED].h = TILE_HEIGHT;

    clips[TILE_BLUE].x = 80;
    clips[TILE_BLUE].y = 0;
    clips[TILE_BLUE].w = TILE_WIDTH;
    clips[TILE_BLUE].h = TILE_HEIGHT;

    clips[TILE_YELLOW].x = 0;
    clips[TILE_YELLOW].y = 80;
    clips[TILE_YELLOW].w = TILE_WIDTH;
    clips[TILE_YELLOW].h = TILE_HEIGHT;

    clips[TILE_GREEN].x = 80;
    clips[TILE_GREEN].y = 80;
    clips[TILE_GREEN].w = TILE_WIDTH;
    clips[TILE_GREEN].h = TILE_HEIGHT;
    
}
// Clip Tiles

// Init
//
// Aufgabe: Hintergrund initialisieren
//
void CGame::Init ()
{
        // Neuen Spieler initialisieren
    m_pPlayer = new CPlayer;
    m_pPlayer->Init ();
    m_pPlayer->Reset ();

    p_tileSheet = new CSprite;
    p_tileSheet->Load ("Data/tiles.bmp");


    // Spiel läuft
    m_bGameRun = true;

} // Init

// Quit
//
// Aufgabe: Instanzen freigeben
//
void CGame::Quit ()
{
        // Hintergrundsprite freigeben
    if (p_tileSheet != NULL)
    {
        delete (p_tileSheet);
        p_tileSheet = NULL;
    }

        // Spieler freigeben
    if (m_pPlayer != NULL)
    {
        m_pPlayer->Quit ();
        delete (m_pPlayer);
        m_pPlayer = NULL ;
    }

} // Quit

// Run
//
// Aufgabe: Hauptschleife des Spiels
//
void CGame::Run ()
{

    CSprite *tile[TOTAL_TILES];

    // Hauptschleife des Spiels durchlaufen
    //
    while (m_bGameRun == true)
    {
    
        // Events bearbeiten
        ProcessEvents ();
        
        // Framework updaten und Buffer löschen
        g_pFramework->Update ();
        g_pFramework->Clear ();

        // Daten clipen
        ClipTiles();

        
        box = p_tileSheet->GetRect();


        for (int j = 0; j<map_breite; j++)
        {
            for (int k = 0; k<map_hoehe; k++)
            {
                tile[tilemap[j][k]]->SetPos(k*(box.w), j*(box.h));
                tile[tilemap[j][k]]->Render();
            }
        }
    
            // Spieler updaten und rendern
        m_pPlayer->Update ();
        m_pPlayer->Render ();
        
        // Buffer flippen
        g_pFramework->Flip ();
         
    }


} // Run

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

24

15.05.2013, 14:45

Ok.
„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.“

TigerClaw25

unregistriert

25

15.05.2013, 15:15

Sollte indirekt eine Frage sein, was falsch laeuft. ;-)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

26

15.05.2013, 15:26

Sollte eine indirekte Antwort sein. Wenn du dich nicht mit den Grundlagen beschäftigen möchtest lese ich die 160 Zeilen Code nicht und suche nach irgendwelchen Fehlern. Ich brauche für so eine blinde Fehlersuche ordentlich Zeit und solange du dich nicht mit den Grundlagen beschäftigst kann ich das vermutlich noch mehrfach hier tun. Also nehme ich diesen Zeitpunkt und lasse dich selbst suchen. Vor allem kenne ich dein System und deine Gedanken dahinter nicht, weiß nicht genau was da nun falsch läuft und überhaupt. Der Debugger ist dein Freund. Vielleicht kommst du ja damit 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.“

TigerClaw25

unregistriert

27

15.05.2013, 19:56

Bin mir momentan nicht sicher, wie ich am besten aus einem Bild einzelne Sprites entnehmen kann ... :( zumindest nicht mit der SDL Vorlage aus Heikos Buch :(

hmm, komme irgendwie nicht weiter. Momentan nutze ich einzelne Bilder die ich lade, würde aber gerne aus einem Bild einzelne Bilder entnehmen ... wie gesagt, mein Programm baut auf Heikos Code auf, komme da derzeit nicht weiter ... eventuell kennt doch jemand ein gutes Tutorial, außer das von lazyfoo ...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (24.05.2013, 12:17)


TigerClaw25

unregistriert

28

26.05.2013, 11:33

Hallo nochmal,

hätte eine Frage bezüglich Kollisionen und Tiles.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// CheckCollisions
//
// Aufgabe: Kollisionen überprüfen
//
void CGame::CheckCollisions ()
{
            SDL_Rect Player;
        SDL_Rect Tile;

        Player = m_pPlayer->GetRect();
        Tile = p_Spritemap[0].GetRect();

        if (Tile.y < Player.y + Player.h &&
                Tile.y + Tile.h > Player.y &&
                Tile.x < Player.x + Player.w &&
                Tile.x + Tile.w > Player.x)
        {
Tue irgendetwas
}
} // CheckCollisions


1- Zum eine würde ich gerne erfahren, ob ich die Kollisionsabfrage gleich innerhalb der beiden for-Schleifen einfüge, die meine einzelnen Tiles durchlaufen und rendern?

2. ... ob folgendes ok ist:

C-/C++-Quelltext

1
2
Player = m_pPlayer->GetRect();
        Tile = p_Spritemap[0].GetRect();


Das eine Mal verwende ich ja Zeiger. Daher meine Frage, ob es hier Sinn machen würde, Zeiger für Tilemaps zu verwenden?

3. Meine dritte Frage bezieght sich auf die Kollision selbst. Moment fehlen noch die for-Schleifen zum durchlaufen der Tiles. Hab es nur zu Testzwecken wie oben geschrieben. Meine Frage nun, wie ich theoretisch da vorgehe? Die Kollsion an sich steht bereits. Aber innerhalb der if-Bedinung muss ich ja festlegen, dass der Spieler nicht weiter gehen darf. Schreib ich mir dazu eine kleine Funktion ion der CPlayer-Klasse, über die ich die aktuelle Laufrichtung auf false setze?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

29

26.05.2013, 15:25

Versuch es doch einfach mal so zu machen wie du selbst denkst;) Du hast doch selbst Antworten auf deine Fragen gegeben und es einfach mal auszuprobieren sollte ja nicht so schwer sein.
„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.“

TigerClaw25

unregistriert

30

27.05.2013, 10:35

Na ja mit meiner Version oben wird die Kollisionsueberpruefung, wenn ich diese den separat laufen lasse, so nicht klappen. Wenn ich die Kollisionsueberpruefung direkt bei anordnen der Tiles einfuege, dann laeuft alles. Lasse ich es aBer separat laufen mit zwei zusaetzlichen for schleifen, funktioniert es nicht ...

Werbeanzeige