#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <dinput.h>
#include <math.h>
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
#pragma comment (lib, "dinput8.lib")
#pragma comment (lib, "dxguid.lib")
struct CUSTOM_VERTEX
{
float X, Y, Z;
DWORD Color;
};
#define CUSTOM_VERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE)
#define PI 3.141592654f
#define FOV (float)PI / 4.0f
#define ASPECT_RATIO 4.0f / 3.0f
#define NEAR_Z 1.0f
#define FAR_Z 10000.0f
LPDIRECT3D9 D3D;
LPDIRECT3DDEVICE9 Device;
D3DDISPLAYMODE Display_Mode;
D3DPRESENT_PARAMETERS Screen;
LPDIRECTINPUT8 DI;
HWND hWnd;
MSG msg;
HINSTANCE hInstance;
int Width;
int Height;
bool Fullscreen_Enabled;
bool Running;
D3DXMATRIX View_Matrix;
D3DXMATRIX Projection_Matrix;
D3DVECTOR Camera_Position;
D3DVECTOR Camera_Angle;
LPDIRECTINPUTDEVICE8 Mouse_Device;
DIMOUSESTATE Mouse_State;
D3DXVECTOR2 Mouse;
LPDIRECTINPUTDEVICE8 Keyboard_Device;
BYTE Keyboard_State[256];
CUSTOM_VERTEX Create_Custom_Vertex();
void DirectX_Initialize();
void DirectInput_Initialize();
void DirectInput_Initialize_Mouse();
void Mouse_Controls();
void DirectInput_Initialize_Keyboard();
void DirectInput_Key_State();
void Keyboard_Controls();
void Setup_Matrices();
void Settings();
void Create_Polygon();
void Draw_Polygon();
void Render();
void Game_Loop();
void Main();
void Shutdown();
CUSTOM_VERTEX Vertex_List[3];
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void DirectX_Initialize()
{
D3D = Direct3DCreate9(D3D_SDK_VERSION);
memset(&Screen, 0, sizeof(D3DPRESENT_PARAMETERS));
if (Fullscreen_Enabled == true)
{
Display_Mode.Width = 800;
Display_Mode.Height = 600;
Display_Mode.Format = D3DFMT_R5G6B5;
Screen.Windowed = FALSE;
Screen.BackBufferCount = 1;
Screen.BackBufferWidth = Display_Mode.Width;
Screen.BackBufferHeight = Display_Mode.Height;
Screen.hDeviceWindow = hWnd;
}
else
{
D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display_Mode);
Screen.Windowed = TRUE;
}
Screen.SwapEffect = D3DSWAPEFFECT_DISCARD;
Screen.BackBufferFormat = D3DFMT_R5G6B5;
Screen.EnableAutoDepthStencil = TRUE;
Screen.AutoDepthStencilFormat = D3DFMT_D16;
D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Screen, &Device);
}
void DirectInput_Initialize()
{
DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&DI, NULL);
}
void DirectInput_Initialize_Mouse()
{
DI->CreateDevice(GUID_SysMouse, &Mouse_Device, NULL);
Mouse_Device->SetDataFormat(&c_dfDIMouse);
Mouse_Device->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
Mouse_Device->Acquire();
}
void Mouse_Controls()
{
//THIS IS WHERE I GET THE ERROR!!
//--------------------------------------------------------------------------------------------------------
Mouse_Device->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&Mouse_State);
//--------------------------------------------------------------------------------------------------------
Mouse.x += Mouse_State.lX;
Mouse.y += Mouse_State.lY;
if (Mouse.x > Width) Mouse.x = (float)Width;
if (Mouse.y < 0) Mouse.x = 0;
if (Mouse.x > Height) Mouse.y = (float)Height;
if (Mouse.y < 0) Mouse.y = 0;
Camera_Angle.x += Mouse_State.lY;
Camera_Angle.y += Mouse_State.lX;
}
void DirectInput_Initialize_Keyboard()
{
DI->CreateDevice(GUID_SysKeyboard, &Keyboard_Device, NULL);
Keyboard_Device->SetDataFormat(&c_dfDIKeyboard);
Keyboard_Device->SetCooperativeLevel(hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
Keyboard_Device->Acquire();
}
bool DirectInput_Key_State(int Key_Code)
{
Keyboard_Device->GetDeviceState(256, (LPVOID)Keyboard_State);
return Keyboard_State[Key_Code] && 0x80;
}
void Keyboard_Controls()
{
#define Camera_Speed 5;
if (DirectInput_Key_State(DIK_ESCAPE)) DestroyWindow(hWnd);
if (DirectInput_Key_State(DIK_W))
{
Camera_Position.x = Camera_Position.x - (float)sin(Camera_Angle.y * (float)PI / 180) * Camera_Speed;
Camera_Position.z = Camera_Position.z - (float)cos(Camera_Angle.y * (float)PI / 180) * Camera_Speed;
}
if (DirectInput_Key_State(DIK_S))
{
Camera_Position.x = Camera_Position.x + (float)sin(Camera_Angle.y * (float)PI / 180) * Camera_Speed;
Camera_Position.z = Camera_Position.z + (float)cos(Camera_Angle.y * (float)PI / 180) * Camera_Speed;
}
}
void Settings()
{
Device->SetRenderState(D3DRS_ZENABLE, TRUE);
Device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
Device->SetRenderState(D3DRS_LIGHTING, FALSE);
}
void Setup_Matrices()
{
D3DXMatrixLookAtRH(&View_Matrix, &D3DXVECTOR3 (Camera_Position.x, Camera_Position.y, Camera_Position.z), &D3DXVECTOR3 (Camera_Angle.x, Camera_Angle.y, Camera_Angle.z), &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));
Device->SetTransform(D3DTS_VIEW, &View_Matrix);
D3DXMatrixPerspectiveFovRH(&Projection_Matrix, FOV, ASPECT_RATIO, NEAR_Z, FAR_Z);
Device->SetTransform(D3DTS_PROJECTION, &Projection_Matrix);
}
CUSTOM_VERTEX Create_Custom_Vertex(float X, float Y, float Z, DWORD Color)
{
CUSTOM_VERTEX Vertex;
Vertex.X = X;
Vertex.Y = Y;
Vertex.Z = Z;
Vertex.Color = Color;
return Vertex;
}
void Create_Polygon()
{
Vertex_List[0] = Create_Custom_Vertex(-50.0f, 100.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
Vertex_List[1] = Create_Custom_Vertex(50.0f, 100.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
Vertex_List[2] = Create_Custom_Vertex(-50.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
Vertex_List[3] = Create_Custom_Vertex(50.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
}
void Draw_Polygon()
{
Device->SetFVF(CUSTOM_VERTEX_FORMAT);
Device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, Vertex_List, sizeof(CUSTOM_VERTEX));
}
void Render()
{
Device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
Device->BeginScene();
//Rendering code goes here
Setup_Matrices();
Create_Polygon();
Draw_Polygon();
Device->EndScene();
Device->Present(NULL, NULL, NULL, NULL);
}
void Game_Loop()
{
while (Running == true)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE) > 0)
{
if (WM_QUIT == msg.message) break;
TranslateMessage (&msg);
DispatchMessage (&msg);
}
else
Mouse_Controls();
Keyboard_Controls();
Render();
}
}
void Main()
{
Camera_Position.x = 0.0f;
Camera_Position.y = 0.0f;
Camera_Position.z = 250.0f;
DirectX_Initialize();
DirectInput_Initialize();
DirectInput_Initialize_Mouse();
DirectInput_Initialize_Keyboard();
Settings();
Setup_Matrices();
Running = true;
}
void Shutdown()
{
Running = false;
Mouse_Device->Release();
Keyboard_Device->Release();
Device->Release();
D3D->Release();
PostQuitMessage (0);
HANDLE Process;
Process = OpenProcess(PROCESS_ALL_ACCESS , true , GetCurrentProcessId());
TerminateProcess(Process , 0);
}
int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_VREDRAW|CS_HREDRAW|CS_OWNDC, WindowProcedure, 0, 0, hinstance, NULL, LoadCursor(NULL, IDC_ARROW), NULL, NULL, "DX_TUT", NULL};
RegisterClassEx(&wc);
if (MessageBox(hWnd, "Click Yes to go to fullscreen (Recommended)", "", MB_ICONQUESTION | MB_YESNO) == IDYES)
Fullscreen_Enabled = true;
if (Fullscreen_Enabled == true)
hWnd = CreateWindowEx (0, "DX_TUT", "DirectX Tutorial", WS_VISIBLE | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, 330, 250, HWND_DESKTOP, NULL, hinstance, NULL);
else
hWnd = CreateWindowEx (0, "DX_TUT", "DirectX Tutorial", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 330, 250, HWND_DESKTOP, NULL, hinstance, NULL);
hInstance = hinstance;
ShowWindow (hWnd, nCmdShow);
if (Fullscreen_Enabled == true)
{
Width = 800;
Height = 600;
}
else
{
Width = 330;
Height = 250;
}
Main();
Game_Loop();
return msg.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
Shutdown();
break;
default:
return DefWindowProc (hWnd, msg, wParam, lParam);
}
return 0;
}
C++ DirectInput Mouse Issue
I'm trying to use GetDeviceState to obtain mouse information such as mouse movement and clicks but using GetDeviceState causes the program to give me an Unhandled Exception at... error over in the first line at the sub Mouse_Controls(). The program I have when compliled is error free and warning free. Also using GetDeviceState for keyboard works ok. It's only the mouse part that pops up an error. I'm pretty much stumped but this is what I have so far. Could anyone tell me whats wrong with the mouse part of the code? Any help is appreciated.
DirectInput as a means of getting keyboard and mouse states is generally not recommended anymore (by microsoft or anyone really).
It simply creates a thread and pumps windows messages to generate the state. Something you can do in your main message handler on your own.
It simply creates a thread and pumps windows messages to generate the state. Something you can do in your main message handler on your own.
What Washu said.
As for the actual problem, what is the *exact* error you get, what line does it occur on, and are you sure your interfaces are all created? (An issue you wouldn't have with window messages...)
As for the actual problem, what is the *exact* error you get, what line does it occur on, and are you sure your interfaces are all created? (An issue you wouldn't have with window messages...)
This is where I get the error:
Mouse_Device->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&Mouse_State);
Located over in the routine Mouse_Controls() in the first line like I said. And the error I receive is this:
Everythings fine with the windows messages and interfaces.
Mouse_Device->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&Mouse_State);
Located over in the routine Mouse_Controls() in the first line like I said. And the error I receive is this:
Unhandled exception at 0x003a187c in DX Tut.exe: 0xC0000005: Access violation reading location 0x42480000.
Everythings fine with the windows messages and interfaces.
Are you sure that mouse device is created successfully? Why don't you check return values in DirectInput_Initialize(), DirectInput_Initialize_Mouse() functions? Like this:
While debugging step-by-step, you can check the values hrD and hrM.
btw, like the others said, you must not use DirectInput for neither mouse nor keyboard. Standard window message handling is better. Also, you can try raw input. Take a look at here and here.
hth.
-R
HRESULT DirectInput_Initialize()
{
HRESULT hrD = DirectInput8Create (hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)&DI, 0);
return hrD;
}
HRESULT DirectInput_Initialize_Mouse()
{
HRESULT hrM;
hrM = DI->CreateDevice (...);
if (SUCCEEDED(hrM))
{
hrM = Mouse_Device->SetDataFormat (...);
hrM = Mouse_Device->SetCooperativeLevel ( ... );
hrM = Mouse_Device->Acquire ();
}
return hrM;
}
While debugging step-by-step, you can check the values hrD and hrM.
btw, like the others said, you must not use DirectInput for neither mouse nor keyboard. Standard window message handling is better. Also, you can try raw input. Take a look at here and here.
hth.
-R
Yes I tried that and sure enough it passed:
Yet for some reason it still doesn't wanna GetDeviceState. I know I can use windows messaging to handle controls, but the only reason I'm sticking with directinput is cause I have the same programs written in C#, VB6, and VB.Net, which all work and all have a similar code structure and wanna keep it all consistant:
C# 2008 / 2010 version
VB.Net 2008 / 2010 version
VB6 Version
And as you can see it has that similar structure between all of em.
HRESULT DirectInput_Initialize()
{
HRESULT hr;
hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&DI, NULL);
return hr;
}
HRESULT DirectInput_Initialize_Mouse()
{
HRESULT hr;
hr = DI->CreateDevice(GUID_SysMouse, &Mouse_Device, NULL);
if (SUCCEEDED(hr))
{
hr = Mouse_Device->SetDataFormat(&c_dfDIMouse);
hr = Mouse_Device->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
hr = Mouse_Device->Acquire();
}
else if (FAILED(hr))
{
return 0;
}
return hr;
}
Yet for some reason it still doesn't wanna GetDeviceState. I know I can use windows messaging to handle controls, but the only reason I'm sticking with directinput is cause I have the same programs written in C#, VB6, and VB.Net, which all work and all have a similar code structure and wanna keep it all consistant:
C# 2008 / 2010 version
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX.DirectInput;
namespace DX_Tut
{
public partial class frmMain : Form
{
private const float FOV = (float)Math.PI / 4.0f;
private const float ASPECT_RATIO = 4.0f / 3.0f;
private const float NEAR_Z = 1.0f;
private const float FAR_Z = 10000.0f;
Microsoft.DirectX.Direct3D.Device Device;
DisplayMode Display_Mode;
PresentParameters Screen;
bool Fullscreen_Enabled;
bool Running;
CustomVertex.PositionColored[] Vertex_List = new CustomVertex.PositionColored[4];
Matrix View_Matrix;
Matrix Projection_Matrix;
Vector3 Camera_Position;
Vector3 Camera_Angle;
Microsoft.DirectX.DirectInput.Device Mouse_Device;
MouseState Mouse_State;
Vector2 Mouse;
Microsoft.DirectX.DirectInput.Device Keyboard_Device;
KeyboardState Keyboard_State;
public void DirectX_Initialize()
{
Screen = new PresentParameters();
if (Fullscreen_Enabled == true)
{
Display_Mode.Width = 800;
Display_Mode.Height = 600;
Display_Mode.Format = Format.R5G6B5;
Screen.Windowed = false;
Screen.BackBufferCount = 1;
Screen.BackBufferWidth = Display_Mode.Width;
Screen.BackBufferHeight = Display_Mode.Height;
}
else
{
Screen.Windowed = true;
}
Screen.SwapEffect = SwapEffect.Copy;
Screen.BackBufferFormat = Display_Mode.Format;
Screen.AutoDepthStencilFormat = DepthFormat.D16;
Screen.EnableAutoDepthStencil = true;
Device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, this.Handle, CreateFlags.SoftwareVertexProcessing, Screen);
}
void DirectInput_Initialize_Mouse()
{
Mouse_Device = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Mouse);
Mouse_Device.SetDataFormat(DeviceDataFormat.Mouse);
Mouse_Device.SetCooperativeLevel(this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
Mouse_Device.Acquire();
}
void Mouse_Controls()
{
Mouse_State = Mouse_Device.CurrentMouseState;
Mouse.X += Mouse_State.X;
Mouse.Y += Mouse_State.Y;
if (Mouse.X > this.Width) Mouse.X = this.Width;
if (Mouse.X < 0) Mouse.X = 0;
if (Mouse.Y > this.Height) Mouse.Y = this.Height;
if (Mouse.Y < 0) Mouse.Y = 0;
Camera_Angle.X += Mouse_State.Y;
Camera_Angle.Y += Mouse_State.X;
}
void DirectInput_Initialize_Keyboard()
{
Keyboard_Device = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard);
Keyboard_Device.SetDataFormat(DeviceDataFormat.Keyboard);
Keyboard_Device.SetCooperativeLevel(this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
Keyboard_Device.Acquire();
}
bool DirectInput_Key_State(Microsoft.DirectX.DirectInput.Key Key_Code)
{
Keyboard_State = Keyboard_Device.GetCurrentKeyboardState();
return Keyboard_State[Key_Code];
}
void Keyboard_Controls()
{
const int Camera_Speed = 3;
if (DirectInput_Key_State(Key.W)) //Move Forward
{
Camera_Position.X = Convert.ToSingle(Camera_Position.X - Math.Sin(Camera_Angle.Y * Math.PI / 180) * Camera_Speed);
Camera_Position.Z = Convert.ToSingle(Camera_Position.Z - Math.Cos(Camera_Angle.Y * Math.PI / 180) * Camera_Speed);
}
if (DirectInput_Key_State(Key.S)) //Move Backward
{
Camera_Position.X = Convert.ToSingle(Camera_Position.X + Math.Sin(Camera_Angle.Y * Math.PI / 180) * Camera_Speed);
Camera_Position.Z = Convert.ToSingle(Camera_Position.Z + Math.Cos(Camera_Angle.Y * Math.PI / 180) * Camera_Speed);
}
if (DirectInput_Key_State(Key.A)) //Move Left
{
Camera_Position.X = Convert.ToSingle(Camera_Position.X + Math.Cos(Camera_Angle.Y * Math.PI / 180) * Camera_Speed);
Camera_Position.Z = Convert.ToSingle(Camera_Position.Z - Math.Sin(Camera_Angle.Y * Math.PI / 180) * Camera_Speed);
}
if (DirectInput_Key_State(Key.D)) //Move Right
{
Camera_Position.X = Convert.ToSingle(Camera_Position.X - Math.Cos(Camera_Angle.Y * Math.PI / 180) * Camera_Speed);
Camera_Position.Z = Convert.ToSingle(Camera_Position.Z + Math.Sin(Camera_Angle.Y * Math.PI / 180) * Camera_Speed);
}
if (DirectInput_Key_State(Key.Q)) //Look Left
Camera_Angle.Y -= 1;
if (DirectInput_Key_State(Key.E)) //Look Right
Camera_Angle.Y += 1;
if (DirectInput_Key_State(Key.R)) //Look Up
Camera_Angle.X -= 1;
if (DirectInput_Key_State(Key.F)) //Look Down
Camera_Angle.X += 1;
if (DirectInput_Key_State(Key.C)) //Move Up
Camera_Position.Y -= Camera_Speed;
if (DirectInput_Key_State(Key.Z)) //Move Down
Camera_Position.Y += Camera_Speed;
}
void Settings()
{
Device.SetRenderState(RenderStates.ZEnable, true);
Device.SetRenderState(RenderStates.ZBufferWriteEnable, true);
Device.SetRenderState(RenderStates.CullMode, (int)Cull.None);
Device.SetRenderState(RenderStates.Lighting, false);
}
void Setup_Matrices()
{
View_Matrix = Matrix.LookAtRH(Create_Vertex(Camera_Position.X, Camera_Position.Y, Camera_Position.Z), Create_Vertex(0, 0, 0), Create_Vertex(0, 1, 0));
Device.Transform.View = View_Matrix;
Projection_Matrix = Matrix.PerspectiveFovRH(FOV, ASPECT_RATIO, NEAR_Z, FAR_Z);
Device.Transform.Projection = Projection_Matrix;
}
Vector3 Create_Vertex(float X, float Y, float Z)
{
Vector3 Vertex;
Vertex.X = X;
Vertex.Y = Y;
Vertex.Z = Z;
return Vertex;
}
CustomVertex.PositionColored Create_Custom_Vertex(float X, float Y, float Z, int Color)
{
CustomVertex.PositionColored Vertex = new CustomVertex.PositionColored();
Vertex.Position = new Vector3(X, Y, Z);
Vertex.Color = Color;
return Vertex;
}
void Reset_Device()
{
if (this.WindowState != FormWindowState.Minimized && Fullscreen_Enabled == false)
{
Running = false;
Device.Reset(Screen);
Settings();
Setup_Matrices();
Application.DoEvents();
Running = true;
}
}
void Camera_Control()
{
Matrix Camera_Translation_Matrix;
Matrix Camera_Angle_Matrix_X;
Matrix Camera_Angle_Matrix_Y;
View_Matrix = Matrix.Identity;
Camera_Translation_Matrix = Matrix.Identity;
Camera_Translation_Matrix = Matrix.Translation(Camera_Position.X, Camera_Position.Y, -Camera_Position.Z);
View_Matrix = Matrix.Multiply(View_Matrix, Camera_Translation_Matrix);
Camera_Angle_Matrix_Y = Matrix.RotationY((Convert.ToSingle(Math.PI) * Camera_Angle.Y) / 180);
View_Matrix = Matrix.Multiply(View_Matrix, Camera_Angle_Matrix_Y);
Camera_Angle_Matrix_X = Matrix.RotationX((Convert.ToSingle(Math.PI) * Camera_Angle.X) / 180);
View_Matrix = Matrix.Multiply(View_Matrix, Camera_Angle_Matrix_X);
Device.Transform.View = View_Matrix;
}
void Create_Polygon()
{
Vertex_List[0] = Create_Custom_Vertex(-50, 100, 0, Color.FromArgb(255, 255, 255).ToArgb());
Vertex_List[1] = Create_Custom_Vertex(50, 100, 0, Color.FromArgb(255, 255, 255).ToArgb());
Vertex_List[2] = Create_Custom_Vertex(-50, 0, 0, Color.FromArgb(255, 255, 255).ToArgb());
Vertex_List[3] = Create_Custom_Vertex(50, 0, 0, Color.FromArgb(255, 255, 255).ToArgb());
}
void Draw_Polygon()
{
Device.VertexFormat = CustomVertex.PositionColored.Format;
Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, Vertex_List);
}
void Create_Platform()
{
Vertex_List[0] = Create_Custom_Vertex(-1000, 0, -1000, Color.FromArgb(255, 0, 0).ToArgb());
Vertex_List[1] = Create_Custom_Vertex(1000, 0, -1000, Color.FromArgb(0, 255, 0).ToArgb());
Vertex_List[2] = Create_Custom_Vertex(-1000, 0, 1000, Color.FromArgb(0, 0, 255).ToArgb());
Vertex_List[3] = Create_Custom_Vertex(1000, 0, 1000, Color.FromArgb(255, 0, 255).ToArgb());
}
public void Render()
{
Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.FromArgb(0, 0, 0), 1.0f, 0);
Device.BeginScene();
Create_Platform();
Draw_Polygon();
Create_Polygon();
Draw_Polygon();
Device.EndScene();
Device.Present();
}
public void Game_Loop()
{
do
{
Mouse_Controls();
Keyboard_Controls();
Camera_Control();
Render();
if (DirectInput_Key_State(Key.Escape)) Shutdown();
Application.DoEvents();
} while (Running == true);
}
public void Main()
{
if (MessageBox.Show("Click Yes to go to fullscreen (Recommended)", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
Fullscreen_Enabled = true;
this.Show();
this.KeyPreview = true;
this.Width = 330;
this.Height = 250;
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
this.Text = "DirectX Tutorial";
if (Fullscreen_Enabled == true)
this.FormBorderStyle = FormBorderStyle.None;
Camera_Position.X = 0;
Camera_Position.Y = -50;
Camera_Position.Z = 250;
DirectX_Initialize();
Settings();
DirectInput_Initialize_Mouse();
DirectInput_Initialize_Keyboard();
Setup_Matrices();
Running = true;
}
public void Shutdown()
{
Running = false;
Mouse_Device.Dispose();
Keyboard_Device.Dispose();
Device.Dispose();
Application.Exit();
}
public frmMain()
{
InitializeComponent();
}
private void frmMain_Load(object sender, EventArgs e)
{
Main();
}
private void frmMain_Paint(object sender, PaintEventArgs e)
{
Game_Loop();
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
Shutdown();
}
private void frmMain_Resize(object sender, EventArgs e)
{
Reset_Device();
}
}
}
VB.Net 2008 / 2010 version
Option Explicit On
Option Strict On
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX.DirectInput
Public Class frmMain
Private Const FOV As Single = Math.PI / 4
Private Const ASPECT_RATIO As Single = 4 / 3
Private Const NEAR_Z As Single = 1
Private Const FAR_Z As Single = 10000
Private Device As Direct3D.Device
Private Display_Mode As DisplayMode
Private Screen As New PresentParameters
Private Fullscreen_Enabled As Boolean
Private Running As Boolean
Private Vertex_List(5) As CustomVertex.PositionColored
Private View_Matrix As Matrix
Private Projection_Matrix As Matrix
Private Camera_Position As Vector3
Private Camera_Angle As Vector3
Private Mouse_Device As DirectInput.Device
Private Mouse_State As MouseState
Private Mouse As Vector2
Private Keyboard_Device As DirectInput.Device
Private Keyboard_State As KeyboardState
Private Sub DirectX_Initialize()
If Fullscreen_Enabled = True Then
Display_Mode.Width = 800
Display_Mode.Height = 600
Display_Mode.Format = Direct3D.Format.R5G6B5
Screen.Windowed = False
Screen.BackBufferCount = 1
Screen.BackBufferWidth = Display_Mode.Width
Screen.BackBufferHeight = Display_Mode.Height
Else
Screen.Windowed = True
End If
Screen.SwapEffect = SwapEffect.Copy
Screen.BackBufferFormat = Display_Mode.Format
Screen.AutoDepthStencilFormat = DepthFormat.D16
Screen.EnableAutoDepthStencil = True
Device = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Me.Handle, CreateFlags.SoftwareVertexProcessing, Screen)
End Sub
Private Sub DirectInput_Initialize_Mouse()
Mouse_Device = New DirectInput.Device(SystemGuid.Mouse)
Mouse_Device.SetDataFormat(DeviceDataFormat.Mouse)
Mouse_Device.SetCooperativeLevel(Me, CooperativeLevelFlags.Background Or CooperativeLevelFlags.NonExclusive)
Mouse_Device.Acquire()
End Sub
Private Sub Mouse_Controls()
Mouse_State = Mouse_Device.CurrentMouseState
Mouse.X = Mouse.X + Mouse_State.X
Mouse.Y = Mouse.Y + Mouse_State.Y
If Mouse.X > Me.Width Then Mouse.X = Me.Width
If Mouse.X < 0 Then Mouse.X = 0
If Mouse.Y > Me.Height Then Mouse.Y = Me.Height
If Mouse.Y < 0 Then Mouse.Y = 0
Camera_Angle.X = Camera_Angle.X + Mouse_State.Y
Camera_Angle.Y = Camera_Angle.Y + Mouse_State.X
End Sub
Private Sub DirectInput_Initialize_Keyboard()
Keyboard_Device = New DirectInput.Device(SystemGuid.Keyboard)
Keyboard_Device.SetDataFormat(DeviceDataFormat.Keyboard)
Keyboard_Device.SetCooperativeLevel(Me, CooperativeLevelFlags.Background Or CooperativeLevelFlags.NonExclusive)
Keyboard_Device.Acquire()
End Sub
Private Function DirectInput_Key_State(ByVal Key_Code As DirectInput.Key) As Boolean
Keyboard_State = Keyboard_Device.GetCurrentKeyboardState
Return Keyboard_State.Item(Key_Code)
End Function
Private Sub Keyboard_Controls()
Const Camera_Speed As Long = 3
If DirectInput_Key_State(Key.W) Then 'Move Forward
Camera_Position.X = Convert.ToSingle(Camera_Position.X - Math.Sin(Camera_Angle.Y * Math.PI / 180) * Camera_Speed)
Camera_Position.Z = Convert.ToSingle(Camera_Position.Z - Math.Cos(Camera_Angle.Y * Math.PI / 180) * Camera_Speed)
End If
If DirectInput_Key_State(Key.S) Then 'Move Backward
Camera_Position.X = Convert.ToSingle(Camera_Position.X + Math.Sin(Camera_Angle.Y * Math.PI / 180) * Camera_Speed)
Camera_Position.Z = Convert.ToSingle(Camera_Position.Z + Math.Cos(Camera_Angle.Y * Math.PI / 180) * Camera_Speed)
End If
If DirectInput_Key_State(Key.A) Then 'Move Left
Camera_Position.X = Convert.ToSingle(Camera_Position.X + Math.Cos(Camera_Angle.Y * Math.PI / 180) * Camera_Speed)
Camera_Position.Z = Convert.ToSingle(Camera_Position.Z - Math.Sin(Camera_Angle.Y * Math.PI / 180) * Camera_Speed)
End If
If DirectInput_Key_State(Key.D) Then 'Move Right
Camera_Position.X = Convert.ToSingle(Camera_Position.X - Math.Cos(Camera_Angle.Y * Math.PI / 180) * Camera_Speed)
Camera_Position.Z = Convert.ToSingle(Camera_Position.Z + Math.Sin(Camera_Angle.Y * Math.PI / 180) * Camera_Speed)
End If
If DirectInput_Key_State(Key.Q) Then 'Look Left
Camera_Angle.Y = Camera_Angle.Y - 1
End If
If DirectInput_Key_State(Key.E) Then 'Look Right
Camera_Angle.Y = Camera_Angle.Y + 1
End If
If DirectInput_Key_State(Key.R) Then 'Look Up
Camera_Angle.X = Camera_Angle.X - 1
End If
If DirectInput_Key_State(Key.F) Then 'Look Down
Camera_Angle.X = Camera_Angle.X + 1
End If
If DirectInput_Key_State(Key.C) Then 'Move Up
Camera_Position.Y = Camera_Position.Y - Camera_Speed
End If
If DirectInput_Key_State(Key.Z) Then 'Move Down
Camera_Position.Y = Camera_Position.Y + Camera_Speed
End If
End Sub
Private Sub Settings()
Device.SetRenderState(RenderStates.ZEnable, True)
Device.SetRenderState(RenderStates.ZBufferWriteEnable, True)
Device.SetRenderState(RenderStates.CullMode, Cull.None)
Device.SetRenderState(RenderStates.Lighting, False)
End Sub
Private Sub Reset_Device()
If Me.WindowState <> FormWindowState.Minimized And Fullscreen_Enabled = False Then
Running = False
Device.Reset(Screen)
Settings()
Setup_Matrices()
Application.DoEvents()
Running = True
End If
End Sub
Private Function Create_Vertex(ByVal X As Single, ByVal Y As Single, ByVal Z As Single) As Vector3
Dim Vertex As Vector3
Vertex.X = X
Vertex.Y = Y
Vertex.Z = Z
Return Vertex
End Function
Private Function Create_Custom_Vertex(ByVal X As Single, ByVal Y As Single, ByVal Z As Single, ByVal Color As Integer) As CustomVertex.PositionColored
Dim Vertex As CustomVertex.PositionColored = New CustomVertex.PositionColored
Vertex.Position = New Vector3(X, Y, Z)
Vertex.Color = Color
Return Vertex
End Function
Private Sub Setup_Matrices()
View_Matrix = Matrix.LookAtRH(Create_Vertex(Camera_Position.X, Camera_Position.Y, Camera_Position.Z), Create_Vertex(0, 0, 0), Create_Vertex(0, 1, 0))
Device.Transform.View = View_Matrix
Projection_Matrix = Matrix.PerspectiveFovRH(FOV, ASPECT_RATIO, NEAR_Z, FAR_Z)
Device.Transform.Projection = Projection_Matrix
End Sub
Private Sub Camera_Control()
Dim Camera_Translation_Matrix As Matrix
Dim Camera_Angle_Matrix_X As Matrix
Dim Camera_Angle_Matrix_Y As Matrix
View_Matrix = Matrix.Identity
Camera_Translation_Matrix = Matrix.Identity
Camera_Translation_Matrix = Matrix.Translation(Camera_Position.X, Camera_Position.Y, -Camera_Position.Z)
View_Matrix = Matrix.Multiply(View_Matrix, Camera_Translation_Matrix)
Camera_Angle_Matrix_Y = Matrix.RotationY((Convert.ToSingle(Math.PI) * Camera_Angle.Y) / 180)
View_Matrix = Matrix.Multiply(View_Matrix, Camera_Angle_Matrix_Y)
Camera_Angle_Matrix_X = Matrix.RotationX((Convert.ToSingle(Math.PI) * Camera_Angle.X) / 180)
View_Matrix = Matrix.Multiply(View_Matrix, Camera_Angle_Matrix_X)
Device.Transform.View = View_Matrix
End Sub
Private Sub Create_Polygon()
Vertex_List(0) = Create_Custom_Vertex(-50, 100, 0, Color.FromArgb(255, 255, 255).ToArgb)
Vertex_List(1) = Create_Custom_Vertex(50, 100, 0, Color.FromArgb(255, 255, 255).ToArgb)
Vertex_List(2) = Create_Custom_Vertex(-50, 0, 0, Color.FromArgb(255, 255, 255).ToArgb)
Vertex_List(3) = Create_Custom_Vertex(50, 0, 0, Color.FromArgb(255, 255, 255).ToArgb)
End Sub
Private Sub Draw_Polygon()
Device.VertexFormat = CustomVertex.PositionColored.Format
Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, Vertex_List)
End Sub
Private Sub Create_Platform()
Vertex_List(0) = Create_Custom_Vertex(-1000, 0, -1000, Color.FromArgb(255, 0, 0).ToArgb)
Vertex_List(1) = Create_Custom_Vertex(1000, 0, -1000, Color.FromArgb(0, 255, 0).ToArgb)
Vertex_List(2) = Create_Custom_Vertex(-1000, 0, 1000, Color.FromArgb(0, 0, 255).ToArgb)
Vertex_List(3) = Create_Custom_Vertex(1000, 0, 1000, Color.FromArgb(255, 0, 255).ToArgb)
End Sub
Private Sub Render()
Device.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, Color.FromArgb(255, 0, 0, 0), 1, 0)
Device.BeginScene()
Create_Polygon()
Draw_Polygon()
Create_Platform()
Draw_Polygon()
Device.EndScene()
Device.Present()
End Sub
Private Sub Game_Loop()
Do While Running = True
Mouse_Controls()
Keyboard_Controls()
Camera_Control()
Render()
If DirectInput_Key_State(Key.Escape) Then Shutdown()
Application.DoEvents()
Loop
End Sub
Private Sub Main()
If MessageBox.Show("Click Yes to go to fullscreen (Recommended)", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
Fullscreen_Enabled = True
End If
With Me
.Show()
.Width = 330
.Height = 250
.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque, True)
.Text = "DirectX Tutorial"
If Fullscreen_Enabled = True Then .FormBorderStyle = Windows.Forms.FormBorderStyle.None
End With
Camera_Position.X = 0
Camera_Position.Y = -50
Camera_Position.Z = 250
DirectX_Initialize()
DirectInput_Initialize_Mouse()
DirectInput_Initialize_Keyboard()
Settings()
Setup_Matrices()
Running = True
End Sub
Private Sub Shutdown()
Running = False
Mouse_Device.Dispose()
Keyboard_Device.Dispose()
Device.Dispose()
Application.Exit()
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Main()
End Sub
Private Sub frmMain_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
Shutdown()
End Sub
Private Sub frmMain_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Game_Loop()
End Sub
Private Sub frmMain_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize
Reset_Device()
End Sub
End Class
VB6 Version
Option Explicit
Private Type CUSTOM_VERTEX
X As Single
Y As Single
Z As Single
Color As Long
End Type
Private Const CUSTOM_VERTEX_FORMAT As Long = D3DFVF_XYZ Or D3DFVF_DIFFUSE
Private Const PI As Single = 3.141592654
Private Const FOV As Single = PI / 4
Private Const ASPECT_RATIO As Single = 3 / 4
Private Const NEAR_Z As Single = 1
Private Const FAR_Z As Single = 10000
Private DX As DirectX8
Private D3D As Direct3D8
Private Device As Direct3DDevice8
Private Display_Mode As D3DDISPLAYMODE
Private Screen As D3DPRESENT_PARAMETERS
Private DI As DirectInput8
Private Keyboard_Device As DirectInputDevice8
Private Keyboard_State As DIKEYBOARDSTATE
Private Mouse_Device As DirectInputDevice8
Private Mouse_State As DIMOUSESTATE
Private Mouse As D3DVECTOR2
Private Fullscreen_Enabled As Boolean
Private Running As Boolean
Private Vertex_List(3) As CUSTOM_VERTEX
Private View_Matrix As D3DMATRIX
Private Projection_Matrix As D3DMATRIX
Private Camera_Position As D3DVECTOR
Private Camera_Angle As D3DVECTOR
Private Sub DirectX_Initialize()
Set DX = New DirectX8
Set D3D = DX.Direct3DCreate()
If Fullscreen_Enabled = True Then
Display_Mode.Width = 800
Display_Mode.Height = 600
Display_Mode.Format = D3DFMT_R5G6B5
Screen.Windowed = False
Screen.BackBufferCount = 1
Screen.BackBufferWidth = Display_Mode.Width
Screen.BackBufferHeight = Display_Mode.Height
Screen.hDeviceWindow = frmMain.hWnd
Else
D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Display_Mode
Screen.Windowed = True
End If
Screen.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC
Screen.BackBufferFormat = Display_Mode.Format
Screen.AutoDepthStencilFormat = D3DFMT_D16
Screen.EnableAutoDepthStencil = 1
Set Device = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, Screen)
End Sub
Private Sub DirectInput_Initialize_Mouse(Window As Form)
Set DI = DX.DirectInputCreate
Set Mouse_Device = DI.CreateDevice("GUID_SYSMOUSE")
Mouse_Device.SetCommonDataFormat DIFORMAT_MOUSE
Mouse_Device.SetCooperativeLevel Window.hWnd, DISCL_FOREGROUND Or DISCL_EXCLUSIVE
Mouse_Device.Acquire
End Sub
Private Sub Mouse_Controls()
Mouse_Device.GetDeviceStateMouse Mouse_State
Mouse.X = Mouse.X + Mouse_State.lX
Mouse.Y = Mouse.Y + Mouse_State.lY
If Mouse.X > frmMain.ScaleWidth Then Mouse.X = frmMain.ScaleWidth
If Mouse.X < 0 Then Mouse.X = 0
If Mouse.Y > frmMain.ScaleHeight Then Mouse.Y = frmMain.ScaleHeight
If Mouse.Y < 0 Then Mouse.Y = 0
Camera_Angle.X = Camera_Angle.X + Mouse_State.lY
Camera_Angle.Y = Camera_Angle.Y + Mouse_State.lX
End Sub
Private Sub DirectInput_Initialize_Keyboard(Window As Form)
Set DI = DX.DirectInputCreate
Set Keyboard_Device = DI.CreateDevice("GUID_SysKeyboard")
Keyboard_Device.SetCommonDataFormat DIFORMAT_KEYBOARD
Keyboard_Device.SetCooperativeLevel Window.hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
Keyboard_Device.Acquire
End Sub
Private Function DirectInput_Key_State(Key_Code As Long) As Long
Keyboard_Device.GetDeviceStateKeyboard Keyboard_State
DirectInput_Key_State = Keyboard_State.Key(Key_Code)
End Function
Private Sub Keyboard_Controls()
Const Camera_Speed As Long = 3
If DirectInput_Key_State(DIK_W) Then 'Move Forward
Camera_Position.X = Camera_Position.X - Sin(Camera_Angle.Y * PI / 180) * Camera_Speed
Camera_Position.Z = Camera_Position.Z - Cos(Camera_Angle.Y * PI / 180) * Camera_Speed
End If
If DirectInput_Key_State(DIK_S) Then 'Move Backward
Camera_Position.X = Camera_Position.X + Sin(Camera_Angle.Y * PI / 180) * Camera_Speed
Camera_Position.Z = Camera_Position.Z + Cos(Camera_Angle.Y * PI / 180) * Camera_Speed
End If
If DirectInput_Key_State(DIK_A) Then 'Move Left
Camera_Position.X = Camera_Position.X + Cos(Camera_Angle.Y * PI / 180) * Camera_Speed
Camera_Position.Z = Camera_Position.Z - Sin(Camera_Angle.Y * PI / 180) * Camera_Speed
End If
If DirectInput_Key_State(DIK_D) Then 'Move Right
Camera_Position.X = Camera_Position.X - Cos(Camera_Angle.Y * PI / 180) * Camera_Speed
Camera_Position.Z = Camera_Position.Z + Sin(Camera_Angle.Y * PI / 180) * Camera_Speed
End If
If DirectInput_Key_State(DIK_Q) Then 'Look Left
Camera_Angle.Y = Camera_Angle.Y - 1
End If
If DirectInput_Key_State(DIK_E) Then 'Look Right
Camera_Angle.Y = Camera_Angle.Y + 1
End If
If DirectInput_Key_State(DIK_R) Then 'Look Up
Camera_Angle.X = Camera_Angle.X - 1
End If
If DirectInput_Key_State(DIK_F) Then 'Look Down
Camera_Angle.X = Camera_Angle.X + 1
End If
If DirectInput_Key_State(DIK_C) Then 'Move Up
Camera_Position.Y = Camera_Position.Y - Camera_Speed
End If
If DirectInput_Key_State(DIK_Z) Then 'Move Down
Camera_Position.Y = Camera_Position.Y + Camera_Speed
End If
End Sub
Private Sub Settings()
Device.SetRenderState D3DRS_ZENABLE, D3DZB_TRUE
Device.SetRenderState D3DRS_ZWRITEENABLE, 1
Device.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE
Device.SetRenderState D3DRS_LIGHTING, 0
End Sub
Private Function Create_Vertex(X As Single, Y As Single, Z As Single) As D3DVECTOR
Create_Vertex.X = X
Create_Vertex.Y = Y
Create_Vertex.Z = Z
End Function
Private Function Create_Custom_Vertex(ByVal X As Single, ByVal Y As Single, ByVal Z As Single, ByVal Color As Long) As CUSTOM_VERTEX
Create_Custom_Vertex.X = X
Create_Custom_Vertex.Y = Y
Create_Custom_Vertex.Z = Z
Create_Custom_Vertex.Color = Color
End Function
Private Sub Setup_Matrices()
D3DXMatrixLookAtRH View_Matrix, Create_Vertex(Camera_Position.X, Camera_Position.Y, Camera_Position.Z), Create_Vertex(0, 0, 0), Create_Vertex(0, 1, 0)
Device.SetTransform D3DTS_VIEW, View_Matrix
D3DXMatrixPerspectiveFovRH Projection_Matrix, FOV, ASPECT_RATIO, NEAR_Z, FAR_Z
Device.SetTransform D3DTS_PROJECTION, Projection_Matrix
End Sub
Public Sub Camera_Control()
Dim Camera_Translation_Matrix As D3DMATRIX
Dim Camera_Angle_Matrix_X As D3DMATRIX
Dim Camera_Angle_Matrix_Y As D3DMATRIX
D3DXMatrixIdentity View_Matrix
D3DXMatrixIdentity Camera_Translation_Matrix
D3DXMatrixTranslation Camera_Translation_Matrix, Camera_Position.X, Camera_Position.Y, -Camera_Position.Z
D3DXMatrixMultiply View_Matrix, View_Matrix, Camera_Translation_Matrix
D3DXMatrixRotationY Camera_Angle_Matrix_Y, (PI * Camera_Angle.Y) / 180
D3DXMatrixMultiply View_Matrix, View_Matrix, Camera_Angle_Matrix_Y
D3DXMatrixRotationX Camera_Angle_Matrix_X, (PI * Camera_Angle.X) / 180
D3DXMatrixMultiply View_Matrix, View_Matrix, Camera_Angle_Matrix_X
Device.SetTransform D3DTS_VIEW, View_Matrix
End Sub
Private Sub Create_Polygon()
Vertex_List(0) = Create_Custom_Vertex(-50, 100, 0, D3DColorXRGB(255, 255, 255))
Vertex_List(1) = Create_Custom_Vertex(50, 100, 0, D3DColorXRGB(255, 255, 255))
Vertex_List(2) = Create_Custom_Vertex(-50, 0, 0, D3DColorXRGB(255, 255, 255))
Vertex_List(3) = Create_Custom_Vertex(50, 0, 0, D3DColorXRGB(255, 255, 255))
End Sub
Private Sub Create_Platform()
Vertex_List(0) = Create_Custom_Vertex(-1000, 0, -1000, D3DColorXRGB(255, 0, 0))
Vertex_List(1) = Create_Custom_Vertex(1000, 0, -1000, D3DColorXRGB(0, 255, 0))
Vertex_List(2) = Create_Custom_Vertex(-1000, 0, 1000, D3DColorXRGB(0, 0, 255))
Vertex_List(3) = Create_Custom_Vertex(1000, 0, 1000, D3DColorXRGB(255, 0, 255))
End Sub
Private Sub Draw_Polygon()
Device.SetVertexShader CUSTOM_VERTEX_FORMAT
Device.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Vertex_List(0), Len(Vertex_List(0))
End Sub
Private Sub Render()
Device.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, D3DColorXRGB(0, 0, 0), 1#, 0
Device.BeginScene
'Rendering code goes here
Create_Platform
Draw_Polygon
Create_Polygon
Draw_Polygon
Device.EndScene
Device.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub
Private Sub Game_Loop()
Do While Running = True
Mouse_Controls
Keyboard_Controls
Camera_Control
Render
If DirectInput_Key_State(DIK_ESCAPE) <> 0 Then Shutdown
DoEvents
Loop
End Sub
Private Sub Main()
If MsgBox("Click Yes to go to fullscreen (Recommended)", vbQuestion Or vbYesNo, "Options") = vbYes Then Fullscreen_Enabled = True
With Me
If Fullscreen_Enabled = True Then .BorderStyle = vbBSNone
.Show
.Caption = "DirectX Tutorial"
End With
Camera_Position.X = 0
Camera_Position.Y = -50
Camera_Position.Z = 250
DirectX_Initialize
Settings
DirectInput_Initialize_Mouse frmMain
DirectInput_Initialize_Keyboard frmMain
Setup_Matrices
Running = True
Game_Loop
End Sub
Private Sub Shutdown()
Running = False
Set Mouse_Device = Nothing
Set Keyboard_Device = Nothing
Set DI = Nothing
Set Device = Nothing
Set D3D = Nothing
Set DX = Nothing
Unload Me
End Sub
Private Sub Form_Load()
Main
End Sub
Private Sub Form_Unload(Cancel As Integer)
Shutdown
End Sub
And as you can see it has that similar structure between all of em.
This is where I get the error:
Mouse_Device->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&Mouse_State);
Located over in the routine Mouse_Controls() in the first line like I said. And the error I receive is this:
Unhandled exception at 0x003a187c in DX Tut.exe: 0xC0000005: Access violation reading location 0x42480000.
Everythings fine with the windows messages and interfaces.
I would assume that
Mouse_Device is null
[quote name='Psychopathetica' timestamp='1329695499' post='4914662']
This is where I get the error:
Mouse_Device->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&Mouse_State);
Located over in the routine Mouse_Controls() in the first line like I said. And the error I receive is this:
Unhandled exception at 0x003a187c in DX Tut.exe: 0xC0000005: Access violation reading location 0x42480000.
Everythings fine with the windows messages and interfaces.
I would assume that
Mouse_Device is null
[/quote]If it was null, then it'd be an access violation reading 0x00000000. 0x4xxxxxxx looks a bit suspicious for a pointer value, particularly since the low 16 bits are all 0 (Which is perfectly valid, but it's suspicious).
@OP: What does the debugger tell you on that line? What are the values of Mouse_Device and &Mouse_State? Are you sure that Mouse_Device hasn't been Release()d already?
So long as you're not even thinking of using the mouse input for ever doing GUI-style input then it's not too bad. But if you're going to ever display a cursor on-screen, then you *really, really, REALLY* need to ditch DirectInput or else you'll annoy the hell out of your users (Google pointer ballistics and you'll see what I mean - DirectInput has none, "Normal" mouse input does).
I know I can use windows messaging to handle controls, but the only reason I'm sticking with directinput is cause I have the same programs written in C#, VB6, and VB.Net, which all work and all have a similar code structure and wanna keep it all consistant
The reason 0x42480000 looks suspicious is that it's the integer representation of 50.0f.
If you search the code you'll see that 50.0f is used initializing the Vertex_List array in the Create_Polygon() function.
A quick inspection of the array declaration says you're going off the end of the array:
If you search the code you'll see that 50.0f is used initializing the Vertex_List array in the Create_Polygon() function.
A quick inspection of the array declaration says you're going off the end of the array:
CUSTOM_VERTEX Vertex_List[3];
void Create_Polygon()
{
Vertex_List[0] = Create_Custom_Vertex(-50.0f, 100.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
Vertex_List[1] = Create_Custom_Vertex(50.0f, 100.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
Vertex_List[2] = Create_Custom_Vertex(-50.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
Vertex_List[3] = Create_Custom_Vertex(50.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
}
The reason 0x42480000 looks suspicious is that it's the integer representation of 50.0f.
If you search the code you'll see that 50.0f is used initializing the Vertex_List array in the Create_Polygon() function.
A quick inspection of the array declaration says you're going off the end of the array:
CUSTOM_VERTEX Vertex_List[3];
void Create_Polygon()
{
Vertex_List[0] = Create_Custom_Vertex(-50.0f, 100.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
Vertex_List[1] = Create_Custom_Vertex(50.0f, 100.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
Vertex_List[2] = Create_Custom_Vertex(-50.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
Vertex_List[3] = Create_Custom_Vertex(50.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255));
}
Wow you were right! I changed it to CUSTOM_VERTEX Vertex_List[4]; and the Mouse part worked! Thank you so much. Problem solved
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement