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

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

1

14.09.2006, 12:28

Problem beim Verändern von Heikos Spiel

Hi zusammen,

ich habe gerade (besser die letzten zwei Tage) versucht Heikos Spiel umzubauen. Es ist nun ein kleines Rennspiel, will heißen, ich habe die Asteroiden in Boxen auf der Straße umgewandelt und die Klasse CShot ganz rausgelassen. Außerdem habe ich alles was mit Animation zu tun hat weggelassen, da ich momentan das nicht brauch.

Da ganze läuft auch. Ich habe nur ein Problem: die Kollision. Dabei muss ich ja prüfen ob mein Auto mit einer Box zusammengestoßen ist. Die Boxen gehe ich mittels der Liste von Heiko durch und habe also deren Koordinaten und Größe. Das Problem sind abre die DAtein des Spielers. Ich kriege einfach nicht die Höhe und Breite des PlayerSprites raus. HAbe es jetzt zwei Tage lang versucht und weiß mir nicht zu helfen.

Nun hoffe ich auf euch. Ich werde jetzt mal die relevanten Codeteile zeigen und hoffe, dass sich ein odre zwei die Mühe machen und sich des mal anschauen. Ich weiß echt keinen Rat mehr.

Danke schonmal - spacegaier

PS: Ich habe bereits zwei Rect's public setzen müssen um überhaupt dahin zu kommen. Ich weiß, dass des alles andere als sicher ist. Wenn ihr eine bessere Idee habt, wie ich sie der Kollisionserkennung übergeben kann sag's mir bitte.

sprite.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
22
23
24
#ifndef SPRITE_HPP
#define SPRITE_HPP

#include "framework.hpp"

class CSprite
{
public:
    CSprite();
    ~CSprite();

    void Load(const string sFilename);
    void SetColorKey(int R, int G, int B);
    void SetPos(float fXPos, float fYPos);
    void Render();
    SDL_Rect GetRect() {return m_Rect;}

private:
    SDL_Surface *m_pScreen;
    SDL_Surface *m_pImage;
    SDL_Rect m_Rect;
};

#endif


sprite.cpp

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
#include "sprite.hpp"

//Load

void CSprite::Load(const string sFilename)
{
    m_pImage = SDL_LoadBMP(sFilename.c_str());

    if(m_pImage == NULL)
    {
        cout << "Fehler beim Laden von: " << sFilename.c_str();
        cout << endl;
        cout << "Fehlermeldung: " << SDL_GetError() << endl;

        g_pFramework->Quit();

        exit(1);
    }

    m_Rect.x = 0;
    m_Rect.y = 0;
    m_Rect.w = m_pImage->w;
    m_Rect.h = m_pImage->h;
}


//SetPos

void CSprite::SetPos(float fXPos, float fYPos)
{
    m_Rect.x = static_cast<int>(fXPos);
    m_Rect.y = static_cast<int>(fYPos);
}


player.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
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef PLAYER_HPP
#define PLAYER_HPP

#include <list>
#include "sprite.hpp"

class CPlayer 
{
public:
    CPlayer();

    void Init();
    void Quit();
    void Render();
    void Update();
    void Reset();
    SDL_Rect GetRect() {return m_pSpritePlayer->GetRect();}
    float GetXPos() {return m_fXPos;}
    float GetYPos() {return m_fYPos;}
    float GetSpeed() {return m_fSpeed;}

private:
    void ProcessMoving();
    void CheckPosition();
    
    CSprite *m_pSpritePlayer;   
    float m_fXPos;
    float m_fYPos;
    float m_fSpeed;
    
};

#endiff


player.cpp

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
#include "player.hpp"

//Init

void CPlayer::Init()
{
    m_pSpritePlayer = new CSprite;

    m_pSpritePlayer->Load("player_1.bmp");
    m_pSpritePlayer->SetColorKey(255,0,255);
}

//Reset

void CPlayer::Reset()
{
    m_fXPos = 287.0f;
    m_fYPos = 370.0f;
    m_fSpeed = 0.0f;
}

//Render

void CPlayer::Render()
{
    m_pSpritePlayer->SetPos(m_fXPos, m_fYPos);
    m_pSpritePlayer->Render();
}


game.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
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef GAME_HPP
#define GAME_HPP

#include "player.hpp"
#include "box.hpp"

class CGame
{
public:
    CGame();

    void Init();
    void Run();
    void Quit();

private:
    void ProcessEvents();
    void SpawnBoxes();
    void RenderBoxes();
    void CheckCollisions();

    CPlayer *m_pPlayer;
    CSprite *m_pSpriteBackground_left;
    CSprite *m_pSpriteBackground_right;
    CSprite *m_pSpriteBox;
    CSprite *m_pSpritePlayer;
    CSprite *m_pSpriteBackground_midline[10];
    float m_fBoxTimer;
    bool m_bGameRun;
    list<CBox> m_BoxList;
};

