Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Re_translator
0 / 0 / 0
Регистрация: 13.06.2019
Сообщений: 14
1

Управление в игре

13.06.2019, 14:50. Просмотров 564. Ответов 21

Есть метод, который проверяет нажаты ли клавиши стрелочек. Как вызвать его в другом методе?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void Move_Helicopter(KeyEventArgs e)
        {
            //если нажата стрелочка вверх, то координата центра вертолётика смещается вверх
            if (e.Key == Key.Up)
                helicoptercenter.Y --;
 
            //если нажата стрелочка вправо, то координата центра вертолётика смещается вправо
            if (e.Key == Key.Right)
                helicoptercenter.X ++;
 
            //если нажата стрелочка вниз, то координата центра вертолётика смещается вниз
            if (e.Key == Key.Down)
                helicoptercenter.Y ++;
 
            //если нажата стрелочка влево, то координата центра вертолётика смещается влево
            if (e.Key == Key.Left)
                helicoptercenter.X --;   
        }
Также, будет метод "hitboxes", проверяющая пересечение объёктов. Думаю сделать их вызов цикле

C#
1
2
3
4
while(hp_helicopter>0)
{
            //вызов методов "hitboxes" и "Move_Helicopter"
}
Также хотелось бы узнать: чтобы выйти из цикла, не прекращая его, нужно создавать второй поток, или есть какой-то другой вариант?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2019, 14:50
Ответы с готовыми решениями:

Управление в игре
Подскажите пожалуйста скрипт для управления кубика 2x2 если можно использовать только crt & graph ...

Управление данными в игре
Здравствуйте! Интересует вопрос, как можно управлять большим объемом данных в играх: загрузка,...

Не работает сенсорное управление в 2d игре
Делаю игру Bricks Breaker и у меня не работает скрипт для управления на экране телефона по сути...

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

Реализовать управление движением в игре
Подскажите чайнику, с помощью каких классов, методов (java) реализовать в игре движение с помощью...

21
Рядовой
641 / 393 / 188
Регистрация: 17.05.2015
Сообщений: 1,583
Завершенные тесты: 1
13.06.2019, 16:17 2
Цитата Сообщение от Re_translator Посмотреть сообщение
Есть метод, который проверяет нажаты ли клавиши стрелочек. Как вызвать его в другом методе?
это не метод, а событие. Как вам нужно вызвать это событие?
Цитата Сообщение от Re_translator Посмотреть сообщение
Также хотелось бы узнать: чтобы выйти из цикла, не прекращая его, нужно создавать второй поток, или есть какой-то другой вариант?
что бы делать игру вам нужно почитать в принципе про игростроение, в частности gameloop
Метод должен вызываться и заканчиваться, а не строить костыли вроде
Цитата Сообщение от Re_translator Посмотреть сообщение
выйти из цикла, не прекращая его
0
Re_translator
0 / 0 / 0
Регистрация: 13.06.2019
Сообщений: 14
13.06.2019, 16:34  [ТС] 3
Цитата Сообщение от Рядовой Посмотреть сообщение
это не метод, а событие. Как вам нужно вызвать это событие?
По сути, событие должно вызываться постоянно, пока не вертолётик рипнется и проверять нажаты ли стрелочки.

Цитата Сообщение от Рядовой Посмотреть сообщение
что бы делать игру вам нужно почитать в принципе про игростроение, в частности gameloop
Метод должен вызываться и заканчиваться, а не строить костыли вроде
Да, почитать нужно, но курсач надо сдать уже в среду, так что спасаюсь костылями
0
Рядовой
641 / 393 / 188
Регистрация: 17.05.2015
Сообщений: 1,583
Завершенные тесты: 1
13.06.2019, 17:08 4
Re_translator, есть же события keyUp и keyDown, зачем постоянно проверять какие клавиши нажаты?
С костылями в виде потоков/асинхронности вы провозитесь больше чем с gameloop.

Добавлено через 6 минут
Re_translator, How to make a render loop in WPF
0
13.06.2019, 17:08
Re_translator
0 / 0 / 0
Регистрация: 13.06.2019
Сообщений: 14
13.06.2019, 17:46  [ТС] 5
Рядовой, не знал про их существование. ( ._.)

Для каждой клавиши нужно прописывать оба события? Вы не могли бы показать пример их применения для стрелочки вверх?

