 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 04.06.2008, 15:18 Titel: ein paar frage... |
|
|
Hallo,
ich hab mal wieder ein paar Fragen:
1. Ich hab mir zwei Funktionen geschrieben um Sounds zu laden und abzuspielen. Ich hab alles so gemacht wie es im Buch steht.
CPP: | BOOL CDirectX::PlaySound(char* FILE_NAME, int loops)
{
int error = 0;
if(loops == 0) SoundFiles[FILE_NAME]->SetRepeats(DMUS_SEG_REPEAT_INFINITE);
else SoundFiles[FILE_NAME]->SetRepeats(loops);
lpPerformance->PlaySegmentEx(
SoundFiles[FILE_NAME],
NULL,
NULL,
DMUS_SEGF_SECONDARY,
0,
NULL,
NULL,
NULL
);
if(error != 0)
{
//SetError(error);
return FALSE;
}
return TRUE;
} |
Wie kann ich den Sound jetzt wieder stoppen?
2. Frage:
Ich kann anhand des Rückgabewerts der Present-Funktion feststellen, ob das Direct3D Device verloren gegangen ist. Ich versuche ich es mit lpD3DDevice::Reset wieder zu resetten, das Funktioniert aber nicht, ich bekomme einen Laufzeitfehler. |
|
Nach oben |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 04.06.2008, 17:58 Titel: Re: ein paar frage... |
|
|
newby hat Folgendes geschrieben: |
2. Frage:
Ich kann anhand des Rückgabewerts der Present-Funktion feststellen, ob das Direct3D Device verloren gegangen ist. Ich versuche ich es mit lpD3DDevice::Reset wieder zu resetten, das Funktioniert aber nicht, ich bekomme einen Laufzeitfehler. |
Da musst du schauen was genau mit dem device passiert ist bzw. in welchem Zustand es sich befindet und ob es gegebenenfalls möglich ist, es zu reseten. Das geht nämlich nicht immer. Steht aber auch so in der msdn bei der reset methode dabei.
Wenn du genau wissen willst, wie es deinem device gerade geht, dann empfiehlt es sich mal TestCooperativeLevel(...) auszuprobieren. |
|
Nach oben |
|
 |
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 05.06.2008, 14:06 Titel: |
|
|
Dein Code da oben ist nicht sinnvoll. Stell mal Warnungsstufe 4 ein und guck dann was der Compiler meldet.
CPP: | const bool CDirectX::PlaySound(const char* file_name, const unsigned int loops)
{
SoundFiles[file_name]->SetRepeats(!loops ? DMUS_SEG_REPEAT_INFINITE : loops);
return !FAILED(lpPerformance->PlaySegmentEx(SoundFiles[file_name], NULL, NULL, DMUS_SEGF_SECONDARY, 0, NULL, NULL, NULL);
} |
Stoppen per:
CPP: | void CDirectX::StopSound(const char* file_name)
{
lpPerformance->StopEx(SoundFiles[file_name], 0, 0);
} | ... |
|
Nach oben |
|
 |
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 11.06.2008, 20:20 Titel: |
|
|
komisch:
CPP: | result = lpD3DDevice->Present(0, 0, 0, 0);
if(result == D3DERR_DEVICELOST)
{
result = lpD3DDevice->TestCooperativeLevel();
if(result == D3DERR_DEVICELOST) return false;
else if(result == D3DERR_DEVICENOTRESET)
{
result = lpD3DDevice->Reset(&Params);
if(result == D3D_OK) MessageBox(0, "gut", "test", MB_OK); return true;
if(result == D3DERR_DEVICELOST) MessageBox(0, "gut1", "test", MB_OK); return true;
if(result == D3DERR_DRIVERINTERNALERROR) MessageBox(0, "gut2", "test", MB_OK); return true;
if(result == D3DERR_INVALIDCALL) MessageBox(0, "gut3", "test", MB_OK); return true;
if(result == D3DERR_OUTOFVIDEOMEMORY) MessageBox(0, "gut4", "test", MB_OK); return true;
if(result == E_OUTOFMEMORY) MessageBox(0, "gut5", "test", MB_OK); return true;
MessageBox(0, "gut6", "test", MB_OK);
}
//else Error.Set();
} |
der aufruf von reset() verursacht einen laufzeitfehler, aber wenn ich das auskommentiere wird die untere MessageBox nicht angezeigt ?
warum bekomme ich einen laufzeitfehler, wäre der parameter falsch würde die methode das invalid_call zurückgeben und den Device kann man auch resetten, überprüfe ich ja vorher.
den sound stoppen funktioniert super, vielen dank. |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 12.06.2008, 19:57 Titel: |
|
|
newby hat Folgendes geschrieben: | wenn ich das auskommentiere wird die untere MessageBox nicht angezeigt ?  | Das liegt daran dass du jede if-abfrage mit einem ; abschließt, der geht also beim ersten return true zurück. Zu dem anderen problem glaub ich auch, dass das mit Params zu tun hat oder dass da iwas nicht stimmt drinne.
Gruß DXer |
|
Nach oben |
|
 |
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 12.06.2008, 20:52 Titel: |
|
|
du hast recht, wenn ich die return wegmache, bekomme ich den fehler invalid_call, das Parameter ist also falsch.
Meine D3DPRESENT_PARAMETERS sehen so aus:
CPP: | Params.SwapEffect = D3DSWAPEFFECT_DISCARD;
Params.hDeviceWindow = hWnd;
Params.Windowed = Fullscreen;
Params.BackBufferWidth = Options.GetInt("GENERAL", "width");
Params.BackBufferHeight = Options.GetInt("GENERAL", "height");
Params.BackBufferFormat = D3DFMT_A8R8G8B8; |
fullscreen = true, width = 1280 und height = 1024
die sind genauso wie bei der initialisierung am anfang. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 12.06.2008, 21:23 Titel: |
|
|
Hast du alle DX Resourcen freigegeben (bis auf die managed Resourcen)?
Wenn ja dann benutze mal die DX Debug runtime Library (Suchfunktion), diese sollte dir mehr informationen geben. |
|
Nach oben |
|
 |
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 13.06.2008, 14:12 Titel: |
|
|
das hier sind meine resourcen, welche muss ich davon releasen?
CPP: | LPDIRECT3D9 lpD3D;
LPDIRECT3DDEVICE9 lpD3DDevice;
LPD3DXFONT lpD3DFont;
LPDIRECT3DSURFACE9 lpBackBuffer;
LPDIRECT3DSURFACE9 lpSurface;
IDirectMusicPerformance8* lpPerformance;
IDirectMusicLoader8* lpLoader;
LPD3DXSPRITE lpSprite;
LPDIRECTINPUT8 lpDI;
LPDIRECTINPUTDEVICE8 lpDIKeyboard;
bool bKeyboard[256];
bool bKeyboard_old[256];
POINT MousePos;
HRESULT result;
HINSTANCE hInst;
HWND hWnd;
map<string, D3DCOLOR> FontColor;
map<string, LPD3DXFONT> Fonts;
map<string, IDirectMusicSegment8*> SoundFiles;
map<string, LPDIRECT3DTEXTURE9> TextureFiles;
|
|
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 13.06.2008, 16:15 Titel: |
|
|
ich gehe hier davon aus das du das D3DDevice Reseten möchtest, wie es bei Input sowie Music/Sound aussieht kann ich nicht sagen da ich diese teile nie verwende.
Rot: Resource freigeben
Grün: Objekt nicht freigeben
Blau: Hängt von der Resource ab (hast du es von einer datei geladen sollte freigeben nicht nötig sein)
Zitat: | LPDIRECT3D9 lpD3D;
LPDIRECT3DDEVICE9 lpD3DDevice;
LPD3DXFONT lpD3DFont;
LPDIRECT3DSURFACE9 lpBackBuffer;
LPDIRECT3DSURFACE9 lpSurface;
IDirectMusicPerformance8* lpPerformance;
IDirectMusicLoader8* lpLoader;
LPD3DXSPRITE lpSprite;
LPDIRECTINPUT8 lpDI;
LPDIRECTINPUTDEVICE8 lpDIKeyboard;
bool bKeyboard[256];
bool bKeyboard_old[256];
POINT MousePos;
HRESULT result;
HINSTANCE hInst;
HWND hWnd;
map<string, D3DCOLOR> FontColor;
map<string, LPD3DXFONT> Fonts;
map<string, IDirectMusicSegment8*> SoundFiles;
map<string, LPDIRECT3DTEXTURE9> TextureFiles; |
D3DX Objekte muss man übrigens nicht freigeben hier reicht es aus einfach OnDeviceLost vor dem Reset aufzurufen und danach OnDeviceReset aufzurufen (kann sein das die Methoden anders lauten). |
|
Nach oben |
|
 |
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 13.06.2008, 18:48 Titel: |
|
|
wenn irgendwas hiervon nicht auskommentiere bekomme ich sofort einen laufzeitfehler:
CPP: | //lpD3DFont->Release();
/*map<string, LPD3DXFONT>::iterator it;
for(it=Fonts.begin();it!=Fonts.end();it++)
{
(*it).Release();
}*/
//lpSurface->Release();
//lpBackBuffer->Release();
//lpSprite->Release();
//result = lpD3DDevice->Reset(&Params);
if(result == D3D_OK) MessageBox(0, "Well", "Well", MB_OK);
if(result == D3DERR_DEVICELOST) MessageBox(0, "gut1", "Error 1", MB_OK);
if(result == D3DERR_DRIVERINTERNALERROR) MessageBox(0, "gut2", "Error 2", MB_OK);
if(result == D3DERR_INVALIDCALL) MessageBox(0, "gut3", "Error 3", MB_OK);
if(result == D3DERR_OUTOFVIDEOMEMORY) MessageBox(0, "gut4", "Error 4", MB_OK);
if(result == E_OUTOFMEMORY) MessageBox(0, "gut5", "Error 5", MB_OK);
|
|
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.06.2008, 18:32 Titel: |
|
|
Könnte allerhöchstwahrscheinlich an ungültigen Pointern liegen. Du solltest das überprüfen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 15.06.2008, 20:28 Titel: |
|
|
Hast du überhaupt probiert herauszufinden was da schief läuft? Wenn nein dann tu das, wenn doch tu es nochmal aber ordentlich. |
|
Nach oben |
|
 |
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 30.06.2008, 17:07 Titel: |
|
|
neue frage:
wie kann ich die lautstärkte der sounds einstellen, hab bei msdn nichts vernünfiges gefunden (oder bin zu dumm zum suchen) |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
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
|