|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 09.02.2005, 18:21 Titel: Verzerrung |
|
|
Hallo,
ich zeichne eine Würfelpyramide auf dem Schirm, jedoch verzerrt sich das ganze ganz schön in die Breite.
Ich probier jetzt die ganze Zeit rum, woran das liegen könnte.
Hier ist der Code der aufrufenden Datei.
Wenn jemand sich bereiterklärt, schick ich ihm auch gern das Projekt per Mail.
Soll jetzt kein extremes Codereading werden, aber vielleicht weiß einer von euch auf Anhieb Rat!
CPP: | // Cube.cpp : Definiert den Einstiegspunkt für die Anwendung.
//
#include "stdafx.h"
#include "Cube.h"
#include <d3d9.h>
#include <d3dx9.h>
#include <dxerr9.h>
#include "Box.h"
#define MAX_LOADSTRING 100
// Globale Variablen:
HWND hWnd;
LPDIRECT3D9 lpD3D = NULL;
LPDIRECT3DDEVICE9 lpD3DDevice = NULL;
LPDIRECT3DSURFACE9 lpBackBuffer = NULL;
HINSTANCE hInst; // Aktuelle Instanz
TCHAR szTitle[MAX_LOADSTRING]; // Titelleistentext
TCHAR szWindowClass[MAX_LOADSTRING]; // Klassenname des Hauptfensters
Box* cube;
// Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
BOOL Init(HWND hWnd, BOOL bWindowed);
void CleanUp(void);
void DrawScene(void);
void InitScene();
int i =0;
float angle =0.0f;
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Hier Code einfügen.
MSG msg;
HACCEL hAccelTable;
// Globale Zeichenfolgen initialisieren
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_CUBE, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Anwendungsinitialisierung ausführen:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_CUBE);
if(!Init(hWnd,true))
{
return -1;
}
cube = new Box(lpD3DDevice);
if(!cube->InitVertexBuffer())
{
return -1;
}
InitScene();
// Hauptmeldungsschleife:
while (TRUE)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_QUIT)
break;
}
DrawScene();
}
CleanUp();
return (int) msg.wParam;
}
//
// FUNKTION: MyRegisterClass()
//
// ZWECK: Registriert die Fensterklasse.
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_CUBE);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCTSTR)IDC_CUBE;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//
// FUNKTION: InitInstance(HANDLE, int)
//
// ZWECK: Speichert das Instanzenhandle und erstellt das Hauptfenster.
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNKTION: WndProc(HWND, unsigniert, WORD, LONG)
//
// ZWECK: Verarbeitet Meldungen vom Hauptfenster.
//
// WM_COMMAND - Verarbeiten des Anwendungsmenüs
// WM_PAINT - Zeichnen des Hauptfensters
// WM_DESTROY - Beenden-Meldung anzeigen und zurückgeben
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Menüauswahl bearbeiten:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Fügen Sie hier den Zeichnungscode hinzu...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Meldungshandler für Infofeld.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
BOOL Init(HWND hWnd, BOOL bWindowed)
{
// Direct3D-Objekt erzeugen
lpD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(NULL == lpD3D)
{
// Fehler, D3D-Objekt wurde nicht erzeugt
return FALSE;
}
// Parameter für den Modus festlegen
D3DPRESENT_PARAMETERS PParams;
ZeroMemory(&PParams,sizeof(PParams));
PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PParams.hDeviceWindow = hWnd;
PParams.Windowed = bWindowed;
PParams.BackBufferWidth = 800;
PParams.BackBufferHeight = 600;
PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
PParams.EnableAutoDepthStencil = TRUE;
PParams.AutoDepthStencilFormat = D3DFMT_D16;
HRESULT hr;
// Direct3D-Gerät anlegen
if(FAILED(hr = lpD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&PParams,
&lpD3DDevice)))
{
// Fehler, Gerät kann nicht angelegt werden
const char* Err = DXGetErrorDescription9(hr);
DXTRACE_MSG(Err);
return FALSE;
}
// Zeiger auf dem Hintergrundpuffer holen
lpD3DDevice->GetBackBuffer(0,0,
D3DBACKBUFFER_TYPE_MONO,
&lpBackBuffer);
return TRUE;
}
void CleanUp(void)
{
if(lpD3DDevice!=NULL)
{
lpD3DDevice->Release();
}
if(lpD3D!=NULL)
{
lpD3D->Release();
}
if(cube!=NULL)
{
delete cube;
}
if(lpBackBuffer!=NULL)
{
lpBackBuffer->Release();
}
}
void DrawScene(void)
{
angle+=0.01f;
// Beginn der Szene
lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(255,255,255),1.0f,0);
lpD3DDevice->BeginScene();
D3DXMATRIX WorldMatrix;
D3DXMATRIX TransMatrix;
D3DXMATRIX RotationMatrix;
// die Quelle für den Würfel setzen
lpD3DDevice->SetStreamSource(0,cube->getVertexBuffer(),0,sizeof(CustomVertex));
D3DXMatrixRotationY(&RotationMatrix, angle);
//Würfel
D3DXMatrixTranslation(&TransMatrix,-2.2f,0.0f,0.0f);
D3DXMatrixMultiply(&WorldMatrix,&TransMatrix,&RotationMatrix);
lpD3DDevice->SetTransform(D3DTS_WORLD,&WorldMatrix);
lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,12);
}
void InitScene()
{
lpD3DDevice->SetFVF(D3D_CUSTOMVERTEX);
// Die Kamera wird an der Position (0.0f, 0.0f, -10.0f) aufgestellt
D3DXMATRIX ViewMatrix;
D3DXMatrixLookAtLH(&ViewMatrix,
&D3DXVECTOR3(0.0f, 30.0f,28.0f),
&D3DXVECTOR3(0.0f, 0.0f, 0.0f),
&D3DXVECTOR3(0.0f, 1.0f, 0.0f));
lpD3DDevice->SetTransform(D3DTS_VIEW,&ViewMatrix);
// Sichtkegel definieren
D3DXMATRIX ProjMatrix;
D3DXMatrixPerspectiveFovLH(&ProjMatrix,
D3DX_PI/4,
(float)((float)800 / (float)600),
1.0f,
100.0f );
lpD3DDevice->SetTransform(D3DTS_PROJECTION,&ProjMatrix);
// Beleuchtung abschalten
lpD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
}
|
_________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.02.2005, 18:30 Titel: |
|
|
Ich tippe auf folgende stelle:
CPP: | D3DXMatrixPerspectiveFovLH(&ProjMatrix,
D3DX_PI/4,
(float)((float)800 / (float)600),
1.0f,
100.0f ); |
Kenn leider den Befehl nicht auswendig (also parameter,...). _________________ "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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 09.02.2005, 18:34 Titel: |
|
|
OT:
Wie schnell in diesem Forum gepostet wird ist wirklich der Hammer.
Man könnte glatt denken manche Leute haben nichts besseres zu tun als alle 5 min nach neuen Posts zu schauen. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 09.02.2005, 18:47 Titel: |
|
|
Sorry, abe ich steh aufm Schlauch. Kann mir einer die Stelle im Code zeigen? _________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 09.02.2005, 18:48 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: | Kenn leider den Befehl nicht auswendig (also parameter,...). |
Parameter sind richtig. Aber seine Fenstergröße ist undefiniert aber er will ne Auflösung von 800x600 das knallt natürlich kräftigst im Fenstermodus wenn das Fenster zu klein ist.
PeaceKiller
Sind doch oft nur kleine Fragen
Catscratch1
Bitte nicht mehr all den Code posten, der Initialisierungs und Renderingteil hätte gereicht. Und auf ZFX ist ne gute einführung in die Matrizenrechnung, da kannste mal D3DX vergessen und mal Hinter die Kullissen gucken _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 09.02.2005, 18:50 Titel: |
|
|
Catscratch1 hat Folgendes geschrieben: | Sorry, abe ich steh aufm Schlauch. Kann mir einer die Stelle im Code zeigen? |
Frage am Rande: Weißt Du überhaupt was Du da für 'nen Code vor Dir hast und was er macht?
CPP: | hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); |
Das 1. CW_USEDEFAULT durch 800 ersetzen.
Das 2. CW_USEDEFAULT durch 600 ersetzen.
Damit sollte der Großteil des Problemes behoben sein, natürlich wird dann noch immer Skaliert da du nicht die Clientgröße abfragst mit GetClientRect. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 09.02.2005, 18:55 Titel: |
|
|
Genau das ist der Punkt,
das tu ich nämlich nicht. _________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 09.02.2005, 19:22 Titel: |
|
|
Danke für die Tipps,
mein Problem ist nur C++.
Ich habe keine Ahnung von COM und versteh die WINAPI noch nicht. Aber liegt daran, dass ich mich erst seit einer Woche damit beschäftige. In C# ist das alles etwas einfacher.
Das seltsame ist, ich habe zwei Arten das Fenster zu erstellen. In der einen verzerrt es und in der anderen nicht.
Ich versteh nur nicht, warum das in dieser verzerrt! _________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 09.02.2005, 19:23 Titel: |
|
|
Lass erstmal den ganzen DX Kram weg, wenn Du die Basis nicht kapiert hast (Hier C++ und Win32API) kommst Du überhaupt nicht weiter, wie soll das später dann mit Pointer werden oder mit dem Laden von Grafiken? Denkste der D3DX-Schrott nimmt Dir jede Arbeit weg? _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 09.02.2005, 19:29 Titel: |
|
|
Hast Recht.
Das hab ich jetzt beschlossen.
Bin froh, dass ich wenigstens das Entzerren jetzt hinbekommen habe!
Thx for help!
------------------
Ich will wieder mein ABAP! _________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 09.02.2005, 19:31 Titel: |
|
|
Catscratch1
Warte noch bis Sonntag, dann stell ich mein Tutorial online Darin wird Stück für Stück erklärt wie man templates benutzt, die Win32API, Direct3D (incl. Device Lost ohne MANAGED), Keyboardmanagement, Exceptions, Debugsystem uvm
Kurz: Professionelle Ebene ^^ _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 09.02.2005, 19:40 Titel: |
|
|
Alles klar.
Bin mal gespannt.
Wenn du das mal mit nem SAP WAS Server online Stellen willst, sag bescheid
Weil das kann ich. _________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 09.02.2005, 21:25 Titel: |
|
|
Catscratch1 hat Folgendes geschrieben: | Alles klar.
Bin mal gespannt.
Wenn du das mal mit nem SAP WAS Server online Stellen willst, sag bescheid
Weil das kann ich. |
Was kann der server denn so? ^^ _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
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
|