|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.05.2010, 02:17 | #1 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 21
|
Игра. Реализация потоков в C++ Builder
Пишу игру 2D файтинг. Столкнулся с проблеммой: персонажи ходят, наносят удары, а также выполняют другие действия по очереди. думаю использовать потоки, но не могу придумать, как можно отловить параллельно нажатие клавиш. Обьясните пожалуйста по-подробнее (новичек я). Заранее спасибо
|
06.05.2010, 11:04 | #2 |
Пользователь
Регистрация: 30.03.2009
Сообщений: 23
|
Код:
В общем смотрите в эту сторону. P.S. Удачи в разработки игры |
07.05.2010, 01:34 | #3 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 21
|
Попробовал. Все работает. Спасибо большое.
Возник другой вопрос. Анимацию вывожу в Image по кадрам. То есть все кадры одной анимации храняться в папке. Кадры имеют расширение bmp. Можно ли как-нибудь оптимизировать процесс вывода анимации или пойдет так? Последний раз редактировалось M0rf; 07.05.2010 в 01:52. |
07.05.2010, 07:48 | #4 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Об этом много написано в разделе "Создание и обсуждение игр" (в частности, в темах "Уроки по созданию игр для новичков" и "Как вы относитесь к созданию игр на Delphi?"), так что советую вам почитать этот раздел - там вообще много полезного в плане общих подходов и алгоритмов.
Однако, объясню вкратце. Во-первых, лучше вообще обойтись без TImage и выводить все изображение сразу на форму (точнее, не сразу - лучше использовать двойную буферизацию, ну да это уже другой вопрос). Во-вторых, всю анимацию удобнее собирать в один файл - кадры располагаются лентой, следующий - слева от предыдущего. Впрочем, тут возможны варианты: хранить в одном файле анимацию одного объекта в одном конкретном действии (персонаж двигается влево, артефакт лежит на земле и переливается на солнце, попавшая в цель ракета взрывается, иссякший рудник обваливается и т.д.), хранить в одном файле всю анимацию одного объекта (персонаж, здание, космолет, дерево), всех объектов одной локации, всех объектов игры. Я бы посоветовал для начала первый вариант, а там - по необходимости. Итак, допустим, у нас есть картинка, которая выглядит так: 012345 где цифры представляют собой кадры с соответствующим номером анимации. Мы загружаем эту картинку в объект типа TBitmap: Код:
Если число кадров равно одному, Код:
Таким образом мы можем нарисовать на форме загруженную из файла картинку с учетом прозрачности (для этого надо еще установить значения Transparent и TransparentColor у Tree).
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
08.05.2010, 01:47 | #5 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 21
|
Сразу возник вопрос по прочитанному: как все кадры собрать в один файл?
С остальным согласен - сам собирался переделывать. |
08.05.2010, 21:04 | #6 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
С помощью любого мало-мальского графического редактора. Делаете новый рисунок размером (A*N на B), где A - ширина кадра, B - высота кадра, N - число кадров. И, соответственно, вставляете кадры из отдельных файлов, стыкую их друг с другом.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
11.05.2010, 01:28 | #7 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 21
|
При массовом тестировании игры, возникли некоторые проблеммы с отлавливанием нажатых клавиш. Дело в том что GetKeyboardState( Keys ) отлавливает нажатую 1-ю клавишу и при нажатии другой клавиши, воспоизводит две анимации: анимацию, закрепленную за 2-й клавишей, и анимацию, закрепленную за 1-й. Я так понял, что нужна какае-то очистка массива. Прошу привести пример с использованием этой команды, только опишите, пожалуйста все по-подробнее (в хелпе команды нету, поиск использовал, но ничего для моего случая не нашел).
Заранее спасибо |
11.05.2010, 07:29 | #8 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Думаю, для ваших целей необязательно использовать GetKeyboardState, т.к. есть и более привычные варианты. В частности, события OnKeyDown и OnKeyUp. Отслеживайте нажатие и отпускание используемых в игре клавиш (для каждой из них у вас есть где-то флаг bool), а при каждом срабатывании игрового таймера смотрите состояние каждой из этих клавиш.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
12.05.2010, 01:34 | #9 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 21
|
Я пытался так делать. Проблемма в том что эти события обрабатывают только одно нажатие. После его отлова и выполнения, отлавливается следующая и т.д. То есть нет никакой параллельности, все движения и удары идут по очереди. С предложенной выше командой вроде сразу все получилось, и только потом заметил выше описанную проблемму. Если решу эту проблемму, останеться только написать интерфес (менюшки там всякие) и улучшить графику. А если не решу... пошаговый файтинг - это не серьезно
Про булевские переменные: по моему мнению, решение не очень. Для каждой клавиши своя переменная? А если их много? GetKeyboardState гораздо удобнее. Только бы разобраться в ней получше. Поэтому и прошу помощи. Последний раз редактировалось M0rf; 12.05.2010 в 01:40. |
12.05.2010, 08:42 | #10 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Нет, почему же?
Код:
Впрочем, можете попробовать еще GetKeyState, но я с ней лично не знаком.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Реализация двух потоков, работа с буфером, механизм семафоров (С++ или 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 |