Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2010, 02:17   #1
M0rf
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 21
По умолчанию Игра. Реализация потоков в C++ Builder

Пишу игру 2D файтинг. Столкнулся с проблеммой: персонажи ходят, наносят удары, а также выполняют другие действия по очереди. думаю использовать потоки, но не могу придумать, как можно отловить параллельно нажатие клавиш. Обьясните пожалуйста по-подробнее (новичек я). Заранее спасибо
M0rf вне форума Ответить с цитированием
Старый 06.05.2010, 11:04   #2
animalshadow
Пользователь
 
Аватар для animalshadow
 
Регистрация: 30.03.2009
Сообщений: 23
По умолчанию

Код:
char Keys[256];
GetKeyboardState( Keys );
if( Keys[VK_F1] )  ...  // нажата клавиша F1
if( Keys['Q'] )  ...  // нажата клавиша Q
... - сюда пишите, что должно выполняться при этом условии.

В общем смотрите в эту сторону.

P.S. Удачи в разработки игры
animalshadow вне форума Ответить с цитированием
Старый 07.05.2010, 01:34   #3
M0rf
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 21
По умолчанию

Попробовал. Все работает. Спасибо большое.

Возник другой вопрос. Анимацию вывожу в Image по кадрам. То есть все кадры одной анимации храняться в папке. Кадры имеют расширение bmp. Можно ли как-нибудь оптимизировать процесс вывода анимации или пойдет так?

Последний раз редактировалось M0rf; 07.05.2010 в 01:52.
M0rf вне форума Ответить с цитированием
Старый 07.05.2010, 07:48   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Об этом много написано в разделе "Создание и обсуждение игр" (в частности, в темах "Уроки по созданию игр для новичков" и "Как вы относитесь к созданию игр на Delphi?"), так что советую вам почитать этот раздел - там вообще много полезного в плане общих подходов и алгоритмов.
Однако, объясню вкратце.
Во-первых, лучше вообще обойтись без TImage и выводить все изображение сразу на форму (точнее, не сразу - лучше использовать двойную буферизацию, ну да это уже другой вопрос).
Во-вторых, всю анимацию удобнее собирать в один файл - кадры располагаются лентой, следующий - слева от предыдущего. Впрочем, тут возможны варианты: хранить в одном файле анимацию одного объекта в одном конкретном действии (персонаж двигается влево, артефакт лежит на земле и переливается на солнце, попавшая в цель ракета взрывается, иссякший рудник обваливается и т.д.), хранить в одном файле всю анимацию одного объекта (персонаж, здание, космолет, дерево), всех объектов одной локации, всех объектов игры. Я бы посоветовал для начала первый вариант, а там - по необходимости.
Итак, допустим, у нас есть картинка, которая выглядит так:
012345
где цифры представляют собой кадры с соответствующим номером анимации. Мы загружаем эту картинку в объект типа TBitmap:
Код:
TBitmap* Tree = new TBitmap;
Tree -> LoadFromFile("Images\\Tree.bmp");
При этом мы еще где-то должны хранить информацию о количестве кадров в анимации (в каком-то текстовом файле хранятся, например, путь к файлу, количество кадров в анимации, размеры кадра и т.д.). Теперь, знаю это, мы можем рисовать анимацию примерно так:
Если число кадров равно одному,
Код:
Form1 -> Canvas -> Draw(X, Y, Tree);
Если же их несколько, то создаем временный объект типа TBitmap, копируем туда соответствующий кадр (его положение на картинке определяем по размерам кадра и номеру кадра, который будем рисовать) и рисуем аналогично эту временную картинку. Увеличиваем счетчик кадра на единицу, если он равен числу кадров анимации, сбрасываем на ноль, удаляем временную картинку.
Таким образом мы можем нарисовать на форме загруженную из файла картинку с учетом прозрачности (для этого надо еще установить значения Transparent и TransparentColor у Tree).
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 08.05.2010, 01:47   #5
M0rf
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 21
По умолчанию

