Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 12
1

Управление в игре "Змейка"

01.12.2017, 17:25. Показов 588. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Разрабатываю змейку на делфаче, образовалась такая проблема. У змейки есть, разумеется, управление, на пример WASD. Если нажать к примеру W - она пойдет вверх и после этого нажать на S - она пойдет вниз. Как все знают, такого не должно происходить (в моем случае она врезается сама в себя внутри). Суть вопроса: как заблокировать нажатие на противоположную кнопку, дабы избежать подобных проблем? Процедуру нажатия на клавишу прикрепляю.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
 
begin
  if key = VK_SPACE then
    Timer1.Tag := Timer1.Tag + 1;
 
  case Key of
    VK_SPACE:  begin                        
                  if Timer1.Tag = 1 then
                  begin
                    Timer1.Enabled := False; // Pause
                    PauseLabel.Visible := True;
                  end;
                  if Timer1.Tag = 2 then
                  begin
                    PauseLabel.Visible := False;
                    Timer1.Enabled := True;
                    Timer1.Tag := 0;
                  end;
                end;
 
    VK_ESCAPE: begin                         //"ESC"
                Form1.Close;
               end;
  end;
 
  if Form3.RGroup.ItemIndex = 1 then
  begin
  case Key of
// Управление ARROWS:
    VK_UP:  begin
              mup := True;
              mdown := False;
              mleft := False;
              mright := False;
              Timer1.Enabled := True;
              Exit;
            end;
 
    VK_DOWN:  begin
              mup := False;
              mdown := True;
              mleft := False;
              mright := False;
              Timer1.Enabled := True;
              Exit;
            end;
    VK_LEFT:  begin
              mup := False;
              mdown := False;
              mleft := True;
              mright := False;
              Timer1.Enabled := True;
              Exit;
            end;
 
    VK_RIGHT:  begin
              mup := False;
              mdown := False;
              mleft := False;
              mright := True;
              Timer1.Enabled := True;
              Exit;
            end;
  end;
  end else
  begin
 
  case Key of
// Управление WASD:
    Ord ('W'):  begin
              mup := True;
              mdown := False;
              mleft := False;
              mright := False;
              Timer1.Enabled := True;
              Exit;
            end;
 
    Ord ('S'):  begin
              mup := False;
              mdown := True;
              mleft := False;
              mright := False;
              Timer1.Enabled := True;
              Exit;
            end;
    Ord ('A'):  begin
              mup := False;
              mdown := False;
              mleft := True;
              mright := False;
              Timer1.Enabled := True;
              Exit;
            end;
 
    Ord ('D'):  begin
              mup := False;
              mdown := False;
              mleft := False;
              mright := True;
              Timer1.Enabled := True;
              Exit;
            end;
  end;
  end;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2017, 17:25
Ответы с готовыми решениями:

Не работает управление в игре Пинг-Понг
Можете Исправить код или еще что либо там, я немогу понять в чем проблема или ошибка при запуске...

Управление вероятностью выбора направления хода в игре
Моя задача довольно специфическая, но может применяться во многих играх. Алгоритм должен...

Не двигается змейка в игре
Здравствуйте пишу игру по видео(не буду рекламировать по какому), Возможно я что то сделал не...

Создание Автопоиска в игре Змейка (С++)
Здравствуйте. Я недавно сделал игру по видео уроку (ссылка:...

Сохранение и загрузка в игре Змейка
Здравствуйте я недавно начал разрабатывать игру Змейка на C#. Я новичок в C#. Полный листинг...

2
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
01.12.2017, 17:36 2
Должно сработать:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
 
begin
  if key = VK_SPACE then
    Timer1.Tag := Timer1.Tag + 1;
 
  case Key of
    VK_SPACE:  begin                        
                  if Timer1.Tag = 1 then
                  begin
                    Timer1.Enabled := False; // Pause
                    PauseLabel.Visible := True;
                  end;
                  if Timer1.Tag = 2 then
                  begin
                    PauseLabel.Visible := False;
                    Timer1.Enabled := True;
                    Timer1.Tag := 0;
                  end;
                end;
 
    VK_ESCAPE: begin                         //"ESC"
                Form1.Close;
               end;
  end;
 
  if Form3.RGroup.ItemIndex = 1 then
  begin
  case Key of
// Управление ARROWS:
    VK_UP,Ord ('W'): if not(mdown) then  
              begin
              mup := True;
              mdown := False;
              mleft := False;
              mright := False;
              Timer1.Enabled := True;
            end;
 
    VK_DOWN,Ord ('S'): if not(mup) then
              begin
              mup := False;
              mdown := True;
              mleft := False;
              mright := False;
              Timer1.Enabled := True;
            end;
    VK_LEFT,Ord ('A'): if not(mright) then  
              begin
              mup := False;
              mdown := False;
              mleft := True;
              mright := False;
              Timer1.Enabled := True;
            end;
 
    VK_RIGHT,Ord ('D'): if not(mleft) then
              begin
              mup := False;
              mdown := False;
              mleft := False;
              mright := True;
              Timer1.Enabled := True;
            end;
  end; 
end;
По возможности избегайте копирования идентичного кода. Это очень плохая привычка. Если где-то в таком коде закрадется ошибка править ее придется во всех местах.
1
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 12
01.12.2017, 17:45  [ТС] 3
Полезный совет. Я и не знал, что так можно. Спасибо, всё работает
0
01.12.2017, 17:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2017, 17:45
Помогаю со студенческими работами здесь

Столкновение с объектом в игре змейка
Здравствуйте, пишу игру змейка и столкнулся с проблемой реализации столкновения змеи с барьерами....

Выбор сложности в игре Змейка
В прошлой теме код вставился не так как надо,вот повторно Нужно чтобы перед началом игры был пункт...

Рандомные стенки в игре Змейка
Собираюсь делать стенки для игры Змейка. Хотелось бы спросить о математической части. Формулу для...

Составить пояснительную записку по игре змейка
Кто может составить пояснительную записку по игре змейка?( пусть не бесплатно) шаблон есть. Буду...

Ошибки в почти готовой игре Змейка
Добрый день. Помогите, пожалуйста, исправить ошибки или дайте хотя бы совет, что не так. Очень...

Использование sleep в игре змейка, для постепенной отрисовки
Доброго времени суток. Начал учить Java и, после решения N простеньких задачек, решил попробовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru