Четверг, 25 Апреля 2024, 18:02

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Форум игроделов » Записи участника » Morfay [66]
Результаты поиска
MorfayДата: Понедельник, 04 Июня 2012, 14:00 | Сообщение # 21 | Тема: Описание действий в игре.
почетный гость
Сейчас нет на сайте
Apati, понятно же, что действия не три, их будет больше. к примеру с 10. Как тогда будешь делать, чтобы не повториться?

Stalker_Shooter, если я правильно тебя понял, то у меня такой вариант был сразу. Опять же, с тремя действиями 6 вариантов развития. А если действий 10? Или я тебя не понял и ты что-то другое имел ввиду, можно подробнее и с примером?
MorfayДата: Понедельник, 04 Июня 2012, 13:04 | Сообщение # 22 | Тема: Описание действий в игре.
почетный гость
Сейчас нет на сайте
Quote (Matou)
В том что надо не складывать а делать побитовое логическое сложение, потом анализировать биты. Складывая и проверяя сумму можно получить тот же результат, но манипуляция с битами проще для понимания.


Quote (Lord_Zeon)
Можно сделать переменную которая будет хранить номер комбинации, а при считывании нажатия клавиш будет складываться общее значение в переменную, по нему можно будет определить какая комбинация будет выполнена. После выполнения сбрасывать переменную и считывать заново.
Сам еще не пробовал так сделать, излагаю свои мысли, если пригодиться буду рад.


Правильно ли я понял, что каждому действию присваиваем номер (беря выше, например, jump - 1, run - 2, kick - 3). Потом берем переменную (int result), к которой прибавляем значение. Пример:

Code

keys = SDL_GetKeyState(NULL);
if (keys[SDLK_w]){
       jump = true;
       result +=1;

}
if (keys[SDLK_d]){
       run = true;
       result += 2;        
}
if (keys[SDLK_l]){
       kick = true;
       result += 3;        
}

Потом в цикле проверяем - если result = 1 - обычный прыжок, 2 - движение, ..., 6 - удар в прыжке в движении.
Если так, то интересная схема получается. Будут свои сложности (пример - при удержании клавиши все время будет прибавляться значение), но объемы кода уменьшатся на порядок. Опробую, спасибо.

Похоже, это будет оптимальный вариант. Вышеназванный вариант с switch case провалился - в case надо передавать константное значение, то есть каждый активатор (jump, kick, run) нужно проверять switch отдельно = кода станет еще больше. В ближайшее время (на этой/ следующей неделе) опробую, напишу что получилось и какие сложности возникли.

Добавлено (04.06.2012, 13:04)
---------------------------------------------
Итак, опробовал, кое-что получилось. Но возникли проблемы. Сначала как делал:
1) Опознаем нажатие клавиш - тут оставил как было, при нажатии на клавиши активаторы (jump, run kick) устанавливаем true, при отпускании false.
2) В контроллере создаем переменную result = 0, к ней, в зависимости от активатора, прибавляем определенное значение:

Code

if (jump){
      result += 1;
}
if (run){
     result += 2;
}
if (kick){
      result += 3;
}


3) Передаем result в switch и в зависимости от результата выполняем действия:
Code

switch (result)
{
    case 1: //jump
    {
      //
    }
    case 2: //run
    {
      //
    }
    case 3: // kick
    {
      //
    }
    case 4: // jump + kick
    {
     //
    }
    case 5: //run + kick
    {
    //
    }
    case 6: //jump+run+kick
    {
     //
    }
}

В чем проблема: даже при трех действиях появляются одинаковые значения - jump +run (3) = kick (3). И чем больше действий, тем больше одинаковых значений в результате суммы. Даже если сделать все значения действий нечетными (или же наоборот, четными) количество совпадений уменьшится, но не сильно. Надо что-то придумывать (сейчас на ум приходит только делать действия в разных разрядах: удары/другие действия - единицы, движения- десятки и т.д., но идея не нравится).
Еще проблема - увеличивается отклик на нажатие. После нажатия идет задержка, после выполняется действие. Не смертельно, но неприятно.


