You are not logged in.

  • Login

1

Sunday, December 5th 2010, 1:04pm

Sprites laden und anzeigen

Wie manche sicher wissen, habe ich ein Schiffeversenken-Spiel erstellt.
Nun habe ich aber vor, ein neues Game zu machen - Mit Sprites.
Ja, nun fehlen mir DENKE ich die Befehle und so weiter.
In meinem Buch steht da was von:

Sprite.hpp

C/C++ Quellcode

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 SPRITE_HPP //mal ein Kommentar von mir, was macht #ifndef eigentlich?
#define SPRITE_HPP
 
#include "Framework.hpp"
 
class CSprite
{
	public:
		CSprite ();
		~CSprite ();
 
		void Load        (const string sFilename);
		void Load        (const string sFilename, int NumFrames,
			int FrameWidth, int FrameHeight);
		void SetColorKey (int R, int G, int B);
		void SetPos      (float fXPos, float fYPos);
		void Render      ();
		void Render      (float fFrameNumber);
		SDL_Rect GetRect () {return m_Rect;}
 
	private:
		SDL_Surface *m_pScreen; // Zeiger auf den Screen des Frameworks
		SDL_Surface *m_pImage;  // Das eigentliche Bild des Sprites
		SDL_Rect m_Rect;        // Rect des Sprites
		SDL_Rect m_FrameRect;   // Ausschnitt für Animationsphase
		int m_NumFrames;        // Anzahl der Animationsphasen
		int m_FrameWidth;       // Breite einer Animationsphase
		int m_FrameHeight;      // Höhe einer Animationsphase
		int m_NumFramesX;       // Wie viele Anim-Phasen in X-Richtung?
 
};
 
#endif


Sprite.cpp

C/C++ Quellcode

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
#include "Sprite.hpp"
// Konstruktor
//
// Aufgabe: Zeiger auf Screen holen
//
CSprite::CSprite ()
{
	// Zeiger auf Screen holen
	m_pScreen = g_pFramework->GetScreen ();
 
} // Konstruktor
 
// Destruktor
//
// Aufgabe: Surface des Sprites freigeben
//
CSprite::~CSprite ()
{
	// Surface freigeben
	SDL_FreeSurface (m_pImage);
 
} // Destruktor
 
// Load
//
// Aufgabe: Einfaches, nicht animiertes Sprite laden
//
void CSprite::Load (const string sFilename)
{
	// Bitmap laden
	m_pImage = SDL_LoadBMP (sFilename.c_str () );
 
	// Prüfen, ob alles glatt ging
	if (m_pImage == NULL)
	{
		cout << "Fehler beim Laden von: " << sFilename.c_str ();
		cout << endl;
		cout << "Fehlermeldung: " << SDL_GetError () << endl;
 
		// Framework herunterfahren
		g_pFramework->Quit ();
 
		// Gesamtes Spiel beenden
		exit (1);
	}
 
	// Rect initialisieren
	m_Rect.x = 0;
	m_Rect.y = 0;
	m_Rect.w = m_pImage->w;
	m_Rect.h = m_pImage->h;
 
} // Load
 
// Load
//
// Aufgabe: Animiertes Sprite laden
//
void CSprite::Load (const string sFilename, int NumFrames,
					int FrameWidth, int FrameHeight)
{
	// Bitmap laden
	Load (sFilename);
 
	// Rect für Animationsphase initialisieren
	m_NumFrames   = NumFrames;
	m_FrameWidth  = FrameWidth;
	m_FrameHeight = FrameHeight;
	m_FrameRect.w = FrameWidth;
	m_FrameRect.h = FrameHeight;
	m_NumFramesX  = m_pImage->w / m_FrameWidth;
 
} // Load
 
// SetColorKey
//
// Aufgabe: Transparente Farbe festlegen
//
void CSprite::SetColorKey (int R, int G, int B)
{
	// Colorkey einstellen
	SDL_SetColorKey (m_pImage, SDL_SRCCOLORKEY,
		SDL_MapRGB (m_pImage->format, R, G, B) );
 
} // SetColorKey
 
// SetPos
//
// Aufgabe: Position des Sprites festlegen
//
void CSprite::SetPos (float fXPos, float fYPos)
{
	// Rect updaten
	m_Rect.x = static_cast<int>(fXPos);
	m_Rect.y = static_cast<int>(fYPos);
 
} // SetPos
 
