JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Problem mit Move Sprite und DX 9c
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Andy-Mad
Mini JLI'ler


Alter: 43
Anmeldedatum: 18.09.2006
Beiträge: 34

Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 15:31    Titel: Problem mit Move Sprite und DX 9c Antworten mit Zitat

Hallo vieleicht könnt ihr mir helfen
also ich benutze VC 2005 und DXSDK 9c nur funktionieren die Beispiele aus dem Buch ja nicht mehr also momentan arbeite ich an der Spriteclass

es funktioniert nun das mit Draw Text und das Sprite zeichnen aber die Move funktion bekomme ich nicht hin kann mir jemand von euch helfen

Danke
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: 18.09.2006, 15:39    Titel: Antworten mit Zitat

Zeig doch bitte zuerst mal wie du es aktuell probierst Smile
_________________
"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
Andy-Mad
Mini JLI'ler


Alter: 43
Anmeldedatum: 18.09.2006
Beiträge: 34

Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 15:46    Titel: Antworten mit Zitat

Code:

void CSprite::Move(DIRECTION dir)
{
    // Bei der Bewegung werden die Bildschirmbegrenzungen beachtet
    switch(dir)
    {
        case LEFT:
                if(m_vPosition.x > 0)
                {
                   m_vPosition.x -= m_StepX;
                }
        break;

        case RIGHT:
                if(m_vPosition.x < SCR_WIDTH - m_Width)
                {
                    m_vPosition.x += m_StepX;
                }
        break;

        case UP:
                if(m_vPosition.y > 0)
                {
                    m_vPosition.y -= m_StepY;
                }
        break;

        case DOWN:
                if(m_vPosition.y < SCR_HEIGHT - m_Height)
                {
                    m_vPosition.y += m_StepY;
                }
        break;
    }
}

das ist die Move Funktion

Code:

void CSprite::Draw(void)
{
         // Zeichnen des Sprites
         D3DXVECTOR3 vCenter(128.0f, 0.0f, 128.0f);


            // Position des Sprites
            D3DXVECTOR3 m_vPosition(228.0f, 0.0f, 128.0f);

         // Farben der Textur sollen nicht verändert werden
            D3DCOLOR ModulateColor = 0xFFFFFFFF;

            D3DXMATRIXA16 matCombo, matRot, matScale;
         
            D3DXMatrixRotationY(&matRot,0.0f);
            D3DXMatrixScaling(&matScale, 1.0f, 1.0f, 1.0f);   
            D3DXMatrixMultiply(&matCombo,&matRot, &matScale);
         
         
            m_lpSprite->Begin(D3DXSPRITE_DONOTSAVESTATE | D3DXSPRITE_ALPHABLEND);
                   
            m_lpSprite->SetTransform(&matCombo);
                   
            // Sprite zeichnen
            m_lpSprite->Draw(m_lpTexture,
                                   NULL,       
                                   &vCenter,
                                   &m_vPosition,
                                   ModulateColor);
         m_lpSprite->End();
}

das ist die abgeänderte Draw Funktion da man ja jetzt Vector3 benutzen muss und nicht mehr Vector2 wie im Buch beschrieben ich weis jetzt nur noch nicht wie ich dies anpassen kann
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: 18.09.2006, 15:59    Titel: Antworten mit Zitat

Wenn ich das jetzt nicht total falsch sehe, dann definierst du die Position jedes Mal in der CSprite::Draw()-Methode auf einen festen Wert:
Code:
// Position des Sprites
D3DXVECTOR3 m_vPosition(228.0f, 0.0f, 128.0f);


Die Werte, die du allerdings in der CSprite::Move()-Methode veränderst, haben so keinen Einfluss auf das gerenderte Ergebnis.
Ich nehme an, du hast den Positionsvector als Klassenmember definiert.
Dann lass jetzt einfach diese Neudefinition(ich verstehe gar nicht, wieso der Compiler da nicht meckert) in der Draw()-Methode weg, sodass auch die veränderten Werte des Vectors verwendet werden.
_________________
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
City Hunter
Super JLI'ler


Alter: 39
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 16:16    Titel: Antworten mit Zitat

Ich will ja nicht sagen, ist aber VECOTR3 nicht fpr 3D Games mit x,y,z????


Ich würde Chris SDK Installieren was er auf der CD raufgepackt hat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
Fallen
JLI MVP
JLI MVP


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

BeitragVerfasst am: 18.09.2006, 16:26    Titel: Antworten mit Zitat

City Hunter hat Folgendes geschrieben:
Ich will ja nicht sagen, ist aber VECOTR3 nicht fpr 3D Games mit x,y,z????


Ich würde Chris SDK Installieren was er auf der CD raufgepackt hat.


Lasse z einfach auf 0.0f, niemand sagt das du es nutzen sollst, den z Wert kann man allerdings prima nutzen um den ZBuffer vollzuschreiben.
_________________
"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
Andy-Mad
Mini JLI'ler