Сообщение отредактировал Morfay - Среда, 30 Мая 2012, 11:05
MorfayДата: Вторник, 29 Мая 2012, 17:02 | Сообщение # 23 | Тема: Описание действий в игре.
почетный гость
Сейчас нет на сайте
Я уже думаю, переписать через switch case и оставить до поры, до времени. Может чего придумаю потом.
MorfayДата: Вторник, 29 Мая 2012, 16:44 | Сообщение # 24 | Тема: Описание действий в игре.
почетный гость
Сейчас нет на сайте
Quote (Matou)
В принципе комбинацию клавиш можно записывать в виде флагов.

В смысле, делать каждое сложное действие флагом (типа прыжок + удар - bool jumpKick, как-то так )? Тогда проблема не исчезнет - все равно надо узнать когда включить флаг = все то же самое, только еще кода добавится.

Или ты что-то другое имел ввиду?

Quote (Racot)
ставишь на место break, continue
например
case buttonKeyE: Kick(); continue;
или
case buttonKeyE: Kick(LeftKick); continue; // ты можешь указывать, какой метод вызывать. Я вызвал LeftKick к примеру.


Ребята, видимо я плохо описал суть проблемы, либо чего-то не понимаю. Выполнить определенное действие не проблема, проблема распознать, что именно это действие надо выполнить. Что-то простое (вроде обычного прыжка или движения вправо/влево) делается элементарно. Но если что-то сложное? К примеру, пользователь нажал кнопку вперед+ кнопку вверх+ кнопка удар. Действие назовем "ударом в прыжке в движении" (идиотское название, но есть разница между просто ударом в прыжке (вверх+удар) и таким ударом). Распознание этих активаторов (флагов) есть, но оно слишком уж неоптимальное. В любом случае, нужно определить - нажаты ли эти 3 кнопки (или только 2, или 1). Вот как эту часть упростить (чтобы не было тучи кода, в которой потом хрен что найдешь). Пока самый нормальный вариант - переписать все через switch case (проблемы с тучей кода не решит, но он станет более оптимизированный).


Сообщение отредактировал Morfay - Вторник, 29 Мая 2012, 16:53
MorfayДата: Вторник, 29 Мая 2012, 15:54 | Сообщение # 25 | Тема: Описание действий в игре.
почетный гость
Сейчас нет на сайте
Так и задумывалось изначально. Но что делать со сложными нажатиями (комбинациями кнопок)? То есть, если игрок нажмет две-три клавиши, вызвав при этом определенное действие? В итоге, возвращаемся к прошлому варианту с switch case и перечислением (пока это самый оптимальный вариант).

Уточню: функции действий есть (тот же Jump(), Run()). Но чтобы их выполнить, нужно определить что из них выполнять. И проиграть соответственную анимацию.
MorfayДата: Вторник, 29 Мая 2012, 15:23 | Сообщение # 26 | Тема: Описание действий в игре.
почетный гость
Сейчас нет на сайте
Quote
Использование структур или комбинация Switch case (для кнопок) с if else (для действий).


А подробнее можно? Не могу въехать, как оно выглядеть будет.
MorfayДата: Вторник, 29 Мая 2012, 15:03 | Сообщение # 27 | Тема: Описание действий в игре.
почетный гость
Сейчас нет на сайте
Думал об этом. Но как реализовать сложные действия? да и в switch надо что-то передать (к примеру switch(action), (bool action) ), а потом как?

Code

switch(action){
      case jump:
      {
            case run:
            {
                case kick:
                {
                   // Действие
                   break;
                }
                //Действие
                break;
            }  
            //Действие
            break;
      }
}


Ну, если так сделать, то код лучше станет, это да. Но при большом количестве действий картина получится все же не радостной.
MorfayДата: Вторник, 29 Мая 2012, 13:49 | Сообщение # 28 | Тема: Описание действий в игре.
почетный гость
Сейчас нет на сайте
Добрый день. Добрался до момента, когда нужно прописать действия игроков. Сделал так:

1) Есть активаторы (jump, run, kick и т.д.). При нажатии на определенную клавишу, активатор ставим true, при отпускании false.
2) В главном цикле получаем состояние активаторов и выполняем проверку. Вот тут-то и возникают сложности: действия могут быть сложными (к примеру, просто jump = true - прыжок, jump и run = true - сальто, jump, run, kick = true - удар в прыжке в движении). Решил таким образом:

