Odczyt ekranu z gry

0

Witam

Zacząłem pisać program, który miałby zbierać obraz z gry i porównywać ze sobą klatki przesunięte o kilka sekund (oczywiście po to by na podstawie różnic coś zrobić). Ze względu na moje początki z directX znalazłem przykładowy kod i go trochę ogarnąłem. O ile prawidłowo odczytuje on obraz kiedy jestem na pulpicie (na wierzchu np przeglądarka), o tyle w grze przy próbie zebrania obrazu nie przechodzi do końca funkcji. Może powiedzieć co trzeba zmienić?

void get_screen()
{
	UINT adapter = D3DADAPTER_DEFAULT;
	IDirect3D9 *d3d = nullptr;
	IDirect3DDevice9 *device = nullptr;
	IDirect3DSurface9 *surface = nullptr;
	D3DPRESENT_PARAMETERS parameters = { 0 };
	D3DDISPLAYMODE mode;  //screen resolution
	D3DLOCKED_RECT rc;
	UINT pitch;
	SYSTEMTIME st;
	LPBYTE shots = nullptr;
	HRESULT hr;

	// init D3D and get screen size
	d3d = Direct3DCreate9(D3D_SDK_VERSION);
	d3d->GetAdapterDisplayMode(adapter, &mode);

	parameters.Windowed = TRUE;
	parameters.BackBufferCount = 1;
	parameters.BackBufferHeight = mode.Height;
	parameters.BackBufferWidth = mode.Width;
	parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
	parameters.hDeviceWindow = NULL;

	// create device & capture surface
	hr=d3d->CreateDevice(adapter, D3DDEVTYPE_HAL, NULL, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &parameters, &device); //tu nie tworzy urzadzenia
	device->CreateOffscreenPlainSurface(mode.Width, mode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &surface, nullptr);

	// get the data
	device->GetFrontBufferData(0, surface);
	surface->LockRect(&rc, NULL, 0);
	pitch = rc.Pitch;
	shots = new BYTE[pitch * mode.Height];
	CopyMemory(shots, rc.pBits, rc.Pitch * mode.Height);
	surface->UnlockRect();

	// save all screenshots
	WCHAR file[100] = L"test.png";
	save_screen(mode.Width, mode.Height, pitch, shots, file, GUID_ContainerFormatPng); //zapis obrazu do pliku, tak abym mial podglad

	//cleanup:
	surface->Release();
	device->Release();
	d3d->Release();
}
0

o tyle w grze

W jakiej grze? Próbowałeś wielu - starych i nowych?

przy próbie zebrania obrazu nie przechodzi do końca funkcji.

A na czym się wywala?

0

Nie próbowałem niczego starego na razie.

Wywala na po poleceniu:

hr=d3d->CreateDevice(adapter, D3DDEVTYPE_HAL, NULL, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &parameters, &device);

Nie jest inicjowane "device" i na następnej linii się wysypuje.

Co do linków - na razie przeglądnąłem Indicium-Supra, jednak wolałbym w miarę możliwości uniknąć wpychania dll do gry, drugi muszę się zagłębić, ale tamtejszy link do "screen capture project" kończy się błędem 404

0

Nie próbowałem niczego starego na razie.

A?
Chodzi ci w ogóle o dowolną grę, czy piszesz własną i to będzie w jej ramach?

Wywala na po poleceniu:
hr=d3d->CreateDevice(adapter, D3DDEVTYPE_HAL, NULL, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &parameters, &device);
Nie jest inicjowane "device" i na następnej linii się wysypuje.

No i co ci zwraca to CreateDevice? Po coś w końcu tę zmienną hr masz...

0

Chodzi bardziej o dowolną grę. Jakby np. pojawiło się coś gdzie znów by trzeba było wykuwać 1000 żelażnych sztyletów żeby nabić umiejętność i to ogarnąć bez nadmiernego zabijania przyjemności z grania "bo ktoś skopał balans i nie da się tego uniknąć". W miarę możliwości mieć taki szablon, żeby do niego już tylko bardziej przypisywać czynności przy zmianie gry, niż zaczynać od nowa. Chociaż to może być trochę nierealne.

Jeśli chodzi o zmienną hr, to zwraca kod który mi nic nie mówi - 0x88760868. Podgląd na "device" stwierdza że dalej jest o wartości "NULL".

0

Tak, bota działającego na zrzutach ekranu. Wiadomo, że nie upchnę tam tak skomplikowanej logiki jak przy dll-ach gry, jednak chce coś bardziej uniwersalnego kosztem złożoności zadań.

0

Ciekawe jaką sieć neuronową stworzysz do przetwarzania tych obrazków

0
Nieposkromiony Mleczarz napisał(a):

Ciekawe jaką sieć neuronową stworzysz do przetwarzania tych obrazków

Nie wszystko musi iść przez sieć neuronową, np. ekrany z dużą ilością statycznych obiektów (np. wczytywanie) mogą być bardziej pewne poprzez wysoką zgodność histerezy. Ale tak, coś z siecią neuronową będzie trzeba pomyśleć, bo nawigacja na samych przesunięciach minimap może być słaba (tym bardziej, że nie wszędzie są). Przynajmniej na razie nie myślę o potrzebie celowania, bo to na razie nie potrzebne, a i może się okazać zbyt skomplikowane by to zrobić w wersji uniwersalnej.

0

Chętnie zobaczę rezultat :)

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