Alter: 43
Anmeldedatum: 18.09.2006
Beiträge: 34

Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 18:22    Titel: Antworten mit Zitat

Ok aber dass Problem ist halt dass sich das Sprite nicht bewegt und da ich halt mit dem neuen SDK arbeite wollte ich es auch belassen vorallem weil das SDK auf der CD mit 2005 irgendwie nicht geht
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: 18.09.2006, 18:23    Titel: Antworten mit Zitat

The Lord of Programming sagte dir doch bereits was du falsch machst. Das SDK ist bei deinem Problem egal.
_________________
"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
Andy-Mad
Mini JLI'ler


Alter: 43
Anmeldedatum: 18.09.2006
Beiträge: 34

Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 18:36    Titel: Antworten mit Zitat

sorry das hab ich übersehen
wenn ich es woanders definiere wird das sprite nicht mehr gezeichnet
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: 18.09.2006, 18:39    Titel: Antworten mit Zitat

Du brauchst es überhaupt nicht weiter zu definieren/deklarieren ansonsten würde CSprite::Move(DIRECTION dir) schon so einige Fehler ausspucken.

Du musst vom CSprite nur die Membervariable m_vPosition anständige Werte zuweisen, entweder im CTor (Konstruktor) oder per SetPosition wenn es sowas gibt.
_________________
"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
Andy-Mad
Mini JLI'ler


Alter: 43
Anmeldedatum: 18.09.2006
Beiträge: 34

Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 18:45    Titel: Antworten mit Zitat

Ok hier mal die Klasse
CPP:
#include <d3d9.h>
#include <d3dx9.h>
#include "global.h"


// Definition der Bewegungsrichtungen
enum DIRECTION { LEFT, RIGHT, UP, DOWN };

// Definition der Spriteklasse
class CSprite
{
    public:
       CSprite();
       virtual ~CSprite();

       // Erzeugung des Sprites
       void Create(LPDIRECT3DDEVICE9 lpDevice,
                   LPCWSTR lpFileName);
       
       // Sprite zeichnen
       void Draw(void);
       
       // absolute Position festlegen
       void SetPosition(float x,float y,float z);

       
       // Schrittweite festlegen
       void SetStep(float StepX,float StepY);

       // relative Bewegung um StepX,StepY Pixel
       void Move(DIRECTION dir);
       


       // Zeiger auf das Direct3D Device
       LPDIRECT3DDEVICE9 m_lpDevice;
       
       // Zeiger auf das ID3DXSprite-Objekt
       LPD3DXSPRITE m_lpSprite;
   
       // Zeiger auf die Textur
       LPDIRECT3DTEXTURE9 m_lpTexture;
      
    
       // aktuelle Position
       D3DXVECTOR3 m_vPosition;
      
     
       // Schrittweite
       float m_StepX;
       float m_StepY;

       // Breite und Höhe
       int   m_Width;
       int   m_Height;
};


und hier die Funktionen

CPP:
#include "Sprite.h"

// Konstruktor - Initialisierungen
CSprite::CSprite(void)
{
    m_lpSprite  = NULL;
    m_lpTexture = NULL;
}

// Destructor - freigeben der Objekte
CSprite::~CSprite(void)
{
    if(NULL != m_lpSprite)
    {
        m_lpSprite->Release();
        m_lpSprite = NULL;
    }

    if(NULL != m_lpTexture)
    {
        m_lpTexture->Release();
        m_lpTexture = NULL;
    }
}

// Position setzen
void CSprite::SetPosition(float x,float y,float z)
{   

   m_vPosition.x = 128.0f;
                m_vPosition.y = 0.0f;
   m_vPosition.z = 128.0f;
   
}


// Schrittweite bestimmen
void CSprite::SetStep(float StepX,float StepY)
{
    m_StepX = StepX;
    m_StepY = StepY;
}

// Sprite kreiern
void CSprite::Create(LPDIRECT3DDEVICE9 lpDevice, LPCWSTR lpFileName)
{
    m_lpDevice  = lpDevice;

    // Sprite anlegen
    D3DXCreateSprite(m_lpDevice,&m_lpSprite);

    // Inforationen über die Textur holen
    D3DXIMAGE_INFO ImgInfo;
    D3DXGetImageInfoFromFileW(lpFileName,&ImgInfo);

    // Textur anlegen
    D3DXCreateTextureFromFileExW(m_lpDevice,
                                lpFileName,
                                ImgInfo.Width,
                                ImgInfo.Height,
                                1,0,
                                D3DFMT_UNKNOWN,
                                D3DPOOL_MANAGED,
                                D3DX_FILTER_NONE,
                                D3DX_FILTER_NONE,
                                0,0,0,
                                &m_lpTexture);

    // Breite und Höhe speichern
    m_Width  = ImgInfo.Width;
    m_Height = ImgInfo.Height;


    // Schrittweite des Sprites bei Bewegung
    m_StepX  = 10.0f;
    m_StepY  = 10.0f;
}