// Render
//
// Aufgabe: Sprite rendern (ohne Animation)
//
void CSprite::Render ()
{
	// Sprite rendern
	SDL_BlitSurface (m_pImage, NULL, m_pScreen, &m_Rect);
 
} // Render
 
// Render
//
// Aufgabe: Ausschnitt des Sprites rendern (Animationsphase)
//
void CSprite::Render (float fFrameNumber)
{
	// Ausschnitt der aktuellen Animationsphase berechnen
	//
 
	// Spalte berechnen
	int Column = static_cast<int>(fFrameNumber)%m_NumFramesX;
 
	// Zeile berechnen
	int Row = static_cast<int>(fFrameNumber)/m_NumFramesX;
 
	// Rect berechnen
	m_FrameRect.x = Column * m_FrameWidth;
	m_FrameRect.y = Row * m_FrameHeight;
 
	// Ausschnitt rendern
	SDL_BlitSurface (m_pImage, &m_FrameRect, m_pScreen, &m_Rect);
 
} // Render


Sagt mir mal bitte, wo da der Sprite geladen wird? Sicher, ich sehe auch den Abschnitt wo es geladen wird, aber wo ist da bitte der Name des *.bmp Files?
ich sehe auch das dieser in sFilename zu sein scheint.
Könnte mir vielleicht wer ein "besseres" Beispiel geben um einen Sprite einer Klasse zuzuordnen, zu laden und an zu zeigen?

PS: Ja, es gibt noch Framework.hpp und Framework.cpp aber dort wird der Name auch nicht bestimmt.

2

Sunday, December 5th 2010, 3:36pm

In welcher deiner Dateien steht denn

C/C++ Quellcode

1
2
int main () // oder
int main (void) // oder ähnliches

?(

MfG bcc-fan

3

Sunday, December 5th 2010, 4:13pm

In der main.cpp
Soll ich mal alle Codes posten?
Ich fand es bisschen lang, deshalb hab ich nur die Sprite.hpp und die Sprite.cpp vom BUCH gepostet. Das war nur ein Beispiel. ich möchte nicht mit dem Game anfangen, ehe ich nicht genau weiß wie ich einen Sprite laden kann....

4

Sunday, December 5th 2010, 6:48pm

Du hast da nur ein Klasse für Sprites erstellt...
Durch abtippen lernst du rein gar nichts, selbst denken und schreiben, dann verstehst du auch was das alles soll
Du könntest damit ein Sprite erstellen, und dann mit


sprite.Load("einbild.bmp");

ein Bild laden. (wobei "sprite" hier ein element der Klasse CSprite sein muss)


Wobei ich dir rate da SDL_Image zu verwenden, dann kannst du statt SDL_LoadBMP -> IMG_Load verwenden, was auch jpg, png, tiff etc laden kann

This post has been edited 1 times, last edit by "pocky" (Dec 5th 2010, 6:53pm)


5

Sunday, December 5th 2010, 7:40pm

Man versteht zwar immer noch nicht das es nur ein Beispiel nicht bezogen auf mein Game ist, aber dein Post bringt mich eine Ecke weiter.
Gibt es noch einfachere Wege?

6

Monday, December 6th 2010, 6:30pm

Einfachere Wege für was?

7

Monday, December 6th 2010, 9:43pm

Um den Sprite zu laden, zuzuordnen und anzeigen zu lassen.

8

Tuesday, December 7th 2010, 5:14pm

Selbst ne einfachere Klasse schreiben wäre wohl das einfachste

9

Tuesday, December 7th 2010, 7:40pm

8| Meinte ich nicht, aber danke

10

Tuesday, December 7th 2010, 9:02pm

Naja, was ist denn einfach als

spriteclass sprite;

sprite.load("blub.png");
sprite.pos(100,100);
sprite.draw(screen);

einfacher gehtz ja wohl net

das zeug was des macht, muss man ja nur einmal schreiben

11

Tuesday, December 7th 2010, 9:06pm

sprite.draw kannte ich nicht.
Da gehts schon los ^^

12

Wednesday, December 8th 2010, 7:48am

das war auch nur ne pseudeklasse, die nichts mit deiner zu tun hat, bei deiner da oben geht das so:

CSprite sprite;
sprite.Load("bild.bmp");
sprite.SetPos(13, 37);
sprite.Render();


also eig genauso, nur halt andere namen
also doch sehr bequem
man kann sich nur eines sparen, und zwar wenn man das Load gleich mit in den Konstruktor nimmt, dann spart man sich die sprite.Load Zeile, dafür ist die Initialisierung des Klassenvariable etwas länger

Similar threads

Social bookmarks