#c# #winforms #keydown
Вопрос:
Я пытаюсь использовать этот код для создания игры в понг, но по какой-либо причине мой код не работает. Насколько я могу судить, все должно быть правильно.
У меня включен таймер, и код компилируется, потому что программа загружается без ошибок, но коробки с картинками не двигаются.
Может ли кто-нибудь заметить мою проблему?
public partial class Form1 : Form
{
bool P1Up, P1Down, P2Up, P2Down;
int Speed = 12;
public Form1()
{
InitializeComponent();
}
private void MoveTriggerTick(object sender, EventArgs e)
{
if (P1Up == true) Player1Paddle.Top = Speed;
if (P1Down == true) Player1Paddle.Top -= Speed;
if (P2Up == true) Player2Paddle.Top = Speed;
if (P2Down == true) Player2Paddle.Top -= Speed;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int P1Y = Player1Paddle.Location.Y;
int P2Y = Player2Paddle.Location.Y;
if (e.KeyCode.ToString() == "w") P1Up = true;
if (e.KeyCode.ToString() == "s") P1Down = true;
if (e.KeyCode == Keys.Up) P2Up = true;
if (e.KeyCode == Keys.Down) P2Down = true;
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
int P1Y = Player1Paddle.Location.Y;
int P2Y = Player2Paddle.Location.Y;
if (e.KeyCode.ToString() == "w") P1Up = false;
if (e.KeyCode.ToString() == "s") P1Down = false;
if (e.KeyCode == Keys.Up) P2Up = false;
if (e.KeyCode == Keys.Down) P2Down = false;
}
}
Сноска: Хотел, чтобы движение весла было реализовано, прежде чем смотреть на добавление мяча или счет.
Комментарии:
1. e.Код ключа. toString() делает не то, что вы думаете. Предпочитаю Ключи. W и ключи.S
2. Какой смысл объявлять и назначать две неиспользуемые переменные в обработчиках ввода / вывода ключей ?
int P1Y = Player1Paddle.Location.Y; int P2Y = Player2Paddle.Location.Y;
Ответ №1:
if (e.KeyCode.ToString() == "w")
должно быть
if (e.KeyCode == Keys.W)
и так далее.
Он находится в System.Windows.Forms
пространстве имен (см. Документацию).
Также убедитесь, что MoveTriggerTick правильно зарегистрирован в качестве обработчика таймера.
Комментарии:
1. Хорошо, проведя некоторое (вероятно) тестирование джанка, я теперь знаю, что проблема на самом деле в таймере. Я немного покопался и изменил часть кода таймера, чтобы добавить это;
private void Form1_Load(object sender, EventArgs e) { Timer move = new Timer(); move.Interval = 20; move.Tick = new EventHandler(MoveTriggerTick); move.Start(); }
Но у меня все еще нет движения. Есть идеи, как это исправить?2. Вам нужно использовать базовые инструменты отладки, мы не можем сделать это вместо вас. Используйте точки останова в каждой функции для выполнения кода строка за строкой и проверьте, установлены ли переменные так, как вы себе представляете, и выполнены ли условные инструкции. В качестве альтернативы вы также можете разместить некоторые
Console.WriteLine("Some debug message")
повсюду и осмотреть консоль, особенно в if (включитеif (condition_xyz) instruction;
вif(condition_xyz) { Console.WriteLine("The condition xyz is true!"); instruction; }
). Также читайте ericlippert.com/2014/03/05/how-to-debug-small-programs