// Bewegung des Sprite
void CSprite::Move(DIRECTION dir)
{

    // Bei der Bewegung werden die Bildschirmbegrenzungen beachtet
    switch(dir)
    {
        case LEFT:
                if(m_vPosition.x > 0)
                {
                   m_vPosition.x -= m_StepX;
                }
        break;

        case RIGHT:
                if(m_vPosition.x < SCR_WIDTH - m_Width)
                {
                    m_vPosition.x += m_StepX;
                }
        break;

        case UP:
                if(m_vPosition.y > 0)
                {
                    m_vPosition.y -= m_StepY;
                }
        break;

        case DOWN:
                if(m_vPosition.y < SCR_HEIGHT - m_Height)
                {
                    m_vPosition.y += m_StepY;
                }
        break;
    }
}

// Sprite zeichnen
void CSprite::Draw(void)
{
         // Zeichnen des Sprites
         D3DXVECTOR3 vCenter(128.0f, 0.0f, 128.0f);


            // Position des Sprites
           

            // Farben der Textur sollen nicht verändert werden
            D3DCOLOR ModulateColor = 0xFFFFFFFF;

            D3DXMATRIXA16 matCombo, matRot, matScale;
         
            D3DXMatrixRotationY(&matRot,0.0f);
            D3DXMatrixScaling(&matScale, 1.0f, 1.0f, 1.0f);   
            D3DXMatrixMultiply(&matCombo,&matRot, &matScale);
         
         
            m_lpSprite->Begin(D3DXSPRITE_DONOTSAVESTATE | D3DXSPRITE_ALPHABLEND);
                   
            m_lpSprite->SetTransform(&matCombo);
                   
            // Sprite zeichnen
            m_lpSprite->Draw(m_lpTexture,
                                   NULL,       
                                   &vCenter,
                                   &m_vPosition,
                                   ModulateColor);
         m_lpSprite->End();
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 19:11    Titel: Antworten mit Zitat

Erstmal vorab, benutze am Besten c++-Tags:
Code:
[cpp] dein Quellcode [/cpp]


Andy-Mad hat Folgendes geschrieben:
CPP:
// Position setzen
void CSprite::SetPosition(float x,float y,float z)
{   

   m_vPosition.x = 128.0f;
                m_vPosition.y = 0.0f;
   m_vPosition.z = 128.0f;
   
}
naja, das hat wenig Sinn, weil du der Funktion ja die Werte übergeben willst, die die Position beschreiben. Eher würde sowas gehen:
CPP:
// Position setzen
void CSprite::SetPosition(float x,float y,float z)
{   

   m_vPosition.x = x;
        m_vPosition.y = y;
   m_vPosition.z = z;
   
}
Dann darfst du aber net vergessen, die FUnktion am Anfang nach der Initialisierung des Sprites mit (128.0f, 0.0f, 128.0f) aufzurufen.


Dann noch zur Draw-Methode:
Andy-Mad hat Folgendes geschrieben:
CPP:
// Sprite zeichnen
void CSprite::Draw(void)
{
         // Zeichnen des Sprites
         D3DXVECTOR3 vCenter(128.0f, 0.0f, 128.0f);


            // Position des Sprites
           

            // Farben der Textur sollen nicht verändert werden
            D3DCOLOR ModulateColor = 0xFFFFFFFF;

            D3DXMATRIXA16 matCombo, matRot, matScale;
         
            D3DXMatrixRotationY(&matRot,0.0f);
            D3DXMatrixScaling(&matScale, 1.0f, 1.0f, 1.0f);   
            D3DXMatrixMultiply(&matCombo,&matRot, &matScale);
// (...)

Ich verstehe net, was vCenter hier zu bedeuten hat. Überdenke das nochmal, wieso du das genau auf (128.0f, 0.0f, 128.0f) setzt.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
City Hunter
Super JLI'ler


Alter: 39
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 19:20    Titel: Antworten mit Zitat

Andy-Mad hat Folgendes geschrieben:
Ok aber dass Problem ist halt dass sich das Sprite nicht bewegt und da ich halt mit dem neuen SDK arbeite wollte ich es auch belassen vorallem weil das SDK auf der CD mit 2005 irgendwie nicht geht


Was sag er denn an wende Chris SDK nimmst?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
Andy-Mad
Mini JLI'ler


Alter: 43
Anmeldedatum: 18.09.2006
Beiträge: 34

Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 19:24    Titel: Antworten mit Zitat

Da bringt er lauter Compilerfehler

ach es funktioniert nun mit der SetPosition nach dem Sprite aufruf
danke
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 18.09.2006, 19:31    Titel: Antworten mit Zitat

Hallo,

hier:

http://www.jliforum.de/downloads/summer_1922.rar

solltest du die angepassten Beispiele finden.

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik 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