Jak wymusić na grze działanie "w oknie"?

0

Witajcie moi mili.
Mam starą grę przygodową, 2d o nazwie książę i tchórz, ona raczej nie oferuje ani zmiany rozdzielczości, ani opcji grania w oknie (domyślnie jest na full screen i rozdzielczość ma niską) więc chciałbym na grze wymusić by zamiast na full screenie, była w oknie. Czy wiecie jak to zrobić?

0

a w czym pisałeś tę grę?

0

to nie moja gra, to popularna dawniej (1998), stara gra przygodowa Point & Click
http://www.gry-online.pl/S016.asp?ID=658

0

@błagający - nie robiłem nigdy takich rzeczy bo nie było mi to potrzebne, jednak szukałbym informacji o jakichś emulatorach, w których można by uruchomić grę stworzoną pod stare systemy; Emulatory z reguły pozwalają na pracę w oknie, więc w tym kierunku bym szedł.

0

aha. Emulatorów nie szukałem, bo ta gra chodzi świetnie pod Windows 8 64 bitowym, kolory są prawidłowe, wszystko git, jedynie chciałem wymusić na grze by była w oknie

0

Jeśli to gra DOS-owa, to spróbuj ją uruchomić pod DOS-Boxem. Pozwala na grę w oknie i na pełnym ekranie, i na zmianę rozdzielczości (ale to będzie tylko skalowanie, rozdzielczość grafiki w grze się nie zmieni).

Jeśli gra jest pod Windows, to będzie trochę większy problem. Jeszcze chyba nie ma emulatora Windows pod Windows, a do każdej starej gry podchodzi się indywidualnie, stosując różnorakie hacki.

Rozdzielczości na pewno nie zmienisz jeśli gra tego nie umożliwia. Ale w ustawieniach karty graficznej powinieneś znaleźć opcję skalowania obrazu tak, by nie rozciągało całego obrazu na panoramę (absurd! powinni tego zabronić!) tylko zachować standardowe proporcje 4:3.

EDIT: jeśli działa pod 64-bitowym systemem, to nie jest to gra pod DOS-a.

EDIT2: na wszelki wypadek, sprawdź czy lewy alt+enter nie przełącza gry w okno ;-)

0

Nie wiem czy gra jest warta świeczki, ale zawsze możesz zainstalować Windows w VirtualBox i odpalić grę w nim.

0

Alt + Enter nie robi nic, znam ten skrót.
Sposób z VirtualBoxem znam, jednak nie chce mi się dla jednej gry instalować go i systemu :).

(Podsumowanie - gra sama z siebie działa świetnie na win8 64bit, obraz 4:3, kolory super, wszystko super, grywalna na full screenie normalnie. A to wymuszenie na grze by była "w oknie" to taka moja zachcianka z 2 powodów, jeden to cele edukacyjne, drugi to wygoda, okno z grą, obok okno jakiegoś programu do komunikacji lub jeszcze kilka innych spraw. Także jeśli nie da się na grze wymusić gry w oknie to nie umrę od tego) :)

0

Tutaj @Azarien mógłby Tobie pomóc. Bo lepiej zna C++ na pewno ode mnie. Gdyż ja praktycznie wcale nie znam tego języka. Trzeba by było przeanalizować kod źródłowy dllki do spoofowania C&C RedAlert. Którą pozwala na granie w tę grę pod nowszymi systemami i ma parę konfiguracyjnych bajerów. I zobaczyć jak tam jest robiona obsługa pokazywania gry w oknie pod żądaną rozdzielczością.

Ale raczej z tego co widzę. Nie obejdzie się bez zmuszania obiektów od DirectX do zmiany ustawień stworzonego oryginalnie okna dla danej gry i jakiegoś rendera. Dlatego póki co pozostaje granie pod Virtualną maszyną i najlepiej na Windows 98. Żeby nie było problemów z paletą kolorów przy aktywnym explorer.exe.

A może i na to źle patrze w source. Jakby co macie je dołaczone. Może coś uda się Wam podpatrzeć i zrobić dllkę do spoofowania w Delphi. Żeby nie trzeba było rzeźbic dllki od zera macie także mój color fix. Bardzo lamerski, bo zatrzymuje proces Explorera. Jednak już jest jakaś baza exportów by móc podpiąc swój kod w ddraw.dll pod stare gry.

1

Istnieje nieoficjalny dodatek do Fallouta 2 o nazwie sfall. Oprócz bycia wrapperem DirectDraw do Direct3D, modyfikuje różne aspekty gry, więc jako uniwersalny wrapper się nie nadaje - ale są źródła, więc powinno się dać wyciąć wszystko specyficzne dla F2.
Według readme jest możliwość gry w oknie.

(nigdy tego nie używałem)

2

Robiłem jakiś czas temu m.in. wymuszenie działania w oknie dla pewnej gry. Używała DirectDraw.
Najpierw robimy jakiś DLL injecting i przechwytujemy CreateWindow oraz DirectDrawCreate. W tej pierwszej funkcji ustawiamy sobie style okna takie jak chcemy oraz ew. wołamy AdjustWindowRect i zachowujemy HWND. W tej drugiej funkcji, wołamy naszą oryginalną już na początku, ale lekko modyfikujemy otrzymane nam IDirectDraw, a dokładnie jego vtable. Pod indeksem 21 znajduje się tam wskaźnik do metody SetDisplayMode, którą nasza gra wołała przy uruchomieniu oraz przy żądaniu zmiany rozdzielczości w opcjach gry. Przechwytujemy tę funkcję i wołamy tam sobie AdjustWindowRect i SetWindowPos na naszym zachowanym HWND.
O tym, że gra wywołuje takie, a nie inne funkcje dowiedziałem się robiąc disassembling głównego exe-ka gry, a o 21. indeksie buszując w nagłówkach SDK DirectX.

Najciekawsze, czyli przechwycenie SetDisplayMode może wyglądać tak:

HRESULT WINAPI MyDirectDrawCreate(GUID *lpGUID, LPDIRECTDRAW *lplpDD, IUnknown *pUnkOuter)
{
    HRESULT result = DirectDrawCreate(lpGUID, lplpDD, pUnkOuter);

    IDirectDraw *directDraw = *lplpDD;

    void** vtable = *(void***) directDraw;
    vtable[21] = &SetDisplayMode;

    return result;
}

(w sumie to powinno się najpierw przeanalizować ten result)

0

@olesio adlaczego w tym fixie masz Sleep(1); ?

zabijcie explorer.exe to dobry pomysl na rozwiazanie problemow ze starszymi grami na Windows 7.

0

Zdaje się, że Sleep był konieczny lub wzięty z oryginalnego źródła fixa do Wormsów Armaggeddon, bazującego na tej metodzie. Na pewno nie jest ona idealna. Ponieważ po Ctrl+Alt+Del mamy okno w "skopanych" kolorach. Prawidłowo napisane dllki do spoofnięcia robią to bardziej profesjonalnie. U mnie czasem okno się nie zamknie i są inne nieprzewidziane problemy. Jednak ja od zera takiej porządnej dll w Delphi czy C++ nie umiem stworzyć.

Wiem, że @Azarien bawił się kiedyś źródłem ddhacka do Wing Commander 4, który w wielu grach sprawdza się świetnie. Tylko niektóre tekstury na fragmencie obrazu migoczą. Ale nie wiem co mu z tego wyszło, by spróbowac zrobić uniwersalną dllkę dla wielu starczy gier. Zdałem się na Niego. Gdyż nie mam w ogóle doświadczenia z DX.

0

Pod indeksem 21 znajduje się tam wskaźnik do metody SetDisplayMode, którą nasza gra wołała przy uruchomieniu oraz przy żądaniu zmiany rozdzielczości w opcjach gry. Przechwytujemy tę funkcję i wołamy tam sobie AdjustWindowRect i SetWindowPos na naszym zachowanym HWND.

Brzydki hack ;-) Ładniej jest napisać własne IDirectDraw które wywołuje metody oryginalnego z wyjątkiem tej jednej funkcji...

...aaaale, to nie zadziała tak jak byś chciał. DirectDraw operuje zawsze na pełnym ekranie, przy bieżącej rozdzielczości i głębi kolorów.
Podstawowa powierzchnia ekranu (IDirectDrawSurface) odzwierciedla cały ekran nawet w trybie okienkowym. To aplikacja musi pilnować, by nie rysować poza własnym oknem (jest to zautomatyzowane za pomocą IDirectDrawClipper).
Okienkowy program pod DirectDraw jest możliwy, ale różni się więcej niż tylko wywołaniem SetDisplayMode.

Zazwyczaj robiono tak, że za pomocą SetDisplayMode ustawiano rozdzielczość (najczęściej 640x480x8) i już dalej aplikacja na sztywno zakłada, że ma taką pełnoekranową rozdziałkę i 8-bitowy kolor.

Trzeba więc napisać dobry kawał całego DirectDraw na nowo, by przejąć kontrolę nad oknem tak, by aplikacja nie zauważyła różnicy.

Ale nie wiem co mu z tego wyszło, by spróbowac zrobić uniwersalną dllkę dla wielu starczy gier.
To nie jest takie proste, ale projekt nie jest zarzucony ;) /niedawno odkryłem sfall i zawarte tam co-nieco związane z ddraw/

0

@olesio jesli dobrze rozumiem, to ten fix wstrzmuje explorer.exe gdy gra jest aktywna a podczas alt+tab proces ten jest wzniowiony i cos tam odswiezane. Tak?

0

No mniej więcej tak. Hook jest po to, żebym wykryć - chociaż nie zawsze skutecznie - zamknięcie aplikacji. Odświeżenie te było konieczne, ponieważ czasem zostawał nam przykładowo zielonkawy przycisk Menu Start w klasycznej kompozycji pod Windows 7. Lub inne glitche graficzne na ekranie. Fix ten jest jak wspomniałem badzo malo profesjonalny. I należało by się mocno nakombinować, tak jak robią to dedykowane hacki dla konkretnych tytułów starszych gier.

0

@mca64: zdaje się przy większym sleepie miałem jakieś problemy. Zostawiłem więc tak, jak było zdaje się w oryginalnym kodzie. Wstrzymanie procesu oczywiście może doprowadzić do sytuacji, że nie będziemy mieli dostępu do paska, gdy coś się zcrashuje itp.

Także sposób mocno inwazyjny. Jednak przy wielu grach skuteczny i dla mnie wystarczający. Jednak lepiej mieć uruchomiony też jakiś File Manager i pod ręką na przykład w %PATH% takiego batcha nazwanego er. Od explorer reload dla szybszego wywołania przez wpisanie ;)

@echo off
taskkill /im explorer.exe /f
start %WINDIR%\explorer.exe

1 użytkowników online, w tym zalogowanych: 0, gości: 1