JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2ab40e6f8d96bc496a51b5c196d8a32cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Logikfehler, find ihn einfach nicht
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 29.09.2003, 18:07    Titel: Logikfehler, find ihn einfach nicht Antworten mit Zitat

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 Sad

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 29.09.2003, 18:09    Titel: Antworten mit Zitat

Code:

m_lpSprite->Begin();

m_lpSprite->End();


und sollte

Code:

CMess::Draw()


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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 29.09.2003, 18:11    Titel: Antworten mit Zitat

Jaja, die Drawfunktion wird aufgerufen, das ist es ja eben. aber wo muss
m_lpSprite->Begin() und m_lpSprite->End() hin??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 29.09.2003, 18:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 29.09.2003, 18:27    Titel: Antworten mit Zitat

Es geht immer noch nicht Sad Ich versteh das nich....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christoph
Mini JLI'ler



Anmeldedatum: 24.08.2003
Beiträge: 17

Medaillen: Keine

BeitragVerfasst am: 29.09.2003, 18:32    Titel: Antworten mit Zitat

braucht man beim Sprite-Zeiger überhaupt Begin und End? Ich denke, das braucht man nur beim D3D-Device!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 29.09.2003, 18:33    Titel: Antworten mit Zitat

Normalerweise sollte es auch ohne gehen. Aber bei mir geht's mit beiden nicht Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christoph
Mini JLI'ler



Anmeldedatum: 24.08.2003
Beiträge: 17

Medaillen: Keine

BeitragVerfasst am: 29.09.2003, 18:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 29.09.2003, 18:41    Titel: Antworten mit Zitat

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 Shocked Shocked

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 29.09.2003, 18:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 30.09.2003, 10:14    Titel: Antworten mit Zitat

Ich hab das jetzt so gemacht. Jetzt werden die Sprites auch angezeigt, nur irgendwie nich animiert Sad

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
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 30.09.2003, 11:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 30.09.2003, 12:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 01.10.2003, 14:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 01.10.2003, 17:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum