|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
philipp_boeing JLI'ler
Alter: 34 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 11.09.2003, 09:12 Titel: Intro |
|
|
hi,
wie kann ich in mein Spiel ein Intro einbauen (ist in .avi) Am besten so das man es mit ESC abrechen kann. |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 11.09.2003, 11:54 Titel: |
|
|
Verwende einfach DShow, des is leicht zu lernen. (Tut im Netz suchen.) |
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
|
Nach oben |
|
|
philipp_boeing JLI'ler
Alter: 34 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 11.09.2003, 12:17 Titel: |
|
|
ist DShow denn in DX9 noch drin? Geht es auch mit D3D? |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 11.09.2003, 14:23 Titel: |
|
|
Hallo,
so aus aktueller Erfahrung eine kleine Hilfe:
Ja DShow is in DX9 drinenn und hat mit oder ohne D3D nix zu tun. Das was du vorhast ufert in einer großen Aktion aus! Nur so nebenbei.
Die Schritte waeren folgende:
1. DShow initialisieren. Fuer nen Film brauchst du das IMediaEvent, IVideoWindow, IGraphBuilder und das IMediaControl - Element. Wie zu benutzen kuck in der DX Hilfe nach. Is ned schwer.
2. Du musst das Fenster mit auf Fullscreen aufblasen, indem du entweder eine Rectangle ueber den ganzen Screen zeichnest oder das Fenster direkt vergroeßerst. Hat beides vor und Nachteile.
3. Datei laden.
4. Graph-Elemente aufbauen (s.o.) und Rendern der Datei.
Wenn du jetzt das ganze mit der Taste ESC oder einer anderen Beenden willst wirds schwerer. Hast du das Fenster direkt aufgeblasen, must du ein zweites "Fake"-Window erstellen, dass fuer dich die Nachrichten behandelt und weitergibt. Hast du die andere Variante gewaehlt, dann musst du zuerst die Surfaces loeschen, flippen und leer zeichnen. Dann kannst du den Player "weg"initialisieren (oder CoUninitializen )
Hope it helps.... ist jedenfalls nicht ganz einfach. |
|
Nach oben |
|
|
philipp_boeing JLI'ler
Alter: 34 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 11.09.2003, 14:26 Titel: |
|
|
erstmal: Danke für die Antwort
Allerdings bin ich noch nicht ganz so erfahren um das zu machen, gibt es dafür auch ein Code-beispiel was ich einbauen könnte?
MfG
Philipp Böing |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 11.09.2003, 14:35 Titel: |
|
|
Probier es doch erstmal? ;) Wenn du nur "ein Codebeispiel "einbaust", bist du hinterher genauso erfahren wie im Moment. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 11.09.2003, 14:37 Titel: |
|
|
Hmmm, japp schließe mich Hazel an, obwohl ichs auch gern bequemer gehabt haette *versteck*
Ich hab hier mal nen Link fuer dich. Der taugt nix um das ins Spiel einzubauen, aber wie DShow funktioniert und nen Windowplayer zulaesst, taugts schon.
http://www.gamedev.net/reference/articles/article1345.asp |
|
Nach oben |
|
|
philipp_boeing JLI'ler
Alter: 34 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 11.09.2003, 15:21 Titel: |
|
|
bin schon etwas weiter:
dieser code erzeugt ein Fenster neben dem Hauptfenster namens "Active Movie Window"
Code: | #include <windows.h>
#include <dshow.h>
#include <stdio.h>
// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);
//Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
// Das Fensterhandle
HWND hWnd = 0;
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaSeeking *lpSeeking = NULL;
IMediaEventEx *pEvent = NULL;
LONGLONG Pos= 0;
bool done=false;
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 0;
}
// Struktur, in der Informationen zur Nachricht gespeichert werden
MSG msg;
// Diese Schleife läuft bis die Nachricht WM_QUIT empfangen wird
while(true)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if(WM_QUIT == msg.message)
{
break;
}
}
else {
if(done==false)
{
// Initialize the COM library.
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("ERROR - Could not initialize COM library");
return 0;
}
// Create the filter graph manager and query for interfaces.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
printf("ERROR - Could not create the Filter Graph Manager.");
return 0;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEventEx, (void **)&pEvent);
hr = pGraph->QueryInterface(IID_IMediaSeeking,
(void **)&lpSeeking);
pEvent->SetNotifyWindow((OAHWND)hWnd, WM_APP, 0);
LPCWSTR Filename =L"E:\\Videos\\Video1.avi";
IBaseFilter *pSource1;
IPin *pPin;
pGraph->AddSourceFilter(Filename,Filename,&pSource1);
pSource1->FindPin(L"Output", &pPin);
pGraph->Render(pPin);
done = true;
}
long evCode, param1, param2;
HRESULT h;
h = pEvent->GetEvent(&evCode, ¶m1, ¶m2, 0);
pEvent->FreeEventParams(evCode, param1, param2);
if(evCode)
lpSeeking->SetPositions(&Pos, AM_SEEKING_AbsolutePositioning , NULL, AM_SEEKING_NoPositioning);
// Run the graph.
pControl->Run();
}
} // Big else
pControl->Release();
lpSeeking->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
return 0;
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass; // WNDCLASSEX Struktur
// Struktur initialisieren
wndClass.cbSize = sizeof(WNDCLASSEX); // Größe angeben (nie vergessen!)
wndClass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW; // Standard Stile
wndClass.lpfnWndProc = MessageHandler; // Die Callback Funktion angeben
wndClass.cbClsExtra = 0; // Zusätzliche Angaben, wird nicht benötigt
wndClass.cbWndExtra = 0; // Zusätzliche Angaben, wird nicht benötigt
wndClass.hInstance = hInstance; // Anwendungsinstanz
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // Weisser Pinsel
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); // Normaler Cursor
wndClass.lpszMenuName = NULL; // Das Fenster hat kein Menü
wndClass.lpszClassName = "WindowClass"; // Der Name der Klasse
wndClass.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Windows Logo
wndClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // Windows Logo
RegisterClassEx(&wndClass);
return CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"WindowClass", // Klassenname
"Hello Windows", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
0, 0, 400, 300, // 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)
{
// testen, um welche Nachticht es sich handelt
switch(msg)
{
// wenn das Fenster geschlossen wird, eine Nachricht senden,
// die das Programm beendet
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
}
// Wenn wir uns nicht um die Nachricht gekümmert haben
// wird sie an die Standardnachrichtenverarbeitung von Windows
// geschickt
return (DefWindowProc(hwnd, msg, wParam, lParam));
} |
wie schaffe ich es, dass das Video das mit diesem Code im "Active Movie Window" angezeigt wird im Hauptfenster angezeigt wird?
MfG
Philipp Böing |
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 11.09.2003, 15:40 Titel: |
|
|
Ich weiß es zwar nicht, aber das sieht ziemlich verdächtig nach meinem Code aus, denn ich hier gepostet habe...
Wie wär's, wenn du jetzt oben bei meinem Link vorbeischaust und dann weißt wie man's macht? _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
philipp_boeing JLI'ler
Alter: 34 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 11.09.2003, 15:54 Titel: |
|
|
In nem Sample kann man zwischen Fullscreen und Fenstermodus umschalten
Zitat: |
Source: (SDK root)\Samples\C++\DirectShow\Players\PlayWnd
Executable: (SDK root)\Samples\C++\DirectShow\Bin\PlayWnd.exe
|
Nachtrag:
Das sieht da z.B. so aus:
Code: | HRESULT ToggleFullScreen(void)
{
HRESULT hr=S_OK;
LONG lMode;
static HWND hDrain=0;
// Don't bother with full-screen for audio-only files
if ((g_bAudioOnly) || (!pVW))
return S_OK;
// Read current state
JIF(pVW->get_FullScreenMode(&lMode));
if (lMode == OAFALSE)
{
// Save current message drain
LIF(pVW->get_MessageDrain((OAHWND *) &hDrain));
// Set message drain to application main window
LIF(pVW->put_MessageDrain((OAHWND) ghApp));
// Switch to full-screen mode
lMode = OATRUE;
JIF(pVW->put_FullScreenMode(lMode));
g_bFullscreen = TRUE;
}
else
{
// Switch back to windowed mode
lMode = OAFALSE;
JIF(pVW->put_FullScreenMode(lMode));
// Undo change of message drain
LIF(pVW->put_MessageDrain((OAHWND) hDrain));
// Reset video window
LIF(pVW->SetWindowForeground(-1));
// Reclaim keyboard focus for player application
UpdateWindow(ghApp);
SetForegroundWindow(ghApp);
SetFocus(ghApp);
g_bFullscreen = FALSE;
}
return hr;
} |
_________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 11.09.2003, 17:12 Titel: |
|
|
Schau dir Milleniums Code an. Das ist die Einzige Moeglichkeit. Du kannst keine Videodateien im Gamewindow ausgeben. Der Graph bildet ein eigenes Fenster, dass du mit put_FullScreen und get_FullScreen machst. |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 11.09.2003, 18:00 Titel: |
|
|
@philipp: Der Code ist nur kopiert? Dann finde ich es eine Frechheit zu sagen "ich bin weitergekommen"(ICQ)! Man sollte schon sagen wo man Informationen her hat. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 11.09.2003, 18:05 Titel: |
|
|
Ja solche Leute liebe ich, nichts tun und immer Codes sehen können, damit sie ihre Projekte langsam per Copy&Paste verwirklichen können. Altbekanntes Problem hier. _________________ The source of all power is in its destiny... |
|
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
|