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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2008, 14:35   #141
Titan123
Форумчанин
 
Аватар для Titan123
 
Регистрация: 27.06.2008
Сообщений: 113
По умолчанию

пишу танчики и просто застрял на одном месте!
как можно сделать, чтобы если, ты, например, развернут вниз, компонент image1 (снаряд) летел вниз, вправо-вправо и т.д.
у меня все время он летит вверх, чтобы я не делал!

я задал переменные:
Код:
 image3up,image3left,image3down,image3right:boolean; //image3-снаряд
  image2up,image2left,image2down,image2right:boolean;//image2-танк
далее обрабатываю кнопку "выстрел":
Код:
if image2up=true then
begin
image3up:=true;
image3left:=false;
image3down:=false;
image3right:=false;
image3.Left:=image2.Left+15;
image3.Top:=image3.top-15;
end;
и так для всех случаев.

в таймере пишу код:
Код:
if image3up=false then
begin
image3.Top:=image3.Top-7;
end;
if image3right=true then
begin
image3.Left:=image3.Left+7;
end;
if image3left=true then
begin
image3.Left:=image3.Left-7;
end;
if image3down=true then
begin
image3.Top:=image3.Top+7;
end;
все равно снаряд летит вверх и только туда
помогите, плиз, так хочется по-скорей закончить, а тут это...

Последний раз редактировалось Titan123; 18.07.2008 в 14:39.
Titan123 вне форума Ответить с цитированием
Старый 18.07.2008, 17:04   #142
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Популярно...

ЛомиК, ярлыки вешать все мастера.
Обычно так и происходит на полное описание процесса потом идет нарекание типа "это я и без вас знаю, мне бы вот это...", ...так стоит ставить вопрос соответствующе, чтобы было понятно, что имеется в виду. Загрузить на форму - это одно, вывести на форму - это другое. А за примеры не боИтесь, без них не оставляем
Все взято из тем "Как вы относитесь к созданию игр на Delphi?" и "Уроки по созданию игр для новичков". Вывод графики для VCL, загрузка, и структура хранения без ограничений для любых методов.

Создание структуры хранения анимации

