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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2008, 22:05   #161
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

у меня возникла такая проблема: как заставить юнита идти в нужную точку? ну с прямой это просто и понятно:
Код:
while (man.x<>click_x)and(man.y<>click_y) do begin
     man.x:=man.x+speedx;
     man.y:=man.y+speedy;
end;
а вот как сделать движение по карте? если клетка по размеру гораздо больше игрока? ну то есть объясните, как сделать переход просто в соседнюю клетку(без диагоналей).
Упс...
L_M вне форума Ответить с цитированием
Старый 03.08.2008, 00:10   #162
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Возвращаясь к напечатанному...

Возвращаемся к посту #155, еще раз разбираем код:

Код:
 procedure TForm1.Timer1Timer(Sender: TObject);  
 begin  
   for i:=0 to 255 do  // количество юнитов 256
     begin  
       with UnitMas[i] do  // работаем с массивом
         begin  
           if UUses and UGo then  // если юнит используется и он может перемещаться
             begin  
               if UPosX<>UPointX then // если его текущая позиция на карте по-X не равна той которая указана (куда он должен перейти)
                 begin  
                   if UPointX>UPosX then UDispX:=1;  // если новая позиция правее, то будем прибавлять координате 1
                   if UPointX<UPosX then UDispX:=-1; // если новая позиция левее, то будем отнимать 1 (прибавлять минус единицу)  
                   if (UMoveX>{половина длины тайла}) Or (UMoveX<-{половина длины тайла}) then  // вот тут у нас размеры одной клетки всплывают,
// задаем половину и юнит будет топать столько пикселей, сколько нужно до перехода на следующий тайл (клетку карты).
                     begin
                       //  по завершению перехода текущая позиция меняется
                       // смещение обнюляется
                       UMoveX:=0;  
                       UPosX:=UPosX+UDispX;  
                     end;
                   // тут мы "двигаем" юнита на один пиксел в нужном направлении  
                   UMoveX:=UMoveX+UDispX;  
                 end  
               else UMoveX:=0;  
               
// по оси Y аналогично, только лишь через UDelay смещаем во времени сдвиг ровно в два раза относительно X                 
               if UPosY<>UPointY then  
                 begin  
                   if UPointY>UPosY then UDispY:=1;  
                   if UPointY<UPosY then UDispY:=-1;  
                   UDelay:=UDelay+1;  // вот сдвиг
                   if UDelay>1 then  
                     begin  
                       UDelay:=0;  
                       if (UMoveY>{половина высоты тайла}) Or (UMoveY<-{половина высоты тайла}) then  
                         begin  
                           UMoveY:=0;  
                           UPosY:=UPosY+UDispY;  
                         end;  
                       UMoveY:=UMoveY+UDispY;  
                     end;  
                 end  
               else UMoveY:=0;  
             end;


           ...



        end;  
     end;  
 end;
Если вы создали модель уровня (карту) и модель юнита, создали одну запись в массиве - включили юнита, то по процедуре описанной в посте #155 юнит идет в любую точку карты, которую вы задали при помощи мышки, через формулу интерпретации координат мыши в координаты карты, причем, направление перемещения юнит меняет сам.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.06.2013 в 16:37.
Beermonza вне форума Ответить с цитированием
Старый 05.08.2008, 14:56   #163
Titan123
Форумчанин
 
Аватар для Titan123
 
Регистрация: 27.06.2008
Сообщений: 113
По умолчанию

пожалуйста, напишите урок по создании крестиков-ноликов. хотя бы простейших 3*3
разбираю исходники, не понимаю кода!
Titan123 вне форума Ответить с цитированием
Старый 05.08.2008, 17:06   #164
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Titan123, а что именно непонятно? Давайте первый непонятный кусок кода.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 05.08.2008, 21:03   #165
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Titan123, тебе нужно поучиться алгоритмы составлять. Не обязательно на играх, любые задачки подойдут. Есть книжки такие с задачками и с их алгоритмами, например "200 задач на С/С++", может для Дельфи такие есть, но язык не важен, также как и среда, хоть в КьюБейсике, главное - алгоритмы.
Иначе у тебя будут постоянно подобные вопросы.

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

