> DirectInput
IH63
Отправлено: 3 июля 2013 в 19:39
Post Id
cообщений: 5 пользователь offline

Попробовал написать код исходя из уроков по этой теме в соответствующем разделе.Код компилируется, но не работает.Помогите разобраться плиз
#define INITGUID
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "dinput8.lib")
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#include <Windows.h>
#include <d3d9.h>
struct vertex
{
float x,y,z;
unsigned long color;
};
LRESULT __stdcall WndProc(HWND, UINT, WPARAM, LPARAM);
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(6);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpszClassName = L"class";
wc.lpszMenuName = NULL;

RegisterClass(&wc);

HWND hWnd = CreateWindow(L"class",L"Инициализация Direct3D",
WS_OVERLAPPEDWINDOW,200,100,
500,500,NULL,NULL,hInstance,NULL);

ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);

IDirectInput8* di; // объект DirectInput
IDirectInputDevice8* didev; // устройство DirectInput

DirectInput8Create(hInstance, // экземпляр приложения
DIRECTINPUT_VERSION, // версия DirectInput
IID_IDirectInput8, // глобальный идентификатор (COM)
(void**)&di, // адрес указателя объекта DirectInput
NULL);

di->CreateDevice(GUID_SysMouse, // устройство ввода с мыши
&didev, // адрес указателя на устройство
NULL);

didev->SetDataFormat(&c_dfDIMouse);
didev->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
didev->Acquire();
int dx=0,dy=0,dz=0;
DIMOUSESTATE dims;
ZeroMemory(&dims,sizeof(dims));

IDirect3D9* d3d = NULL; // объект Direct3D
IDirect3DDevice9* dev = NULL; // устройство (видеокарта)

d3d = Direct3DCreate9(D3D_SDK_VERSION);

D3DPRESENT_PARAMETERS pp;
ZeroMemory(&pp,sizeof(pp));

pp.BackBufferWidth = 500;
pp.BackBufferHeight = 500;
pp.BackBufferFormat = D3DFMT_X8R8G8B8;
pp.BackBufferCount = 1;
pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
pp.hDeviceWindow = hWnd;
pp.Windowed = true;
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&pp, &dev);
IDirect3DVertexBuffer9* vb = NULL;
dev->CreateVertexBuffer( 3* sizeof(vertex), D3DUSAGE_WRITEONLY,
D3DFVF_XYZ|D3DFVF_DIFFUSE, D3DPOOL_DEFAULT,
&vb,NULL);
dev->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
vertex vertices[] =
{
{ -2, -1, 0, 0xff000000},
{ 0, 2, 0, 0xff000000},
{ 2, -1, 0, 0xff000000},
{0, -4, 0, 0xff000000},
{ -2, -1, 0, 0xff000000},
{ 0, 2, 0, 0xff000000},
};

D3DMATRIX matWorld;
D3DMATRIX matCam;
D3DMATRIX matProj;
matWorld._11=1; matWorld._12=0; matWorld._13=0; matWorld._14=0;
matWorld._21=0; matWorld._22=1; matWorld._23=0; matWorld._24=0;
matWorld._31=0; matWorld._32=0; matWorld._33=1; matWorld._34=0;
matWorld._41=0; matWorld._42=0; matWorld._43=0; matWorld._44=1;

matCam._11=1; matCam._12=0; matCam._13=0; matCam._14=0;
matCam._21=0; matCam._22=1; matCam._23=0; matCam._24=0;
matCam._31=0; matCam._32=0; matCam._33=1; matCam._34=0;
matCam._41=0; matCam._42=0; matCam._43=10; matCam._44=1;

matProj._11=1; matProj._12=0; matProj._13=0; matProj._14=0;
matProj._21=0; matProj._22=1; matProj._23=0; matProj._24=0;
matProj._31=0; matProj._32=0; matProj._33=1; matProj._34=1;
matProj._41=0; matProj._42=0; matProj._43=-1; matProj._44=0;
dev->SetTransform( D3DTS_WORLD, &matWorld);
dev->SetTransform( D3DTS_VIEW, &matCam);
dev->SetTransform( D3DTS_PROJECTION, &matProj );
void* vb_vertices;
vb->Lock(0,sizeof(vertices),(void**)&vb_vertices,0);
memcpy(vb_vertices,vertices,sizeof(vertices));
vb->Unlock();
dev->SetStreamSource(0,vb,0,sizeof(vertex));
dev->SetStreamSource(1,vb,0,sizeof(vertex));
dev->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);
MSG msg;
while (1)
{dx = 0;
dy = 0;
dz=0;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}