И спасибо за рекомендацию, начну изучать, заодно английский подтяну
0
Рядовой
641 / 393 / 188
Регистрация: 17.05.2015
Сообщений: 1,583
Завершенные тесты: 1
13.06.2019, 17:53 6
Цитата Сообщение от Re_translator Посмотреть сообщение
Для каждой клавиши нужно прописывать оба события? Вы не могли бы показать пример их применения для стрелочки вверх?
событие точно такое же, как у вас сейчас есть. Только down срабатывает, когда какая либо клавиша была нажата, а up - отпущена. Соответственно, если было вызвано событие down, но up - нет, значит клавиша зажата.
А проверять это надо в событии CompositionTarget.Rendering.
0
shelluser
144 / 37 / 26
Регистрация: 11.05.2019
Сообщений: 121
13.06.2019, 18:10 7
Цитата Сообщение от Рядовой Посмотреть сообщение
это не метод, а событие
Какое же это событие? Самый настоящий полноценный метод, который еще и обработчик события.
1
Рядовой
641 / 393 / 188
Регистрация: 17.05.2015
Сообщений: 1,583
Завершенные тесты: 1
13.06.2019, 18:22 8
shelluser, да что вы? это у нас в ооп методы вызываются с сигнатурой EventArgs?
0
shelluser
144 / 37 / 26
Регистрация: 11.05.2019
Сообщений: 121
13.06.2019, 18:30 9
тогда давайте признаваться кто-кого назвал методом

я лично про это
Цитата Сообщение от Re_translator Посмотреть сообщение
Есть метод, который проверяет нажаты ли клавиши стрелочек. Как вызвать его в другом методе?
C#
1
private void Move_Helicopter(KeyEventArgs e)
1
Рядовой
641 / 393 / 188
Регистрация: 17.05.2015
Сообщений: 1,583
Завершенные тесты: 1
13.06.2019, 18:32 10
shelluser, про него и речь.
0
shelluser
144 / 37 / 26
Регистрация: 11.05.2019
Сообщений: 121
13.06.2019, 18:33 11
и почему же этот метод стал событием ?
1
Re_translator
0 / 0 / 0
Регистрация: 13.06.2019
Сообщений: 14
13.06.2019, 18:49  [ТС] 12
Цитата Сообщение от Рядовой Посмотреть сообщение
событие точно такое же, как у вас сейчас есть. Только down срабатывает, когда какая либо клавиша была нажата, а up - отпущена. Соответственно, если было вызвано событие down, но up - нет, значит клавиша зажата.
А проверять это надо в событии CompositionTarget.Rendering.
Т.е. нужно проверять событие в событии, но как это сделать и как прикрутить туда keyUp и keyDown? Не могли бы вы наглядно показать?
0
Рядовой
641 / 393 / 188
Регистрация: 17.05.2015
Сообщений: 1,583
Завершенные тесты: 1
13.06.2019, 18:52 13
shelluser, ну не знаю... может из определения?
Событие в объектно-ориентированном программировании — это сообщение, которое возникает в различных точках исполняемого кода при выполнении определённых условий (при нажатии клавиши)
или может из слова event в сигнатуре?
а с чего метод?
0
shelluser
144 / 37 / 26
Регистрация: 11.05.2019
Сообщений: 121
13.06.2019, 19:01 14
Кто-то пропустил тему про собития и делегаты ...
1
Рядовой
641 / 393 / 188
Регистрация: 17.05.2015
Сообщений: 1,583
Завершенные тесты: 1
13.06.2019, 19:05 15
shelluser, ну так, приведите ваши аргументы
0
shelluser
144 / 37 / 26
Регистрация: 11.05.2019
Сообщений: 121
13.06.2019, 19:15 16
Есть класс с событием OnReached
Тип этого события делегат dgEventRaiser
C#
1
2
3
4
5
6
7
8
9
  public class Adder
        {
            //------
             public delegate void dgEventRaiser();
            public event dgEventRaiser OnReached;
 
            int i = 0;
           
        }
Точне вот он весь класс

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class Adder
        {
            public delegate void dgEventRaiser();
            public event dgEventRaiser OnReached;
 
            int i = 0;
            public void Add(int x)
            {
                i += x;
                OnReached?.Invoke();
            }
 
            public override string ToString()
            {
                return i.ToString();
            }
        }
Создадим метод

C#
1
2
3
4
 static void a_Reached1()
        {
            Console.WriteLine("Add reached 1!");
        }
Подпишемся на событие класса Adder

C#
1
2
 Adder a = new Adder();
 a.OnReached += new Adder.dgEventRaiser(a_Reached1);
Создадим второй метод
Опять подпишемся

C#
1
  a.OnReached += new Adder.dgEventRaiser(a_Reached2);

Весь код

C#
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
class Program
    {
 
        public class Adder
        {
            public delegate void dgEventRaiser();
            public event dgEventRaiser OnReached;
 
            int i = 0;
            public void Add(int x)
            {
                i += x;
                OnReached?.Invoke();
            }
 
            public override string ToString()
            {
                return i.ToString();
            }
        }
        static void Main()
        {
            Adder a = new Adder();
            a.OnReached += new Adder.dgEventRaiser(a_Reached1);
 
            a.Add(77);
 
            a.OnReached += new Adder.dgEventRaiser(a_Reached2);
            a.Add(27);
            Console.WriteLine(a);
         
            Console.ReadKey();
        }
 
        static void a_Reached1()
        {
            Console.WriteLine("Add reached 1!");
        }
 
        static void a_Reached2()
        {
            Console.WriteLine("Add reached 2!");
        }
    }
Вывод в консоли:

Add reached 1!
Add reached 1!
Add reached 2!
104

Добавлено через 3 минуты
можно посмотреть отличия метода от события на примере это кода на уровне IL

Вот он метод
C#
1
2
3
4
5
6
7
8
 .method private hidebysig static void a_Reached1 () cil managed 
    {
        IL_0000: nop
        IL_0001: ldstr "Add reached 1!"
        IL_0006: call void [mscorlib]System.Console::WriteLine(string)
        IL_000b: nop
        IL_000c: ret
    }
а вот событие

C#
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
  .event Console4.Program/Adder/dgEventRaiser OnReached
        {
            .addon instance void Console4.Program/Adder::add_OnReached(class Console4.Program/Adder/dgEventRaiser)
            {
                .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
                    01 00 00 00
                )
                .locals init (
                    [0] class Console4.Program/Adder/dgEventRaiser V_0,
                    [1] class Console4.Program/Adder/dgEventRaiser V_1,
                    [2] class Console4.Program/Adder/dgEventRaiser V_2
                )
 
                IL_0000: ldarg.0
                IL_0001: ldfld class Console4.Program/Adder/dgEventRaiser Console4.Program/Adder::OnReached
                IL_0006: stloc.0
                .loop
                {
                    IL_0007: ldloc.0
                    IL_0008: stloc.1
                    IL_0009: ldloc.1
                    IL_000a: ldarg.1
                    IL_000b: call class [mscorlib]System.Delegate [mscorlib]System.Delegate::Combine(class [mscorlib]System.Delegate,  class [mscorlib]System.Delegate)
                    IL_0010: castclass Console4.Program/Adder/dgEventRaiser
                    IL_0015: stloc.2
                    IL_0016: ldarg.0
                    IL_0017: ldflda class Console4.Program/Adder/dgEventRaiser Console4.Program/Adder::OnReached
                    IL_001c: ldloc.2
                    IL_001d: ldloc.1
                    IL_001e: call class Console4.Program/Adder/dgEventRaiser [mscorlib]System.Threading.Interlocked::CompareExchange<class Console4.Program/Adder/dgEventRaiser>(!!0&,  !!0,  !!0)
                    IL_0023: stloc.0
                    IL_0024: ldloc.0
                    IL_0025: ldloc.1
                    IL_0026: bne.un.s IL_0007
                }
                IL_0028: ret
            }
            .removeon instance void Console4.Program/Adder::remove_OnReached(class Console4.Program/Adder/dgEventRaiser)
            {
                .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
                    01 00 00 00
                )
                .locals init (
                    [0] class Console4.Program/Adder/dgEventRaiser V_0,
                    [1] class Console4.Program/Adder/dgEventRaiser V_1,
                    [2] class Console4.Program/Adder/dgEventRaiser V_2
                )
 
                IL_0000: ldarg.0
                IL_0001: ldfld class Console4.Program/Adder/dgEventRaiser Console4.Program/Adder::OnReached
                IL_0006: stloc.0
                .loop
                {
                    IL_0007: ldloc.0
                    IL_0008: stloc.1
                    IL_0009: ldloc.1
                    IL_000a: ldarg.1
                    IL_000b: call class [mscorlib]System.Delegate [mscorlib]System.Delegate::Remove(class [mscorlib]System.Delegate,  class [mscorlib]System.Delegate)
                    IL_0010: castclass Console4.Program/Adder/dgEventRaiser
                    IL_0015: stloc.2
                    IL_0016: ldarg.0
                    IL_0017: ldflda class Console4.Program/Adder/dgEventRaiser Console4.Program/Adder::OnReached
                    IL_001c: ldloc.2
                    IL_001d: ldloc.1
                    IL_001e: call class Console4.Program/Adder/dgEventRaiser [mscorlib]System.Threading.Interlocked::CompareExchange<class Console4.Program/Adder/dgEventRaiser>(!!0&,  !!0,  !!0)
                    IL_0023: stloc.0
                    IL_0024: ldloc.0
                    IL_0025: ldloc.1
                    IL_0026: bne.un.s IL_0007
                }
                IL_0028: ret
            }}
