Как мне сделать управление движением клавиатуры ASWD?C#

Место общения программистов C#
Ответить
Anonymous
 Как мне сделать управление движением клавиатуры ASWD?

Сообщение Anonymous »

Я начал изучать некоторые базовые методы Microsoft.DirectX 3D и столкнулся с проблемой, которая оказалась для меня слишком сложной. Я создал 3D-сцену, камеру, освещение и т. д., нарисовав несколько простых 3D-объектов. Сейчас я хочу сделать простое трехмерное вращение этих объектов вокруг всех трех осей. Для этого я хочу использовать клавиши со стрелками и ASWD, как это делается в компьютерных играх. Для этого я использовал обработчики событий OnKeyDown и OnKeyUp:#region - Event handler -
protected override void OnKeyDown(KeyEventArgs e)
{

base.OnKeyDown(e);

#region - speed -
if(e.KeyValue == (char)Keys.Add || e.KeyValue == (char)Keys.Oemplus)
step_p = true;
if(e.KeyValue == (char)Keys.Subtract || e.KeyValue == (char)Keys.OemMinus)
step_m = true;

if(step_p)
step++;
if(step_m)
step--;

if(step==0)
step = 1;
#endregion

#region - rotation -
if(e.KeyCode == Keys.Left)
{
left = true;
}
if(e.KeyCode == Keys.Right)
{
right = true;
}
if(e.KeyCode == Keys.Up)
{
up = true;
}
if(e.KeyCode == Keys.Down)
{
down = true;
}

if(e.KeyCode == Keys.A)
{
a = true;
}
if(e.KeyCode == Keys.D)
{
d = true;
}

if(left)
angleZ_D+=step;
if(right)
angleZ_D-=step;
if(up)
angleX_D-=step;
if(down)
angleX_D+=step;
if(a)
angleY_D+=step;
if(d)
angleY_D-=step;

//
//
//
if(angleX_D == 360)
angleX_D = 0;
if(angleY_D >= 360)
angleY_D = 0;
if(angleZ_D >= 360)
angleZ_D = 0;

angleX_R = angleX_D * rad;
angleY_R = angleY_D * rad;
angleZ_R = angleZ_D * rad;
//
//
//
#endregion

#region - zoom -
if(e.KeyValue == (char)Keys.W)
{
w = true;
}
if(e.KeyValue == (char)Keys.S)
{
s = true;
}

if(w)
{
zoom+=0.1f * step;

if(zoom>10.0f) zoom=10.0f;
}

if(s)
{

zoom-=0.1f * step;

if(zoom
Есть ли решение для такой проблемы в C# 4.0 и .Net framework 2.0
Согласно

Цитата:
Вы в зависимости от того, как клавиатура повторяет клавишу при удерживании.
Это перестает работать, как только вы нажимаете другую клавишу.
Вместо этого вам нужно использовать таймер и в обработчике событий Tick
проверить, в какую сторону вы хотите переехать. Теперь повторение клавиш больше не имеет значения.
Установите для свойства Interval таймера значение 15 или 31, чтобы добиться хорошей согласованности. – Ханс Пассант

это решение проблемы:
using System;
using System.Windows.Forms;

namespace WASD_keyboard_game_control
{
public partial class MainForm : Form
{

//
// Global variables declaration
//

//
// Timer
//
// Implements a timer that
// raises event at user defined interval
//
Timer Clock;

//
// Set Timer tick Interval in miliseconds
//
// By changing value of Interval,
// we control how often the timer tick event handler is raised
// and eventually the call frequency of Main_Function()
//
const int Interval = 15;

//
// Variables for counting the number
// of times that program has confirmed
// the key down state of AWSD keys
//
int W = 0;
int A = 0;
int S = 0;
int D = 0;

//
// Variables ( flags ) for memorizing
// the key down state of AWSD keys
//
// true - key is down ( pressed )
//
// false - key is up ( released )
//
//
bool w = false;
bool a = false;
bool s = false;
bool d = false;

//
//
//

public MainForm()
{
//
// The InitializeComponent() call is required
// for Windows Forms designer support.
//
InitializeComponent();

//
// Call Initialize_Timer() function
//
Initialize_Timer();
}

void Initialize_Timer()
{
// Create new timer
Clock = new Timer();

// Set timer tick interval in miliseconds
//
// By changing value of interval,
// we control how often the timer tick event handler is raised
// and eventually the call frequency of Main_Function()
//
Clock.Interval = Interval;

//
// Add timer tick event handler
//
// This event handler is raised
// every time timer make tick
//
// The smaler value for timer interval,
// more often the event handler is raised
//
Clock.Tick += new System.EventHandler(this.ClockTick);

//
// Start timer
//
Clock.Start();
}

void ClockTick(object sender, EventArgs e)
{
//
// Timer tick event handler
//

//
// Call Main_Function()
//
Main_Function();

//
//
//
}

protected override void OnKeyDown(KeyEventArgs e)
{
//
// This event handler is raised every time
// some key on the keyboard is first pressed
//

base.OnKeyDown(e);

//
// Set corresponding key down flag state to true
//

if(e.KeyCode == Keys.W)
w = true;
if(e.KeyCode == Keys.A)
a = true;
if(e.KeyCode == Keys.S)
s = true;
if(e.KeyCode == Keys.D)
d = true;
}

protected override void OnKeyUp(KeyEventArgs e)
{
//
// This event handler is raised every time
// some key on the keyboard is released
//

base.OnKeyUp(e);

//
// Set corresponding key down flag state to false
//

if(e.KeyCode == Keys.W)
w = false;
if(e.KeyCode == Keys.A)
a = false;
if(e.KeyCode == Keys.S)
s = false;
if(e.KeyCode == Keys.D)
d = false;
}

void Main_Function()
{
//
// Main function
//

//
// This function is called every time the
// timer tick event handler is raised
//

//
// This function determines which key is pressed
// upon key down flag value and updates corresponding counter value
//
// Counter value shows how many times program has confirmed the
// key down state and not how many times user has pressed the key
//

//
// Increase counter value if key is down
//
if(a)
A++;
if(s)
S++;
if(w)
W++;
if(d)
D++;

//
// Show values of counters
//
Label_A.Text = "A = " + A.ToString();
Label_S.Text = "S = " + S.ToString();
Label_W.Text = "W = " + W.ToString();
Label_D.Text = "D = " + D.ToString();
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/401 ... nt-control
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»