Code

if (jump){
      if (run){
           if (kick){
              //определяем как удар в прыжке в движении и выполняем. Выходим из цикла
           }
           //Определяем как сальто, выполняем, выходим из цикла
       }
       if(kick){
          //определяем как удар в прыжке, выполняем, выходим
       }
       //Определяем как обычный прыжок, ...
}

if (run)
{
    //движение
}

if (kick)
{
    //удар  
}


Все выполняется нормально, но не нравится сама организация кода - при десятке действий (а это мелочь), код становится захламленным и трудноредактируемым. Интересуют способы, которыми пользуются более опытные люди. Заранее спасибо.
MorfayДата: Понедельник, 30 Апреля 2012, 13:18 | Сообщение # 29 | Тема: C/C++ - хочу изучить.
почетный гость
Сейчас нет на сайте
Quote
А в чём разница?


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

Quote
Также хочу узнать мнения тех, кто учил или учит сейчас этот ЯП, об этом ЯП-е, о его возможностях и особенностях.


С++ многогранен. На один вопрос есть множество вариантов ответа. Подобрать самый оптимальный - и есть мастерство.


Сообщение отредактировал Morfay - Понедельник, 30 Апреля 2012, 13:18
MorfayДата: Понедельник, 30 Апреля 2012, 00:50 | Сообщение # 30 | Тема: Учебный курс. SDL, Box2D, Lua.
почетный гость
Сейчас нет на сайте
SDL божественен в своих возможностях smile . Сколько не ковыряю его - все нравится. Но вот нормальной документации не хватает, только основы (и то, на английском многое). Поэтому важная вещь, возьму на изучение. Кстати, нашел мануал по всем доп библиотекам (все функции, методы и свойства с описаниями, но на английском) jcatki.no-ip.org/ - мне очень помогло в изучении.

Добавлено (30.04.2012, 00:50)
---------------------------------------------
Сайт не работает sad . Уже пару недель наверное.

при открытии пишет:
Fatal error: Out of memory (allocated 25427968) (tried to allocate 30720 bytes) in /home/technoid/public_html/wp-content/plugins/si-captcha-for-wordpress/si-captcha.php on line 1370

А жаль - хотел посмотреть реализацию игрового процесса (мельком видел, заинтересовало).

MorfayДата: Суббота, 28 Апреля 2012, 11:00 | Сообщение # 31 | Тема: Одновременное выполнение 2 функций.
почетный гость
Сейчас нет на сайте
Я сделал по примеру кода warzes'а - все получилось. Появились мелкие неудобства, но они решаемы. Всем спасибо.
MorfayДата: Пятница, 27 Апреля 2012, 15:44 | Сообщение # 32 | Тема: Одновременное выполнение 2 функций.
почетный гость
Сейчас нет на сайте
warzes, я правильно понял, что метод Play, запущенный в игровом цикле, просто с каждой итерацией проверяет "а не настало ли время поменять кадр", и в зависимости от прошедшего времени либо меняет кадр, либо выходит из метода, если время еще не пришло? Забавная реализация, я нахардкодил. Радует, что нужно убрать минимум, чтобы все работало также (почти так же как и у тебя все в методе, но я вводил таймер, который пока не проиграет анимацию полностью, не выйдет. Убрать его и добавить твой подсчет времени - и все). Опробуем, спасибо.
MorfayДата: Пятница, 27 Апреля 2012, 14:01 | Сообщение # 33 | Тема: Одновременное выполнение 2 функций.
почетный гость
Сейчас нет на сайте
эээ, при такой архитектуре как раз и может - каждая анимация имеет свою скорость проигрывания и проигрывается. Само по себе все прекрасно проигрывается и новые анимации добавляются в класс всего за пару строчек кода. Проблема в том, чтобы увязать все вместе (анимации и действия). Создаваемый движок идет как учебное пособие - через него изучаю с++ и SDL, а также саму работу движка. Поэтому я совсем не против, если меня ткнут носом и скажут как лучше сделать

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


