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

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

1

08.07.2009, 14:02

Animations problem

Hallo,

ja man glaubt es kaum aber ich habe bisher irgendwie noch keine Animationen verwendet.

Jetzt hab ich mir mit hilfe des Codes aus dem Buch ein Programm geschrieben mit dem ich mir Animationen ansehen kann und sie nicht immer gleich ins Hauptspiel einbinden zu müssen.

Allerdings zeigt er immer nur den ersten Frame. Sobald der zweite oder dritte an der Reihe ist bleibt der Bildschirm Weiß. Fängt es wieder von vorne an zeigt er wieder nur den ersten.

Hier nochmal der Code:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void CSprite::Load (const string sFilename,int NumFrames,int FrameWidth , int FrameHeight)
{

    Load (sFilename);

    m_NumFrames =NumFrames;
    m_FrameWidth = FrameWidth;
    m_FrameHeight = FrameHeight;
    m_FrameRect.w = FrameWidth;
    m_FrameRect.h  = FrameHeight;
    m_NumFramesX = m_pImage->w /m_FrameWidth;

}





C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CSprite::Render(float fFrameNumber)
{

int Spalte = static_cast<int> (fFrameNumber)%m_NumFramesX;

int Zeile= static_cast<int> (fFrameNumber)%m_NumFramesX;

m_FrameRect.x = Spalte * m_FrameWidth;

m_FrameRect.y =Zeile *m_FrameHeight;

SDL_BlitSurface (m_pImage,&m_FrameRect,m_pScreen,&m_Rect);

}







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
void CGame::GameRun()
{


while(m_bGameRun) 
{



g_pFramework->Clear ();
g_pFramework->Update ();


m_pBackground->Render ();

timer +=g_pTimer->GetElapsed ();

if (timer >= 1.0)
{
frame +=1;


if(frame > 2)
frame=0;

timer =0.0;
}

cout<<frame<<endl;


m_pAni->Render(2);

g_pFramework->Flip ();
}

}

physX

Treue Seele

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

2

08.07.2009, 15:21

hallo,

bei der Bestimmung der Zeile und Spalte ist ein Fehler drin...

C-/C++-Quelltext

1
int Zeile= static_cast<int> (fFrameNumber)%m_NumFramesX;


das muesste eigentlich so lauten:

C-/C++-Quelltext

1
int Zeile= static_cast<int> (fFrameNumber) / m_NumFramesX;


eventuell noch +1 je nachdem von wo der index losläuft.
den rest des codes hab ich mir noch nicht angeschaut.

in der main sollte denke ich auch

C-/C++-Quelltext

1
m_Ani->Render(frame)

stehen

die zweite if-abfrage macht auch nur Sinn,wenn die maximale Anzahl deiner Frames 2 ist, aber davon gehe ich mal aus. ;)

gruss

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

3

10.07.2009, 12:24

Nein funktioniert auch nicht so ganz. Jetzt zeigt er IMMER nur den ersten Frame. Das +1 ist ja unnötig das ich ja bei 0 anfange zu zählen.

0=1.


Ich versteh das nicht. Es muss doch gehen. Ist doch der gleiche Code wie im Buch.

physX

Treue Seele

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

4

10.07.2009, 13:09

Zitat von »"Errschaffer"«

Nein funktioniert auch nicht so ganz. Jetzt zeigt er IMMER nur den ersten Frame. Das +1 ist ja unnötig das ich ja bei 0 anfange zu zählen.
0=1.


Zitat


Ich versteh das nicht. Es muss doch gehen. Ist doch der gleiche Code wie im Buch.


hmm? hast du mal geprüft wann und ob timer >=1 wird? zählt er frame wirklich hoch. Wo deklarierst du frame? check das mal mit einer einfachen konsolenausgabe oder mit dem debugger.
vor oder nach deiner if-clause:

C-/C++-Quelltext

1
std::cout << "timer:" << timer << "\t frame: " << frame << std::endl;

ansonsten wuerd ich noch bei der kontrolle des maximalframes die Variable verwenden,die du eh zu verfügung hast.
Probier mal

C-/C++-Quelltext

1
2
3
4
5
6
7
if (timer >= 1.0) 
{ 
  frame += 1;
  if(frame > m_pAni->m_NumFrames)  // oder halt eine getNumFrames definieren

    frame=0.0f; 
  timer =0; 
}

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

5

10.07.2009, 15:13

Über die Konsole wird alles korrekt ausgegeben. Ich versteh das nicht :(

physX

Treue Seele

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

6

10.07.2009, 15:44

Zitat von »"Errschaffer"«

Über die Konsole wird alles korrekt ausgegeben. Ich versteh das nicht :(


was genau macht nochmal dieses g_pFramework->Update() ? Hab das Buch grade nicht zur Hand. Ich schau mir das nachher zu Hause nochmal an.
sorry, dass ich dir momentan nicht weiterhelfen kann.
Gruss

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

7

10.07.2009, 15:46

Damit wird der Tastaturstatus und der Timer aktuallisiert.

physX

Treue Seele

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

8

10.07.2009, 16:32

Zitat von »"Errschaffer"«

Damit wird der Tastaturstatus und der Timer aktuallisiert.


hallo, also an dem code find ich ausser den von mir bereits vorher schon erwähnten fehler jetzt nichts mehr. bist du dir sicher, dass du die richtigen werte für frameswidth, frameheight und framenumbers eintraegst?

kannst du mal die bilddatei selbst posten oder einen link schicken, dann probier ich das mal bei mir aus.

vielleicht überseh ich jetzt auch einfach was...ka

gruss

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

9

11.07.2009, 16:41

Hier ich hab dir mal das ganze Projekt hochgeladen.

http://errschaffer.bplaced.net/Download/AnimationsTool.rar

physX

Treue Seele

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

10

12.07.2009, 09:43

Zitat von »"Errschaffer"«

Hier ich hab dir mal das ganze Projekt hochgeladen.

http://errschaffer.bplaced.net/Download/AnimationsTool.rar


hallo, in deinem source ist immernoch die berechnung der zeile falsch

Zitat


void CSprite::Render(float fFrameNumber)
{
int Spalte = static_cast<int> (fFrameNumber)%m_NumFramesX;
int Zeile= static_cast<int> (fFrameNumber) / m_NumFramesX; // <- hier muss geteilt werden
m_FrameRect.x = Spalte * m_FrameWidth;
m_FrameRect.y =Zeile *m_FrameHeight;
SDL_BlitSurface (m_pImage,&m_FrameRect,m_pScreen,&m_Rect);


dein bild test.png ist bei mir nur eine grosse weisse Fläche.
das zweite bild anim.bmp sollte dann eigentlich funtionieren. Als Anzahl der Frames musst du hier dann aber 3 angeben.

so sollte es dann eigentlich auch funktionieren.
sobald ich nachher zeit habe versuche ich es mal bei mir zu compilieren. muss aber erst die sdl wieder neu bei mir installieren.
gruss

Werbeanzeige