HRESULT hr=didev->GetDeviceState(sizeof(DIMOUSESTATE),&dims);
if FAILED(hr) return 0;
dev->Clear(0,NULL,D3DCLEAR_TARGET,
D3DCOLOR_XRGB(231,255,255),1.0f,0);
dx = dims.lX;
dy = dims.lY;
dz = -dims.lZ;
if (dims.rgbButtons[0] & 0x80)
{
for (int i = 0; i < 6; i++)
vertices[i].color = 0xffff0000;
}
if (dims.rgbButtons[1] & 0x80)
{
for (int i = 0; i < 6; i++)
vertices[i].color = 0xff00ff00;
}
if (dims.rgbButtons[2] & 0x80)
{
for (int i = 0; i < 6; i++)
vertices[i].color = 0xff0000ff;
}

for (int i = 0; i < 6; i++)
{
vertices[i].x += dx;
vertices[i].y -= dy;
}

matWorld._43 += dz/100;
dev->SetTransform(D3DTS_WORLD, &matWorld);
dev->BeginScene();
for(int i=0;i<3;i++){dev->DrawPrimitive(D3DPT_TRIANGLELIST,i,1);}
dev->EndScene();

dev->Present(NULL,NULL,NULL,NULL);
}
if(didev!=NULL){
didev->Unacquire();
didev->Release();}
if(di!=NULL){di->Release();}
if (dev != NULL)
dev->Release();
if (d3d != NULL)
d3d->Release();
return 0;
}

LRESULT __stdcall WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CLOSE:
exit(0);
case WM_QUIT:
return 0;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}

return 0;}

 Top
Stas
Отправлено: 4 июля 2013 в 10:25
Post Id
cообщений: 14 пользователь offline

Я себе тупо скопировал твой код и запустил, всё работает (открылось окно с ромбиком, при прокрутки колеса zoom работает).

 Top
Aceton
Отправлено: 4 июля 2013 в 10:28
Post Id
cообщений: 155 администратор offline

раз у него работает, как и говорил ранее, видимо версии чего то не совпадают, или настройки проекта не те....

не работает как - вываливается с ошибкой конкретной? или просто крешится приложение?

 Top
IH63
Отправлено: 4 июля 2013 в 20:18
Post Id
cообщений: 5 пользователь offline

На колесо реагирует, но при движении мыши должен двигаться ромб, а он не двигается. Я проверял, координаты меняются

 Top
IH63
Отправлено: 4 июля 2013 в 21:47
Post Id
cообщений: 5 пользователь offline

Попробовал чуть поменять код (при прокрутке мыши изменяются координаты по х), но ромб всё так же в центре экрана. Версия JUNE 2010

 Top
Aceton
Отправлено: 5 июля 2013 в 10:44
Post Id
cообщений: 155 администратор offline

ну если координаты меняются то должно быть смещение же...может там переменные перепутаны или еще чего...получается ошибка в логике кода может?!

Обновлено: 5 июля 2013 в 10:44
 Top
Stas
Отправлено: 5 июля 2013 в 10:58
Post Id
cообщений: 14 пользователь offline

У тебя заполняется структура vertices, а далее с ней ничего не делается.
Я думаю что вот это:

код на языке С++
vb->Lock(0,sizeof(vertices),(void**)&vb_vertices,0);
memcpy(vb_vertices,vertices,sizeof(vertices));
vb->Unlock();

Нужно переместить куданибудь после dev->BeginScene();

Обновлено: 5 июля 2013 в 10:59
 Top
Stas
Отправлено: 5 июля 2013 в 12:54
Post Id
cообщений: 14 пользователь offline
Stas пишет: У тебя заполняется структура vertices, а далее с ней ничего не делается.
Я думаю что вот это:

код на языке С++
vb->Lock(0,sizeof(vertices),(void**)&vb_vertices,0);
memcpy(vb_vertices,vertices,sizeof(vertices));
vb->Unlock();

Нужно переместить куданибудь после dev->BeginScene();

А еще лучше вот такое добавить:

код на языке С++
matWorld._41 += dx;
matWorld._42 -= dy;
matWorld._43 += dz/100;
 Top
IH63
Отправлено: 5 июля 2013 в 17:34
Post Id
cообщений: 5 пользователь offline

Да, так работает, спасибо

 Top
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
 



Новые сообщения