Сразу возник вопрос по прочитанному: как все кадры собрать в один файл?
С остальным согласен - сам собирался переделывать.
M0rf вне форума Ответить с цитированием
Старый 08.05.2010, 21:04   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

С помощью любого мало-мальского графического редактора. Делаете новый рисунок размером (A*N на B), где A - ширина кадра, B - высота кадра, N - число кадров. И, соответственно, вставляете кадры из отдельных файлов, стыкую их друг с другом.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 11.05.2010, 01:28   #7
M0rf
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 21
По умолчанию

При массовом тестировании игры, возникли некоторые проблеммы с отлавливанием нажатых клавиш. Дело в том что GetKeyboardState( Keys ) отлавливает нажатую 1-ю клавишу и при нажатии другой клавиши, воспоизводит две анимации: анимацию, закрепленную за 2-й клавишей, и анимацию, закрепленную за 1-й. Я так понял, что нужна какае-то очистка массива. Прошу привести пример с использованием этой команды, только опишите, пожалуйста все по-подробнее (в хелпе команды нету, поиск использовал, но ничего для моего случая не нашел).
Заранее спасибо
M0rf вне форума Ответить с цитированием
Старый 11.05.2010, 07:29   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Думаю, для ваших целей необязательно использовать GetKeyboardState, т.к. есть и более привычные варианты. В частности, события OnKeyDown и OnKeyUp. Отслеживайте нажатие и отпускание используемых в игре клавиш (для каждой из них у вас есть где-то флаг bool), а при каждом срабатывании игрового таймера смотрите состояние каждой из этих клавиш.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 12.05.2010, 01:34   #9
M0rf
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 21
По умолчанию

Я пытался так делать. Проблемма в том что эти события обрабатывают только одно нажатие. После его отлова и выполнения, отлавливается следующая и т.д. То есть нет никакой параллельности, все движения и удары идут по очереди. С предложенной выше командой вроде сразу все получилось, и только потом заметил выше описанную проблемму. Если решу эту проблемму, останеться только написать интерфес (менюшки там всякие) и улучшить графику. А если не решу... пошаговый файтинг - это не серьезно

Про булевские переменные: по моему мнению, решение не очень. Для каждой клавиши своя переменная? А если их много?
GetKeyboardState гораздо удобнее. Только бы разобраться в ней получше. Поэтому и прошу помощи.

Последний раз редактировалось M0rf; 12.05.2010 в 01:40.
M0rf вне форума Ответить с цитированием
Старый 12.05.2010, 08:42   #10
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Нет, почему же?
Код:
bool left, up, right, down;

войд фастколл и все такое OnKeyDown(/**/)
{
switch(Key)
 {
 case VK_LEFT: left = true; break;
 case VK_UP: up = true; break;
 case VK_RIGHT: right = true; break;
 case VK_DOWN: down = true; break;
 }
}

войд фастколл и все такое OnKeyUp(/**/)
{
switch(Key)
 {
 case VK_LEFT: left = false; break;
 case VK_UP: up = false; break;
 case VK_RIGHT: right = false; break;
 case VK_DOWN: down = false; break;
 }
}

войд фастколл и все такое OnTimer(/**/)
{
if (left) Vx = -10;
if (up) Vy = -10;
if (right) Vx = 10;
if (down) Vy = 10;
}
Все нажатия клавиш обрабатываются как надо, нажатие и удержание сразу нескольких клавиш воспринимается адекватно.

Впрочем, можете попробовать еще GetKeyState, но я с ней лично не знаком.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация двух потоков, работа с буфером, механизм семафоров (С++ или Delphi) shoonya Помощь студентам 0 05.04.2010 14:08
Простая игра C++ Builder btf Помощь студентам 7 18.12.2009 11:14
Игра на с++ builder 6 gangrave C++ Builder 4 24.09.2009 18:05
Реализация функций синхронизации потоков. натка Помощь студентам 1 03.01.2008 15:26
Игра пазл на C++ Builder Damawoi C++ Builder 1 29.12.2007 19:33