|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 18.09.2006, 15:31 Titel: Problem mit Move Sprite und DX 9c |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 18.09.2006, 15:39 Titel: |
|
|
Zeig doch bitte zuerst mal wie du es aktuell probierst _________________ "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 |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 18.09.2006, 15:46 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 18.09.2006, 15:59 Titel: |
|
|
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 |
|
|
City Hunter Super JLI'ler
Alter: 39 Anmeldedatum: 18.04.2004 Beiträge: 330 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 18.09.2006, 16:16 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 18.09.2006, 16:26 Titel: |
|
|
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 |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 18.09.2006, 18:22 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 18.09.2006, 18:23 Titel: |
|
|
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 |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 18.09.2006, 18:36 Titel: |
|
|
sorry das hab ich übersehen
wenn ich es woanders definiere wird das sprite nicht mehr gezeichnet |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 18.09.2006, 18:39 Titel: |
|
|
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 |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 18.09.2006, 18:45 Titel: |
|
|
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 18.09.2006, 19:11 Titel: |
|
|
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 |
|
|
City Hunter Super JLI'ler
Alter: 39 Anmeldedatum: 18.04.2004 Beiträge: 330 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 18.09.2006, 19:20 Titel: |
|
|
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 |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 18.09.2006, 19:24 Titel: |
|
|
Da bringt er lauter Compilerfehler
ach es funktioniert nun mit der SetPosition nach dem Sprite aufruf
danke |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
|
Nach oben |
|
|
|
|
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
|