Урок писать это долго, лучше приведи непонятный кусок кода (переменные не потеряй только). Хотя если на работе завтра нечем будет заняться, напишу крестики нолики 3х3 (никогда раньше не делал и код не видел, интересно что получится).
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 вне форума Ответить с цитированием
Старый 05.08.2008, 23:16   #166
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

Народ, помогите мне пожалуйста. У меня неправильно ищется маршрут - приходит в другое место перс. И еще просьба: напишите еще несколько уроков по играм, например про оптимизацию, хранение различных ресурсов.
Вот что у меня пока получается:
Вложения
Тип файла: zip Копия 1.zip (11.7 Кб, 91 просмотров)
Упс...
L_M вне форума Ответить с цитированием
Старый 06.08.2008, 00:09   #167
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

L_M, уже обсуждали, причем привели несколько вариантов.
http://www.programmersforum.ru/showt...3612#post53612
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 вне форума Ответить с цитированием
Старый 06.08.2008, 10:13   #168
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Насчет оптимизации. Это очень обширная тема про которую можно не один том написать. Советую начать с изучения архитектуры компьютера. Когда знаешь как работает твое железо, то можно и оптимальную для него программу написать.
Хранение различных ресурсов - это уже не раз обсуждалось, поиск по форуму или Google.
Kostia вне форума Ответить с цитированием
Старый 06.08.2008, 15:11   #169
Titan123
Форумчанин
 
Аватар для Titan123
 
Регистрация: 27.06.2008
Сообщений: 113
По умолчанию

я писал крестики-нолики, составил несколько десятков комбинаций противника, кода получилось очень много, рассматривая другой исходник К-Н я понимал, что делаю неправильно.
у меня все банально: например,
Код:
if  (panel1.caption='0') and (panel5.Caption='0') and  (panel9.Caption<>'x') then begin panel9.caption:='0'; end
else begin
if  (panel9.caption='0') and (panel5.Caption='0') and  (panel1.Caption<>'x') then begin panel1.caption:='0'; end
.........
panel и-это и есть игровое поле.
но это все неверно.

выкладываю не мои К-Н, может, вы объясните мне о чем там говориться.
Вложения
Тип файла: rar Krestik_nolik.rar (24.9 Кб, 60 просмотров)
Titan123 вне форума Ответить с цитированием
Старый 06.08.2008, 19:19   #170
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

To L_M

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

Я предложил простейший пример движения персонажа, мне кажется он самый простой в понимании и реализации, ...вот так он выглядит на практике:

0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 Т 0 0 0 0 0
0 0 0 0 0 0 0 0 | 0 0 0 0 0
0 0 0 0 0 0 0 0 | 0 0 0 0 0
0 0 0 0 0 0 0 / 0 0 0 0 0 0
0 0 0 0 0 0 / 0 0 0 0 0 0 0
0 0 0 0 0 / 0 0 0 0 0 0 0 0
0 0 0 0 П 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0


П - текущие координаты персонажа
Т - точка, куда нужно переместиться

Логика

Зная координаты персонажа и новой точки нужно сравнивать поочереди X и Y.

Код:
if UPointX>UPosX then UDispX:=1;
if UPointX<UPosX then UDispX:=-1;
...
if UPointY>UPosY then UDispY:=1;    
if UPointY<UPosY then UDispY:=-1;
Теперь остается только каждый такт прибавлять найденные сдвиги, пока каждая из координат персонажа не станет равной координатом указанной точки:

Код:
if UPosX<>UPointX then
  begin
    UPosX:=UPosX+UDispX;
  end;
...
if UPosY<>UPointY then
  begin
    UPosY:=UPosY+UDispY;
  end;
Это самый грубый вариант, перемещение сразу на клетку, ...а как сгладить вы уже видели выше
Настоятельно рекомендую попробовать
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


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

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

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


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