#endif


game.cpp

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
#include "game.hpp"
#include "player.hpp"

//Init

void CGame::Init()
{
    m_pPlayer = new CPlayer;
    m_pPlayer->Init();
    m_pPlayer->Reset();

    m_pSpriteBackground_left = new CSprite;
    m_pSpriteBackground_left->Load("straßenstreifen_außen.bmp");
    m_pSpriteBackground_left->SetPos(100.0f,0.0f);

    m_pSpriteBackground_right = new CSprite;
    m_pSpriteBackground_right->Load("straßenstreifen_außen.bmp");
    m_pSpriteBackground_right->SetPos(675.0f,0.0f);

    for(int i=0 ; i<10 ; i++)
    {
        m_pSpriteBackground_midline[i] = new CSprite;
        m_pSpriteBackground_midline[i]->Load("straßenstreifen_innen.bmp");
        m_pSpriteBackground_midline[i]->SetPos(395.0f,i * 90.0f);
    }

    m_pSpriteBox = new CSprite;
    m_pSpriteBox->Load("box_1.bmp");
    
    m_fBoxTimer = 0.0f;

    m_bGameRun = true;
}

//SpawnBoxes

void CGame::SpawnBoxes()
{
    m_fBoxTimer += g_pTimer->GetElapsed();

    if(m_fBoxTimer >= 1.0f)
    {
        CBox Box;

        int XPos = rand()%550;
        XPos += 125;

        Box.Init(m_pSpriteBox, static_cast<float>(XPos), - 60.0f);

        m_BoxList.push_back(Box);

        m_fBoxTimer = 0.0f;
    }
}

//CheckCollisions

void CGame::CheckCollisions()
{
    list<CBox>::iterator ItBox = m_BoxList.begin();

    SDL_Rect RectBox;

    while(ItBox != m_BoxList.end())
    {
        RectBox = ItBox->GetRect();

        if(m_pPlayer->GetYPos() < RectBox.y + RectBox.h &&
           m_pPlayer->GetYPos() /* + h fehlt noch*/ > RectBox.y &&
           m_pPlayer->GetXPos() < RectBox.x + RectBox.w &&
           m_pPlayer->GetXPos() /* + w fehlt noch*/ > RectBox.x)
        {
            ItBox->SetAlive(true);
        }

        if(ItBox->IsAlive())
        {
            ItBox++;
        }
        else
        {
            ItBox = m_BoxList.erase(ItBox);

        }
    }
}

//RenderBoxes

void CGame::RenderBoxes()
{
    list<CBox>::iterator It;

    for(It = m_BoxList.begin(); It != m_BoxList.end(); It++)
    {
        It->Render();

        It->Update();
    }
}

Griesser

Frischling

Beiträge: 7

Wohnort: Villach

Beruf: Programmierer

  • Private Nachricht senden

2

14.09.2006, 16:45

Hi!

Deine GetRect-Funktion in CPlayer liefert dir das falsche Rechteck.

Sie müsste so aussehen (grob):

C-/C++-Quelltext

1
2
3
4
SDL_Rect GetRect()
{
    return m_pSpritePlayer->GetRect();
}


Die Sicherheitsabfragen musst natürlich noch einbauen.
Dein m_Rect in CPlayer-Objekten wird ja nie gefüllt.

Gruß
Markus

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

3

14.09.2006, 22:44

Wenn ich die GetRect-Funktion so verändere bekomme ich einen Laufzeitfehler bei der GetRect-Funktion in CSprite. Was mache ich falsch und wie kann ich trotzdem endlich meine Kollisionsdaten zusammenkriegen?

[list]"Unbehandelte Ausnahme bei 0x00411a86 in StreetRacer - I.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xccccccd4."[/list]
Und ich brauche in box.cpp den Instanzenzeiger m_pPlayer aus game.hpp. Da er privat ist war mein Gedanke eine GetFunktion für ihn zu schreiben. Doch diese bräuchte ja den Rückgabetyp CPlayer und das geht nicht. Wie kann ich diesen Zeiger sonst übergeben?

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

4

15.09.2006, 00:22

Zitat von »"Griesser"«


Dein m_Rect in CPlayer-Objekten wird ja nie gefüllt.
;)

Zitat von »"spacegaier"«


Doch diese bräuchte ja den Rückgabetyp CPlayer und das geht nicht.
Umm, wieso nich?

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

5

15.09.2006, 00:46

Okay, sorry geht doch. Vorher hat aber mein Compiler einen Fehler ausgespuckt. Muss wohl irgendwas verändert haben, so dass es jetzt geht oder ich habe mich vielleicht auch einfach nur vertippt.

Das unnötige Rect habe ich bereits rausgenommen.

ACHTUNG: Ich editiere in meinem ersten Beitrag den Code, damit die überflüssigen Objekte weg sind !!!

Werbeanzeige