Сообщение отредактировал Morfay - Пятница, 27 Апреля 2012, 14:03
MorfayДата: Пятница, 27 Апреля 2012, 13:27 | Сообщение # 34 | Тема: Одновременное выполнение 2 функций.
почетный гость
Сейчас нет на сайте
Quote
В будущем тебе будет тяжко если не научишься рисовать где-то в одном месте а не по всему коду.
В общем так - здесь ты должен не рисовать анимацию а сообщать что данная анимация должна быть проиграна. Далее у тебя должно быть место, где ты рисуешь, и вот уже там нужно рисовать твою анимацию.


Вроде бы я так и делаю. Метод Play("run") сообщает какая анимация должна быть проиграна. Все параметры для анимации заполнены (имя, количество кадров и прочее). Далее, выполняется таймер, который меняет позицию кадра в спрайте, и выполняется метод CreateScene, который все и рисует (то есть, абсолютно все).

Quote
Morfay, я так понимаю метод Play не возвращает управления до тех пор, пока анимация полностью не будет проиграна? Это неправильно.


Quote
В общем так - здесь ты должен не рисовать анимацию а сообщать что данная анимация должна быть проиграна. Далее у тебя должно быть место, где ты рисуешь, и вот уже там нужно рисовать твою анимацию.


Теплее. Но я не могу понять, как реализовать игровой таймер - каждая анимация может иметь свою скорость проигрывания. Или не может?.

Если посмотреть пример выше - у нас два метода (проигрывание и движение). Убрать таймер из моего метода Play, сделать так, при его вызове, просто менялась позиция кадра. Потом в игровом цикле, при нажатии на клавишу создаем таймер:

Code
case SDLK_d:  
{  
//начинаем таймер
animationPlayer.Play("run"); // проигрывание анимации с указанным именем  
action.Run(cObject object); // допустим action - класс с действиями, Run - метод движения, с параметром object (объект, котороый должен двигаться)  
//заканчиваем
}


Что-то вроде такого должно получиться?
MorfayДата: Пятница, 27 Апреля 2012, 12:17 | Сообщение # 35 | Тема: Одновременное выполнение 2 функций.
почетный гость
Сейчас нет на сайте
Дело в том, что анимация проигрывается через класс (назовем его AnimationPlayer). Он содержит массив анимаций, с соответствующими методами. Сам же класс анимации имеет параметры (вроде скорости проигрывания, количества кадров и т. п.), а также методы проигрывания. В итоге мне достаточно прописать animationPlayer.Play("run"); чтобы проиграть анимацию. Мне такая реализация понравилась - удобно, +все работает. А в игровом цикле прописывается:

....//начало цикла, определение состояния клавиш.
case SDLK_d:
{
animationPlayer.Play("run"); // проигрывание анимации с указанным именем
action.Run(cObject object); // допустим action - класс с действиями, Run - метод движения, с параметром object (объект, котороый должен двигаться)
}
....
Вот эти два действия надо выполнить одновременно.

Теперь, почему не хочу двигать объект в самом проигрывании: класс универсальный для всех анимации (конечно, если выполняются определенные требования к спрайту). А вот действия не одинаковые. Да и вплетать действия в анимации не очень нравится - хочу, чтобы части были максимально автономны. Меньшим злом было бы, если бы был аналог call_user_func() в С++. Но ничего подобного я не нашел, а нормальный способ вызвать метод внутри анимации не придумал. Осталась только идея многопоточности (как я понимаю, это один из способов выполнить два действия практически одновременно), но с ней так и не смог разобраться. Или же есть какое-то иное решение, которое я не вижу.
MorfayДата: Пятница, 27 Апреля 2012, 11:23 | Сообщение # 36 | Тема: Одновременное выполнение 2 функций.
почетный гость
Сейчас нет на сайте
Здравствуйте. Столкнулся с такой проблемой, что необходимо выполнить 2 функции одновременно, но не знаю как это реализовать лучше.
Подробнее:
Есть класс, работающий с анимациями. В нем все есть, анимации проигрываются. Но, к примеру, прописали мы в коде действий, что при нажатии на кнопку "D" персонаж будет идти вправо. Проигрывается соответствующая анимация, прибавляем координаты по Х к объекту. На деле же, получается, что эти два действия выполняются последовательно: или проигрывается анимация, а потом объект передвигается, или передвигается, а потом проигрывается. Как можно их объединить?
P. S. Читал мануалы по многопоточности. Вроде бы и подходит, но так и не разобрался как их нормально создавать (потоки).

