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

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

1

03.10.2010, 16:50

Problem bei Sprite- erstellung (SDL)

hallo,

ich wollte das Spiel aus dem Buch zu einem Tower Defense (Canyon) umschreiben.
ich habe die Asteroiden- Klasse kopiert und angepasst, sodass ich damit Towers darstellen könnte.

ich habe ein Problem, und zwar:

Quellcode

1
2
3
Eine Ausnahme (erste Chance) bei 0x00d7235b in TowerDefense_02.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000008. 
Unbehandelte Ausnahme bei 0x00d7235b in TowerDefense_02.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000008. 
Das Programm "[2064] TowerDefense_02.exe: Systemeigen" wurde mit Code -1073741819 (0xc0000005) beendet.

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
bool CGame::BuildTowers(SDL_Event &Event, CSprite *pSpriteTower) 
{ 
g_pLogfile->fTextout(1,"<b>CGame::Build(...)</b>"); 
CTower Tower; 
int _x, _y; 
_x = Event.motion.x; 
_y = Event.motion.y; 
int X, Y; 

if(_x > 40) { X = ((_x / 40)-1); } else { X=0; } //Formel, um das Genaue Feld zu bekommen 
if(_y > 40) { Y = ((_y / 40)-1); } else { Y=0; } //Formel, um das genaue Feld zu bekommen 

if( X<MAP_L && Y<MAP_H ) //die Map ist in 20 (x) mal 15 (y) unterteilt 
if( g_pMap->m_bBuildable[X][Y] == true ) 
if( g_pMap->m_bFree[X][Y] == true ) 
{ 
g_pMap->m_bFree[X][Y] = false; 
X = (X*40); //Formel zur Berechnung der Pixel Koordinaten 
Y = (Y*40); //Formel zur Berechnung der Pixel Koordinaten 
g_pLogfile->fTextout("0"); //zum Testen, wo genau der Error kommt 
Tower.Init(pSpriteTower, static_cast<float> (X), static_cast<float> (Y)); //wie bei den Asteroiden 
g_pLogfile->fTextout("1"); //zum Testen, wo genau er Error kommt 
g_pGame->m_TowerList.push_back (Tower); 
g_pLogfile->fTextout("2"); //zum Testen, wo genau er Error kommt 
return (true); 
} 
else 
return (false); 


}

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mein Logfile: 
Logfile 

BUILD: RELEASE 

Send E-Mail to me 

Initialising Video 
Fullscreen Mode : true 
CMap::CMap() 
CMap::CMap() 
CMap::InitData() 
CGame::Build(...) 
0


Das letzte, was immer in meinem Logfile steht ist "0",

was von "g_pLogfile->fTextout("0");" kommt. Das bedeutet, dass das "Tower.Init(...)" nicht funktioniert.

woran könnte das liegen?



MfG RmbRT
"Dumm ist, wer dummes tut."

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

03.10.2010, 17:01

Zeig doch mal die init Methode. Nicht jeder hat das Buch oder will nachschlagen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

3

03.10.2010, 17:13

Die Init-Methode

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CTower::Init (CSprite *pSpriteTower, float fXPos, float fYPos) 
{ 
// Zeiger auf Sprite kopieren und Koordinaten setzen 
m_pSpriteTower = pSpriteTower; 
m_fXPos = fXPos; 
m_fYPos = fYPos; 
 // Rect initialisieren 
m_Rect.x = static_cast<int>(fXPos); 
m_Rect.y = static_cast<int>(fYPos); 
m_Rect.w = m_pSpriteTower->GetRect().w; 
m_Rect.h = m_pSpriteTower->GetRect().h; 
// Turm aktivieren 
m_bIsAlive = true; 
} // Init
"Dumm ist, wer dummes tut."

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

4

03.10.2010, 17:26

Ich habe bei der Init()-Funktion die zeilen mit "rect.h" und "rect.w" ausgeslasht, jetzt gibt es keinen error mehr,
aber die türme werden trotzdem nicht dargestellt.

weis jemand vllt, wie man mit der SDL die mausposition herausbekommt?
ich glaube nähmlich, dass es an der Methode liegt,
mit der ich versuche, die koordinaten der maus zu bekommen,
dass es nicht klappt, da sie ser wahrscheinlich falsch ist.



Zitat

10: m_Rect.w = m_pSpriteTower->GetRect().w;
11: m_Rect.h = m_pSpriteTower->GetRect().h;
"Dumm ist, wer dummes tut."

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

03.10.2010, 17:38

C-/C++-Quelltext

1
2
int x, y;
SDL_GetMouseState(&x, &y);

Doku. dazu.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

6

03.10.2010, 18:29

danke,

alles klappt bestens! Nur die sprites werden immer noch nicht gezeichnet...


MfG RmbRT
"Dumm ist, wer dummes tut."

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

03.10.2010, 18:40

danke,

alles klappt bestens! Nur die sprites werden immer noch nicht gezeichnet...


MfG RmbRT

Also wird nun statt bis 0, bis 3 in die Logfile eingetragen?
Und hast du rect.w und rect.h reaktiviert?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

8

03.10.2010, 21:22

Gelöst

alles ok,

ich hatte den Fehler begangen, aus CGame ein Singleton zu machen, und bei dem "turm-Bau" die get() funktion benutzt,

anstatt "CGame::" zu benutzen.

Vielen Dank, Architekt!

MfG RmbRT
"Dumm ist, wer dummes tut."

Werbeanzeige