(это было к примеру аркады, "Уроки по созданию игр для новичков", пост #115)

Если на каждое состояние персонажа свой набор кадров. К примеру, у нас 10 кадров на каждое состояние (пусть будет качество).

Анимация персонажа (файлы bmp):
1-10 - стоит;
11-20 - приседает;
21-30 - идет влево;
31-40 - идет вправо;
41-50 - прыгает влево;
51-60 - прыгает вправо;
61-70 - стреляет (бьет) влево;
71-80 - стреляет (бьет) вправо;

Можете сделать меньше кадров, кому как нравится. Зеркальное отражение одного и того же действия я умышленно не применяю, и вам того же советую.
Создайте в проекте новую папку, например Anim, и поместите туда все файлы.

Загрузка анимации

Практикуется загрузка анимации в ImageList.
("Уроки по созданию игр для новичков", из поста #109)
Не вижу смысла использовать ImageList, чтобы оставить его пустым, и при запуске заполнять эго картинками, ...или может загрузить картинки сразу и хранить в EXE? , побойтесь Бога.

Загружать анимацию будем в массив типа TBitmap.
Вот такой вариант мной применялся до недавнего времени:
(добавлю точности для частного случая)

Код:
Var  
  Tex: TBitmap;
  i, n: Byte;  
  TexMas: array[1..255] of TBitmap;
  
...  

procedure TForm1.LoadTexture;  
  begin  
    // n определяется сразу, если вы точно знаете сколько будет текстур анимации 
    // у меня было считывание из системного файла.  
    for i:=1 to n do  
      begin  
        Tex:=TBitmap.Create;  
        Tex.LoadFromFile(GetCurrentDir+'\Anim\'+IntToStr(i)+'.bmp');  

        {тут были манипуляции с текстурами}  

        TexMas[i]:=Tex;  
      end;  
    end;
Эта процедура выполняется в самом начале один раз. Каждая ячейка массива TexMas будет содержать определенную картинку определенного типа анимации.

Подготовка кадра

("Уроки по созданию игр для новичков", из поста #85)
Цитата:
Сообщение от L_M
... при рисовании по канве возникает мерцание...
Это явление нелогичной последовательности операций. Обычно мы выводим графику через Canvas.Draw когда нам вздумается, в циклах множество раз и тп. Как происходит отображение графики в OGL и DX? ...строится кадр в буфере и только самой последней командой выводится видеокартой на экран. Если делать Flip (вывод буфера на экран) когда вздумается, то будет такое же мерцание, падение fps, и нагрузка на видеокарту многократно возрастет. Так вот, применительно к играм: канвой (Canvas.Draw) нужно пользоваться только при выводе готового кадра, а построение выполнять в буфере.
(пост #102)
Попробуем создать буфер кадра, в котором будет производиться построение, перед финальным выводом на экран:

Код:
procedure TForm1.FormCreate(Sender: TObject);  
begin  
  // создается буфер кадра  
  BitBuf:=TBitmap.Create;
  // размеры буфера  
  BitBuf.Width:=800;  
  BitBuf.Height:=600;  
end;
Теперь вызов нужной секции кадров из массива сводится к такому способу:

Код:
BitBuf.Canvas.Draw(x, y, TexMas[t+n]);
где: t - задает тип анимации (смотрим таблицу, при нажатии клавиш в t записываем число), а n - номер кадра (таймер TTimer считает от 1 до 10). x и y - координаты персонажа на игровом поле.

Вывод анимации

Тут следует уточнить, куда выводить анимацию, прямо на форму или же в PainBox, Image. Пусть в Image. Смотрим процесс отрисовки кадра и его вывод в Image в процедуре таймера:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);     
begin
  // подготовка кадра
  BitBuf.Canvas.Draw(x, y, TexMas[t+n]);
  // вывод на экран  
  Image1.Picture.Bitmap.Canvas.Draw(0,0,BitBuf);     
end;
А если персонажей много? ...начинаем с модели мира.
(читаем материал "Уроки по созданию игр для новичков", пост #102)
Создаем свой тип для модели мира (уровня) и для персонажей, в таймере применяем цикл по числу персонажей.

P.S. Если нужно, остановимся подробнее на модели персонажа.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 18.07.2008 в 17:08.
Beermonza вне форума Ответить с цитированием
Старый 18.07.2008, 17:34   #143
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Titan123, для начала слегка поменяйте название переменных, ...человеческий зрительный аппарат так устроен, что привыкает к похожести начальных нескольких символов, и при беглом поиске просто считает имена одинаковыми, ...в итоге поиск ошибок затрудняется. Это из многолетней практики.
Предложу исправить вот так:
Код:
PatronUp, PatronLeft, PatronDown, PatronRight: Boolean; //PatronImage-снаряд  
TankUp, TankLeft, TankDown, TankRight: Boolean; //TankImage-танк
С условиями понятно, вас интересует только состояние флагов TRUE, т.е. находится ли снаряд в нужной позиции, остальные направления - false. Смотрите внимательно обработку кнопок.
Также в таймере есть условие: if image3up=false then оно неверное, если вас интересует лишь истинность True. ...это наверное попытка хоть как-то повлиять на ситуацию?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.06.2013 в 16:30.
Beermonza вне форума Ответить с цитированием
Старый 18.07.2008, 17:35   #144
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Titan123, раз он все время летит вверх, эначит этот код
Код:
if image3down=true then  
begin  
image3.Top:=image3.Top+7;  
end;
не выполняется, иначе летел бы вниз. Или же выполняется, но перекрывается другим кодом где происходит обратный процесс.
Чтобы не было таких запутанных условий, лучше сделать немного иначе:
Код:
type
TDirection = (dLeft, dUp, dRight, dDown);

var
Direction: TDirection;
то же самое можно записать иначе
Код:
var
Direction: byte; {где 0 - left, 1 - up, 2 - right, 3 - down}
Так всегда будет однозначность, направление может быть только одно. В отличие от того способа, что у вас был, если неправильно обработать флаги он может лететь одновременно на все четыре стороны, в конечном итоге он полетит в одну, куда вектор тяги перевесит =)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 18.07.2008, 18:18   #145
ЛомиК
Пользователь
 
Регистрация: 09.07.2008
Сообщений: 66
По умолчанию

Titan123, а кто снаряд? -

как можно сделать, чтобы если, ты, например, развернут вниз, компонент image1 (снаряд) летел вниз, вправо-вправо и т.д.
у меня все время он летит вверх, чтобы я не делал!

я задал переменные:

Код:
view plaincopy to clipboardprint?
image3up,image3left,image3down,imag e3right:boolean; //image3-снаряд
======
У Вас там путаницы с image нет? Правильно Вам посоветовали с именами переменных.

Beermonza

Извиняюсь, если задел, просто часто уж приходится слышать весьма лаконичные ответы, Вы мне открыли глаза, я и недумал что это может напрягать, хотя если человек совсем бестолков, тогда да, но я таким вообще не отвечаю, прошу прощенья.
ЛомиК вне форума Ответить с цитированием
Старый 18.07.2008, 21:43   #146
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

1.подскажите как лучше делать иск. интеллект? я вот пробовал для крестиков-ноликов описать процедуру постановки знака и вызывал ее с параметрами(чей ход и пр.) - т.е. как бы общая процедура для всех, а в процессе поиска лучшего решения я как бы моделировал ходы- комп проверял возможный ход на эффективность и проверял что будет. правилен ли такой подход или надо как - то иначе?
2. расскажите как сделать игру через интернет
Упс...
L_M вне форума Ответить с цитированием
Старый 19.07.2008, 22:20   #147
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

L_M, так понимаю, вам нужно написать искусственный интеллект для некоторой игры: "расскажите как сделать игру через интернет", а первые попытки у вас были на игре "крестики-нолики"? ...или ваша игра "крестики-нолики" и вас не устраивает тот метод работы ИИ, что вы уже применили?
Все зависит от типа игры и от поведения объекта, который вы собираетесь имитировать. Уточните, тогда можно будет вам помочь.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.06.2013 в 16:31.
Beermonza вне форума Ответить с цитированием
Старый 20.07.2008, 21:39   #148
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

ну конкретно я хочу сделать юнита, например в стратегии. вот вопросы:
1. как их все хранить? есть юнит, 1 штука, например объект. как хранить много юнитов(в массиве что ли)?
2. как создавать(динамически?).
3. как сделать прозрачные панели, например со зданиями?
Упс...
L_M вне форума Ответить с цитированием
Старый 20.07.2008, 21:42   #149
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

вот, забыл самое главное: нужно ли делать каждый юнит екземпляром объекта(класса, компонента,...) с процедурами, или описать глобальные процедуры, например движения и передавать туда параметры каждого юнита?
Упс...
L_M вне форума Ответить с цитированием
Старый 21.07.2008, 10:17   #150
Titan123
Форумчанин
 
Аватар для Titan123
 
Регистрация: 27.06.2008
Сообщений: 113
По умолчанию

Цитата:
Сообщение от Beermonza
для начала слегка поменяйте название переменных, ...человеческий зрительный аппарат так устроен, что привыкает к похожести начальных нескольких символов
ну какая разница как названы переменные? не в этом дело то...

а вообще выше описанный мною способ с image3up и т.д. я нашел в одном исходнике. поэтому я даже не понимаю как это работает! может, надо как-то описать это... но как?
для меня идеальный способ был бы сказать если image2.picture='вверх.bmp' то...
но я узнал так сделать невозможно

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

Последний раз редактировалось Beermonza; 01.04.2009 в 16:02.
Titan123 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хорошие уроки Render Общие вопросы Delphi 9 15.09.2012 07:13
Акцесс вопросы новичков Yaga Помощь студентам 4 02.06.2008 00:16
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07