|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
theLegacy Mini JLI'ler
Anmeldedatum: 04.06.2003 Beiträge: 13 Wohnort: Österreich Medaillen: Keine
|
Verfasst am: 04.06.2003, 11:03 Titel: Hilfe! Programm beendet sich selber!! |
|
|
Hi!
Ich bin ein Anfänger in sachen c++ und directX
deshalb habe ich mir ein buch gekauft :
directX9 und visual c++
Sehr gutes buch muss ich sagen nur leider hab ich nur probleme!!
Ab den Kapitel 20 glaube ich entwickelt man ein directX fenster
nur leider geht das fenster kurz auf und verschwindet wieder!!
im debugger steht das das programm mit -1 beendet wurde!!
ok, dachte ich mir und hab die fehlerabfänger ausgeschalten!! und da
kann eine meldung über einen speicher der nicht zugegriffen darf oder
so!
weiss einer von euch was da los ist!!
nochwas! alle beispiele vom diesen buch funktionieren komplett gleich
wie mein problem!
hab dann die beispiele vom directX9 SDK getestet und die funktionieren!!
cu |
|
Nach oben |
|
|
Mäscht JLI'ler
Anmeldedatum: 22.05.2003 Beiträge: 150 Wohnort: Bad Hofgastein\Österreich Medaillen: Keine
|
Verfasst am: 05.06.2003, 12:07 Titel: |
|
|
Hast du eh den return wert am Ende gleich null gesetzt?
Am Besten wäre es wenn du einen kleinen Codeauschnitt herzeigst! _________________ Motz´z mi net o, i bin ofänga!! AEIOU für immer |
|
Nach oben |
|
|
theLegacy Mini JLI'ler
Anmeldedatum: 04.06.2003 Beiträge: 13 Wohnort: Österreich Medaillen: Keine
|
Verfasst am: 05.06.2003, 12:39 Titel: |
|
|
Ja!
wie es passiert auch bei den beispielen im buch!
ich hab es die ursache gefunden, weiss aber was das bedeutet!
wenn ich debug modus compiliere kommt dieser fehler:
der fehler tritt ihr auf:
lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET, ClearColor, 0,0);
fehler meldung, hinweis:
Unbehandelte Ausnahme in DirectXGraphics.exe: 0x00000005:
Access Violation
weiss jemand wass das heissen soll!
danke |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 05.06.2003, 12:42 Titel: |
|
|
Ich glaube, diesen Fehler hatte ich auch schon mal bei einem früheren Projekt. Das heißt AFAIK, dass der Fensterinhalt geleert wird, obwohl das Programm gar nicht mehr das Recht dazu hat.
<edit>
Du könntest vielleicht, wenn alle Objekte freigegeben werden eine Variable auf 'true' stellen und in dem Fall den Bildschirm nicht mehr leeren.
</edit> _________________ 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...
Zuletzt bearbeitet von The Lord of Programming am 05.06.2003, 12:44, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 05.06.2003, 12:43 Titel: |
|
|
Anscheinend ist ein Zeiger ungültig. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
theLegacy Mini JLI'ler
Anmeldedatum: 04.06.2003 Beiträge: 13 Wohnort: Österreich Medaillen: Keine
|
Verfasst am: 05.06.2003, 12:44 Titel: |
|
|
und was mache ich jetzt damit das funktioniert?? |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
|
theLegacy Mini JLI'ler
Anmeldedatum: 04.06.2003 Beiträge: 13 Wohnort: Österreich Medaillen: Keine
|
Verfasst am: 05.06.2003, 12:47 Titel: |
|
|
@The Lord of Programming
leider weiss ich nicht was du damit meinst!
kann das sein das die beispiele im diesen buch nicht allen
funktionieren?? |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 05.06.2003, 12:51 Titel: |
|
|
Also, du machst eine globale Variable z.B. bool freigeben=false.
Dann setzt du vor der "Beendungsfunktion" diese Variable auf true.
Code: | WM_DESTROY:
freigeben=true;
//DX-Freigaben
DestroyWindow(0);
return 0; |
In der Render funktion machst du dann vor allen Anweisungen
Code: | if(freigeben==true) return; |
So wird auf keinen Fall etwas auf den Bildschirm gezeichnet(oder gelöscht), wenn gerade die Objekte freigegeben 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 |
|
|
theLegacy Mini JLI'ler
Anmeldedatum: 04.06.2003 Beiträge: 13 Wohnort: Österreich Medaillen: Keine
|
Verfasst am: 05.06.2003, 12:54 Titel: |
|
|
ich was heraus gefunden!!
wenn ich case: WM_PAINT alle D3D code lösche dann kommt die
meldung D3D wurde nicht geladen!!
kann es sein das bei mir DirectX nicht richtig funktioniert??
nur komisch ist das die beispiele vom SDK problemlos funktionieren!
mein system ist:
amd 2600+
win2k mit sp3
matrox g450 dh grafikkarte
1gb ram |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 05.06.2003, 12:57 Titel: |
|
|
Poste bitte mal den Code(Vielleicht hast du ja zu viel gelöscht) _________________ 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 |
|
|
theLegacy Mini JLI'ler
Anmeldedatum: 04.06.2003 Beiträge: 13 Wohnort: Österreich Medaillen: Keine
|
Verfasst am: 05.06.2003, 13:01 Titel: |
|
|
hier der code:
hab stelle markiert!
Code: |
/*
Jetzt lerne ich Spieleprogrammierung mit DirectX und Visual C++
Programmname: DirectXGraphics
Beschreibung: Dieses Programm zeigt wie DirectX Graphics initialisiert wird.
Führen Sie das Programm durch Drücken von F5 aus.
*/
// Headerdateien
#include <d3d9.h>
#include <d3dx9.h>
// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);
// Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
// Funktion zur Initialisierung von Direct3D
BOOL InitDirect3D(HWND hWnd);
// Direct3D-Objekte wieder freigeben
void CleanUpDirect3D(void);
// Zeiger auf das Direct3D-Objekt (Interface)
LPDIRECT3D9 lpD3D = NULL;
// Zeiger auf das Direct3D-Device
LPDIRECT3DDEVICE9 lpD3DDevice = NULL;
// Das Fensterhandle
HWND hWnd = 0;
// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance, // Handle der Programminstanz
HINSTANCE hPrevInstance, // Handle der letzten Instanz
LPSTR lpCmdLine, // Kommandozeile
int nCmdShow) // Art wie das Fenster angezeigt werden soll
{
// Fenster erzeugen und Handle speichern
hWnd = CreateMainWindow(hInstance);
// Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
if(0 == hWnd)
{
MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
return -1;
}
// Direct3D initialisieren
if(!InitDirect3D(hWnd))
{
MessageBox(0,"D3D konnte nicht geladen werden!","Fehler",MB_OK);
return -1;
}
// Struktur, in der Informationen zur Nachricht gespeichert werden
MSG msg;
// Diese Schleife läuft bis die Nachricht WM_QUIT empfangen wird
while(GetMessage(&msg,NULL,0,0))
{
// Nachricht an die Callbackfunktion senden
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// Direct3D-Objekte wieder frei geben
CleanUpDirect3D();
// Rückgabewert an Windows
return 0;
}
// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass =
{
sizeof(WNDCLASSEX), // Größe angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
MessageHandler, // Callback-Funktion
0, // Zusätzliche Angaben
0, // nicht benötigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(WHITE_BRUSH), // Weißer Pinsel
NULL, // kein Menü
"WindowClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};
RegisterClassEx(&wndClass);
return CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"WindowClass", // Klassenname
"DirectX Graphics", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
0, 0, 800, 600, // Anfangsposition und Größe
NULL, // Handle des Elternfensters
NULL, // Handle des Menüs
hInstance, // Anwendungsinstanz
NULL); // wird nicht benötigt
}
// Diese Funktion wird von Windows aufgrufen, wenn
// eine Nachricht für Ihr Programm vorliegt
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Farbe für die Füllung des Backbuffer festlegen
D3DCOLOR ClearColor = D3DCOLOR_XRGB(0,0,0xFF);
// testen, um welche Nachticht es sich handelt
switch(msg)
{
// Programm beenden, wenn das Fenster
// geschlossen wird
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYDOWN:
switch(wParam)
{
// Wenn ESC gedrückt, Anwendung beenden
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
break;
case WM_PAINT:
/*****************************************************/
// hier tritt der fehler auf!!
/*****************************************************/
// Puffer mit blau füllen
lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET, ClearColor, 0,0);
lpD3DDevice->BeginScene();
lpD3DDevice->EndScene();
lpD3DDevice->Present(0,0,0,0);
break;
}
// Standardnachrichtenverarbeitung von Windows
return DefWindowProc(hwnd, msg, wParam, lParam);
}
// Direct3D initialisieren
BOOL InitDirect3D(HWND hWnd)
{
// 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 = TRUE;
PParams.BackBufferWidth = 800;
PParams.BackBufferHeight = 600;
PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
// Direct3D-Gerät anlegen
if(FAILED(lpD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&PParams,
&lpD3DDevice)))
{
// Fehler, kann Gerät nicht anlegen
return FALSE;
}
return TRUE;
}
// Direct3D Objekte freigeben
void CleanUpDirect3D(void)
{
// testen, ob die Objekt angelegt
// wurden und ggf. freigeben
if(NULL != lpD3DDevice)
{
lpD3DDevice->Release();
lpD3DDevice = NULL;
}
if(NULL != lpD3D)
{
lpD3D->Release();
lpD3D = NULL;
}
}
|
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
|
Mäscht JLI'ler
Anmeldedatum: 22.05.2003 Beiträge: 150 Wohnort: Bad Hofgastein\Österreich Medaillen: Keine
|
Verfasst am: 05.06.2003, 13:14 Titel: |
|
|
Oida! Bei DX9 gibt´s jo wida neiche befehle zum Lerna! Geh!! _________________ Motz´z mi net o, i bin ofänga!! AEIOU für immer |
|
Nach oben |
|
|
theLegacy Mini JLI'ler
Anmeldedatum: 04.06.2003 Beiträge: 13 Wohnort: Österreich Medaillen: Keine
|
Verfasst am: 05.06.2003, 13:15 Titel: |
|
|
ja
hab die sdk von der cd installiert! |
|
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
|