JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=918bdaaece9cf496e0a561638dbdc34eMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Intro
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
philipp_boeing
JLI'ler


Alter: 34
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 10:12    Titel: Intro Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 12:54    Titel: Antworten mit Zitat

Verwende einfach DShow, des is leicht zu lernen. (Tut im Netz suchen.)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 13:07    Titel: Antworten mit Zitat

Ja und das am Besten in der MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/htm/directshowfaq.asp
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
philipp_boeing
JLI'ler


Alter: 34
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 13:17    Titel: Antworten mit Zitat

ist DShow denn in DX9 noch drin? Geht es auch mit D3D?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 15:23    Titel: Antworten mit Zitat

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 Wink)

Hope it helps.... ist jedenfalls nicht ganz einfach.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
philipp_boeing
JLI'ler


Alter: 34
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 15:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 15:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 15:37    Titel: Antworten mit Zitat

Hmmm, japp schließe mich Hazel an, obwohl ichs auch gern bequemer gehabt haette Wink Wink *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
Benutzer-Profile anzeigen Private Nachricht senden
philipp_boeing
JLI'ler


Alter: 34
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 16:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 16:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
philipp_boeing
JLI'ler


Alter: 34
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 16:47    Titel: Antworten mit Zitat

Hi,

1. ich weiß das das dein code ist

2. Auch unterm Link habe ich auch schon nachgesehen

3. ich habe auch nachgeguckt wie man ein File abspielt
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/htm/howtoplayafile.asp

aber

ich habe immer noch nicht gefunden, wie ich anstatt Movie Fenster das ganze ins normale Fenster mache.

MfG

Philipp Böing
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 16:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 18:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 19:00    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 11.09.2003, 19:05    Titel: Antworten mit Zitat

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. Sad
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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

Impressum