P. P. S. Советы выполнять функцию движения в самом проигрывании анимации не катят - нет смысла в самом классе тогда.
MorfayДата: Четверг, 19 Апреля 2012, 22:25 | Сообщение # 37 | Тема: SDL+OpenGl двойная буферизация
почетный гость
Сейчас нет на сайте
Да, SDL_image использую. Потом его же передаю в текстуру. Результат - отображаются либо точки по контуру фигуры, либо небольшие отрезки.

Добавлено (13.04.2012, 17:32)
---------------------------------------------
Итак, переписал. Получилось так как я хотел, тормозов не заметно (но возможно объектов мало). НО, иногда есть мерцание. При проверке ставлю анимацию на постоянное проигрывание, перерисовка идет отлично, но через 3-4 проигрывания анимация чуть мерцает. Потом опять нормально. Двойная буфферизация включена, от OpenGL избавился, количество кадров верное (3-4 раза анимация показывается же нормально). Вообще, что еще (кроме двойной буфферизации) влияет на прорисовку (имеется в виду настройки SDL, а не компа)?

Добавлено (19.04.2012, 22:25)
---------------------------------------------
Возможно кому-то поможет. Мерцания были из-за частой смены буферов. Имеет смысл сначала отобразить все объекты сцены, и лишь потом обновить буфер.

MorfayДата: Пятница, 23 Марта 2012, 17:40 | Сообщение # 38 | Тема: SDL+OpenGl двойная буферизация
почетный гость
Сейчас нет на сайте
Ок, уже набросал схемы классов (думаю сделать класс object в котором будут храниться все объекты. В зависимости от типа (background, static, dynamik, player) будет задаваться приоритет. А потом, при перерисовки сцены, будут отображаться согласно приоритету (сначала лепим бэкграунд, потом на него статические объекты, потом динамические (типа летящие облачка и прочее), а поверх всего отображаться персонажи)). В идеале получим построенную сцену, которую останется отобразить.

Есть еще вопрос, касательно изображения. Почему-то png отображается как сборище точек, повторяющие контуры персонажа (рисунок черно-белый). Этот же рисунок в jpg отображается нормально. Но вот прозрачности в jpg нет. Есть ли ограничения какие на png?
MorfayДата: Пятница, 23 Марта 2012, 15:58 | Сообщение # 39 | Тема: SDL+OpenGl двойная буферизация
почетный гость
Сейчас нет на сайте
Возможно вы правы. Но возникнет другая проблема - задний фон перекроет другие объекты. Впрочем и она решаема - как идея, сделать метод "RedrawScene", в котором будут перерисовываться все объекты по очереди, согласно приоритету (Сначала задник, потом статические объекты, типа бочек, ящиков и т.п., потом динамические объекты - персонажи). Так все объекты будут "накладываться" друг на друга в нужном порядке.
Мысль любопытная, но каждый раз перерисовывать все объекты - не слишком ли?
MorfayДата: Пятница, 23 Марта 2012, 13:05 | Сообщение # 40 | Тема: SDL+OpenGl двойная буферизация
почетный гость
Сейчас нет на сайте
Добрый день. Осваиваю SDL. Азы освоены, перешел к более сложному, а именно - проигрывание анимации с помощью SDL и OpenGL.
Как это происходит:
1) Загружаю спрайт.
2) Переношу часть спрайта (необходимый кадр) в текстуру.
3) Отображаю
и т. д.

Собственно, проблема в чем: во время проигрывания анимации мерцает задний фон. Сама анимация проигрывается без мерцания. Использую двойную буферизацию. Подозреваю, что на "невидимом" буфере рисуется кадр анимации, а задник остается на видимом, вот при смене он и мерцает. Но как тогда стоит сделать? При каждом воспроизведении анимации (фактически в любой анимации), отображать задник перед отображением кадра? Не будет ли это слишком накладно? Прошу помощи у более опытных - подскажите как лучше и правильнее строить сцену перед отображением. И как устранить мерцание задника.
Форум игроделов » Записи участника » Morfay [66]
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг