Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 29.09.2003, 18:07 Titel: Logikfehler, find ihn einfach nicht |
|
|
Hi,
ich hab da nen Quellcode der syntaktisch einwandfrei funktioniert, aber leider wird das Objekt, das angezeigt werden soll zwar erzeugt, aber nicht angezeigt und ich finde einfach den Fehler nicht. Da jetzt solche Fragen ohne Code nutzlos sind werde ich ihn hier mal posten.
ich weiß das das nicht so beliebt ist *bittenichhauen* aber ich find den Fehler einfach nicht
Die Variablen sollten eigentlich selbsterklärend sein.
Code: | void CMess::Draw()
{
RECT SpriteRect;
SpriteRect.left = m_CurrentFrameX * m_usWidth;
SpriteRect.right = SpriteRect.left + m_usWidth;
SpriteRect.top = m_CurrentFrameY * m_usHeight;
SpriteRect.bottom = SpriteRect.top + m_usHeight;
D3DXVECTOR2 m_vPosition;
m_vPosition.x = m_fX;
m_vPosition.y = m_fY;
m_lpSprite->Draw(m_lpTexture,
&SpriteRect,
0,
&m_vRotationCenter,
0,
&m_vPosition,
0xFFFFFFFF);
}
void CMess::Idle()
{
m_delay++;
if(m_delay >= 10)
{
m_CurrentFrameX++;
if(m_CurrentFrameX == m_FramesX)
{
m_CurrentFrameX = 0;
m_CurrentFrameY++;
if(m_CurrentFrameY == m_FramesY)
{
m_CurrentFrameY = 0;
}
}
m_delay = 0;
}
m_fX -= 10.0f;
if(m_fY > 664)
{
m_bDestroy = true;
}
} |
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 29.09.2003, 18:09 Titel: |
|
|
Code: |
m_lpSprite->Begin();
m_lpSprite->End();
|
und sollte
nicht irgendwo aufgerufen werden ? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 29.09.2003, 18:11 Titel: |
|
|
Jaja, die Drawfunktion wird aufgerufen, das ist es ja eben. aber wo muss
m_lpSprite->Begin() und m_lpSprite->End() hin?? |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 29.09.2003, 18:23 Titel: |
|
|
Code: |
void CMess::Draw()
{
RECT SpriteRect;
SpriteRect.left = m_CurrentFrameX * m_usWidth;
SpriteRect.right = SpriteRect.left + m_usWidth;
SpriteRect.top = m_CurrentFrameY * m_usHeight;
SpriteRect.bottom = SpriteRect.top + m_usHeight;
D3DXVECTOR2 m_vPosition;
m_vPosition.x = m_fX;
m_vPosition.y = m_fY;
m_lpSprite->Begin();
m_lpSprite->Draw(m_lpTexture,
&SpriteRect,
0,
&m_vRotationCenter,
0,
&m_vPosition,
0xFFFFFFFF);
m_lpSprite->End();
}
|
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 29.09.2003, 18:27 Titel: |
|
|
Es geht immer noch nicht Ich versteh das nich.... |
|
Nach oben |
|
|
Christoph Mini JLI'ler
Anmeldedatum: 24.08.2003 Beiträge: 17
Medaillen: Keine
|
Verfasst am: 29.09.2003, 18:32 Titel: |
|
|
braucht man beim Sprite-Zeiger überhaupt Begin und End? Ich denke, das braucht man nur beim D3D-Device! |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 29.09.2003, 18:33 Titel: |
|
|
Normalerweise sollte es auch ohne gehen. Aber bei mir geht's mit beiden nicht |
|
Nach oben |
|
|
Christoph Mini JLI'ler
Anmeldedatum: 24.08.2003 Beiträge: 17
Medaillen: Keine
|
Verfasst am: 29.09.2003, 18:37 Titel: |
|
|
prüfe doch mal, ob deine Vaiablen, die die Höhe und Position des Sprites angeben richtig gefüllt sind. Ich dsenke, dass da der Fehler liegt |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 29.09.2003, 18:41 Titel: |
|
|
hmm es ist schon was mit den Variablen, und zwar mit denen die das SpriteRect berechnen sollen. Wenn ich das nämlich weglasse dann werden die Objekte nämlich dargestellt, aber halt nicht animiert.
[EDIT] Ich hab das nochmal in eine Funktion, es ist jetzt also eindeutig das da ein Fehler drin sein muss, bloß wo
Code: | void CMess::Draw()
{
RECT SpriteRect;
// dieses Rechteck speichert die Position
// des Frames in der Oberfläche
SpriteRect.left = m_CurrentFrameX * m_usWidth;
SpriteRect.right = SpriteRect.left + m_usWidth;
SpriteRect.top = m_CurrentFrameY * m_usHeight;
SpriteRect.bottom = SpriteRect.top + m_usHeight;
D3DXVECTOR2 m_vPosition;
m_vPosition.x = m_fX;
m_vPosition.y = m_fY;
m_lpSprite->Begin();
m_lpSprite->Draw(m_lpTexture,
&SpriteRect,
0,
&m_vRotationCenter,
0,
&m_vPosition,
0xFFFFFFFF);
m_lpSprite->End();
// delay erhöhen und testen, ob der nächste
// Animationsschritt dargestellt werden soll
m_delay++;
if(m_delay >= 10)
{
// nächstes Frame
m_CurrentFrameX++;
// Wenn wir über die Spaltenbegrenzung überschritten haben
if(m_CurrentFrameX == m_FramesX)
{
// müssen wir in die nächste Zeile in die 1. Spalte springen
m_CurrentFrameX = 0;
m_CurrentFrameY++;
// Wenn wir auch die Zeilenbegrenzung überschitten haben
if(m_CurrentFrameY == m_FramesY)
{
// müssen wir wieder beim ersten Frame anfangen
m_CurrentFrameY = 0;
}
}
// delay auf 0 setzen, damit wieder verzögert werden kann
m_delay = 0;
}
} |
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 29.09.2003, 18:54 Titel: |
|
|
Code: |
rcRect.left = frame%maxBilder*Breite;
rcRect.top = frame/maxBilder*Breite;
rcRect.right = frame%maxBilder*Breite+Breite;
rcRect.bottom = frame/maxBilder*Hoehe+Hoehe;
|
So hab ich das mal gehabt. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 30.09.2003, 10:14 Titel: |
|
|
Ich hab das jetzt so gemacht. Jetzt werden die Sprites auch angezeigt, nur irgendwie nich animiert
Code: | void CMess::Draw()
{
RECT rcSource;
rcSource.top = (int)m_fFrame % 5 * m_usWidth;
rcSource.left = (int)m_fFrame / 5 * m_usHeight;
rcSource.right = m_usWidth;
rcSource.bottom = m_usHeight;
D3DXVECTOR2 m_vPosition;
m_vPosition.x = m_fX;
m_vPosition.y = m_fY;
m_lpSprite->Begin();
m_lpSprite->Draw(m_lpTexture,
&rcSource,
0,
&m_vRotationCenter,
0,
&m_vPosition,
0xFFFFFFFF);
m_lpSprite->End();
}
void CMess::Idle()
{
m_fY += 4.0f;
m_fFrame += ( 75.0f / 100.0f ) * 0.4f;
while( (int)m_fFrame > 19 )
{
m_fFrame -= 19.0f;
}
if(m_fY > 664)
{
m_bDestroy = true;
}
} |
|
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 30.09.2003, 11:42 Titel: |
|
|
Vision:
Die erste Idee hab ich auch bei mir umgesetzt. Sie funktioniert. Du hast von
SpriteRect.left = m_CurrentFrameX * m_usWidth;
SpriteRect.right = SpriteRect.left + m_usWidth;
SpriteRect.top = m_CurrentFrameY * m_usHeight;
SpriteRect.bottom = SpriteRect.top + m_usHeight;
In zeile 1 oder 3 mindestens eine Variable fälschlicherweise mit Null initialisiert. Ich habe dieselbe Formel benutzt(vielleicht mit anderen Bezeichnungen) und sie klappt einwandfrei. Zeig vielleicht mal, wie du Höhe und Breite initialisierst und wie du die Framenummer bzw Stellennummer in der Textur definierst. Kommt immer drauf an wie du zählst. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 30.09.2003, 12:45 Titel: |
|
|
Mehr Code kann ich zu dem Sache leider nicht mehr posten. Das Problem muss irgendwo da drin sein.
Code: | void CMess::Initialize()
{
char* pszFileNames[] = {
"Schrottteil1.png",
"Schrottteil2.png",
"Schrottteil3.png",
"Schrottteil4.png"
};
int iRandom = rand() % 4;
D3DXCreateSprite(Direct3D.GetDevice(), &m_lpSprite);
D3DXIMAGE_INFO ImgInfo;
D3DXGetImageInfoFromFile(pszFileNames[iRandom], &ImgInfo);
int m_Width = ImgInfo.Width;
int m_Height = ImgInfo.Height;
D3DXCreateTextureFromFileEx(Direct3D.GetDevice(),
pszFileNames[iRandom],
ImgInfo.Width,
ImgInfo.Height,
1,0,
D3DFMT_UNKNOWN,
D3DPOOL_MANAGED,
D3DX_FILTER_NONE,
D3DX_FILTER_NONE,
D3DCOLOR_XRGB(0,0,0),
0,0,
&m_lpTexture);
m_vRotationCenter = D3DXVECTOR2((float)m_Width/2,(float)m_Height/2);
m_fX = (float)( rand() % 800 );
m_fY = -50.0f;
m_fFrame = (float)( rand() % 20 );
switch( iRandom )
{
case 0:
case 2:
m_usWidth = 50;
m_usHeight = 50;
break;
case 1:
case 3:
m_usWidth = 25;
m_usHeight = 25;
break;
}
} |
|
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 01.10.2003, 14:32 Titel: |
|
|
juhuu, es geht. Die Grafiken werden angezeigt und auch die Animation geht. Jetzt mal ne andere Frage. Woran kann es liegen wenn das Sprite stark flimmert?? Ich hab fps 75. Daran kanns nicht liegen. Die Sprites werden auch jedes Frame gezeichnet. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 01.10.2003, 17:29 Titel: |
|
|
Verwendest du einen Doppelbuffer?
Wenn nicht, ist das normal. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
|