1
Re_translator
0 / 0 / 0
Регистрация: 13.06.2019
Сообщений: 14
13.06.2019, 19:18  [ТС] 17
Давайте оставим споры о том, метод это или событие, помогите пожалуйста сделать управление.
0
shelluser
13.06.2019, 19:21
  #18

Не по теме:

Re_translator, мы не спорим. Повторение - мать учения

0
Re_translator
13.06.2019, 19:26  [ТС]
  #19

Не по теме:

shelluser, справедливо, но всё же. :/

0
Re_translator
0 / 0 / 0
Регистрация: 13.06.2019
Сообщений: 14
14.06.2019, 08:01  [ТС] 20
Цитата Сообщение от Рядовой Посмотреть сообщение
событие точно такое же, как у вас сейчас есть. Только down срабатывает, когда какая либо клавиша была нажата, а up - отпущена. Соответственно, если было вызвано событие down, но up - нет, значит клавиша зажата.
А проверять это надо в событии CompositionTarget.Rendering.
Рядовой, как я понял вы говорили о чём-то таком, верно?

C#
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
private void Key_Down(object sender, KeyEventArgs e)
        {
            switch (e.Key)
            {
                //если нажата стрелочка вверх, то коордианта вертолётика смещается вверх
                case Key.Up:
                    helicopter.RenderTransform = new TranslateTransform(x, y - 1);
                    y -= 1;
                    break;
                //если нажата стрелочка вправо, то коордианта вертолётика смещается вправо
                case Key.Right:
                    helicopter.RenderTransform = new TranslateTransform(x + 1, y);
                    x += 1;
                    break;
                //если нажата стрелочка вниз, то коордианта вертолётика смещается вниз
                case Key.Down:
                    helicopter.RenderTransform = new TranslateTransform(x, y + 1);
                    y += 1;
                    break;
                //если нажата стрелочка влево, то коордианта вертолётика смещается влево
                case Key.Left:
                    helicopter.RenderTransform = new TranslateTransform(x - 1, y);
                    x -= 1;
                    break;
                //если нажата клавиша Escape, то вызывается меню паузы
                case Key.Escape:
                    break;
                //если нажата клавиша Z, то применяется способность и вызывается её анимация
                case Key.Z:
                    break;
                //если нажата клавиша X, то применяется способность и вызывается её анимация
                case Key.X:
                    break;
                //если нажата клавиша C, то применяется способность и вызывается её анимация
                case Key.C:
                    break;
            }
        }
Будет ли отличаться событие Key_Up? И как проверять эти события в событии CompositionTarget.Rendering?
0
14.06.2019, 08:01
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2019, 08:01

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

Управление в игре "Змейка"
Доброго времени суток. Разрабатываю змейку на делфаче, образовалась такая проблема. У змейки есть,...

Ошибка 0x000000101 , при игре 10 минутной игре в Dota 2, CS:GO
Имя события проблемы: BlueScreen Версия ОС: 6.1.7600.2.0.0.256.48 Код языка: 1049 ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru