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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2009, 21:04   #221
NaoMao
Новичок
Джуниор
 
Регистрация: 21.02.2009
Сообщений: 1
По умолчанию

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

procedure Primer(A,B:TClass; Memo:TMemo);
begin
Memo.Lines.Add(ShowMes(A.n,1));
sleep(800);
while ((A.i>0) or (B.i>0)) do
begin
Memo.Lines.Add(ShowMes(A.n,2));
sleep(800);
Memo.Lines.Add(ShowMes(A.n,3));
sleep(800);
end;
end;

листинг процедупры находится в отдельном unit'е
и вызывается таким образом:

procedure TForm1.Button1Click();
var
At,Bt:TClass;
begin
Primer(At,Bt,Form1.Memo1);
end;

Вобщем вместо Sleep(800), что можно придумать, чтоб оно не мешало работе с программой?
NaoMao вне форума Ответить с цитированием
Старый 21.02.2009, 21:26   #222
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Можно попробовать втсавить Application.ProcessMessage в тело цикла, но это мало поможет.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 22.02.2009, 16:13   #223
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от NaoMao Посмотреть сообщение
... Вобщем вместо Sleep(800), что можно придумать, чтоб оно не мешало работе с программой?
Паузы почти секундные, по силам выполнить через Timer.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 24.02.2009, 08:18   #224
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

Игра на Canwas. Если игровой мир очень большей, то это дело будет не реально как-то загрузить. На загрузку карты в несколько то экранов уйдет много ресурсов. вот я думаю можно ли как то грузить только то, что находится в ближайшей видимости?
И еще если персонажей очень очень много в мире, то нужно обробатывать их всех на взаимодействие. Как можно сделать, чтобы проверялись на взаимодействие только те, которые находятся не очень далеко?
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 24.02.2009, 10:11   #225
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Цитата:
гра на Canwas. Если игровой мир очень большей, то это дело будет не реально как-то загрузить. На загрузку карты в несколько то экранов уйдет много ресурсов. вот я думаю можно ли как то грузить только то, что находится в ближайшей видимости?
Все это дело можно провернуть так, как сделала Bethesda в своих играх(Morrowind, Oblivion). Они разбили всю карту на небольшие куски и грузятся только те которые находятся рядом. Когда игрок выходит за пределы какого либо куска, то одни ресурсы высвобождаются, а на их место загружаются новые.
Цитата:
И еще если персонажей очень очень много в мире, то нужно обробатывать их всех на взаимодействие. Как можно сделать, чтобы проверялись на взаимодействие только те, которые находятся не очень далеко?
Проверяй только тех, кто находится в том куске где находится герой.

00000000
00011100
00012100
00011100
00000000
0 - не загруженый участок карты
1 - находится в памяти
2 - участок в котором находится гг.
Можно сделать, чтобы куски грузились в отдельном потоке, тогда можно избежать тормозов при переходе. Хорош для игр от первого лица, если добавить туман, который не позволит увидеть дальше загруженой области.

0000
0100
0000

Если в памяти держать всего один кусок, то придется ждать, пока загрузится следующий кусок, хоть в отдельном потоке, хоть прямо в игре. Но потребление ресурсов снизится. И этот вариант хорошо должен подойти для игр с видом сверху.

Еще можно применить частичную загрузку всей карты. Определить на каждом участки карты расстояние до гг. при котором должны грузиться объекты. Например расстояние 50 участков, грузить текстуру низкого качества и город, 20 кусков, грузить 2D деревья и пара крупных камне...(этот способ для вида от первого лица)

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

Очевидно, Лубышев намекает на РПГ, от третьего лица, карта ползет плавно в противоположные стороны перемещению, а персонаж все время в центре экрана.
Если персонаж игрока все время в центре, то самый верный способ следить за радиусом обзора и подгружать ресурсы карты по мере их видимости. Подгрузка секторов карты уместна для 3D игр, где плавающая камера может перемещаться вплоть до режима от первого лица.
Если игра однопользовательская, то следить за всеми юнитами не нужно, можно лишь делать иллюзию изменения их состояния, как только взор главного персонажа достигнет их.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 08.03.2009, 23:57   #227
Maxadal
 
Регистрация: 08.03.2009
Сообщений: 7
По умолчанию Плавное перемещение юнита в игровой матрице и разрешение конфликтной ситуации с иными обьектами.

Всем привет!... Решился написать простенькую стратежку. Начал писать алгоритм на бумаге и возникло пару вопросов. Ломал голову дня 2 ничего оптимального в голову непришло!... вот подумал спросить у профессионалов...
Имеется игровое поле реализованное в квадратной матрице. После реализации алгоритма для поиска пути возникает несколько вопросов по плавному передвижению юниотов. ПРи движениии обьекта из пункта А в пункт Б возникла проблема алгоритма (будем считать что путь перемещения найден и записан к примеру в динамический массив). Пусть свободные ячейки помечены нулём, занятые иными номерами. Наш юнит к примеру имеет номер занятости 2 (если смотреть игровое поле). При плавном передвижении юниота в очередную ячейку(по найденому свободному пути) нееобходима переместить его не за один игровой ход а к примеру за 10 что соответствует его скороси перемещения, те за 10 шагов мы должны переместиться в искомую клетку., казалось бы никаких проблем если бы не 1 но!... Что делать если юнит произвел 4 сдвига (из этих 10) и графически со смещением находиться ещё в начальной позиции матрицы но при этом и до конца не достиг следующей клетки(те следующей ячейки матрицы в его пути). Он как бы находиться и там и там. И происходит некое событие. К примеру если эта клетка ещё не помечена как занятая то на неё могут претендовать другие юниоты как для перемещения так и для иных действий(??? это так ???). Вопрос что делать если в такой ситуации. На эту же (2-ю клетку) претендует другой юнит то есть он тоже хочет проити через неё или он например частично находиться на ней а частично на другой при этом для упращения будем считать что размер обьекта соответствует размеру клетки матрицы... пожалуйста если кто знает как реализоватьь алгоритм или какую - нибудь идею по этому поводу напишите пожалуйста. ПРи этом хочеться отметить что желательно бы учесть тот факт что хочу чтобы это всё выглядело более реалестьично поэтому будем считать что на одной клетке не могут находиться более 1 юниота. Хотелось бы хотяб услышать идею по этой теме или что ещё лучше простенький пример по этому поводу или алгоритм!
Maxadal вне форума Ответить с цитированием
Старый 09.03.2009, 15:23   #228
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Допустим размер ячеек 50 х 50.Юнит находится в ячейке с координатами (Х=100,Y=100) и должен переместиться на на соседнюю ячейку
(150,100).По событию (нажатие клавиши вправо) делаете цикл и даете приращение по Х на 5 едениц.Получите плавное перемещение юнита.
Примерно так :
Код:
for i:= 1 to 10 do
begin
  // выводим фон вместо юнита в координате X,Y
  Х:= Х + 5;
  // в новых координатах выводим юнита (конечно желательно применять спрайты)
  // задержка (можно Sleep(50);)
end;
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 09.03.2009, 16:25   #229
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Maxadal, все очень просто. Физически матрица - модель карты, сектора, грубые для графики. Каждый переход на клетку сопровождается плавным смещением объекта на 1 пиксел по-X и/или по-Y в нужном направлении, причем, графически мы точно знаем размер одной клетки на экране, допустим это 50х50 (таил). Достаточно задать цикл смещения на пол размера тайла, ...считается если объект находится в некоторой клетке со смещением 0, то он будет в ней находиться, пока смещение в цикле не станет больше пол размера тайла, в этом случае будет считаться, что объект перешел на следующую клетку, но при этом получил отрицательное смещение, которое будет стремиться к нулю (центру клетки на экране). Как только смещение стало равным 0, объект останавливается, если это пункт назначения в модели. Посмотри вот этот пост http://programmersforum.ru/showpost....&postcount=164 ...далее после него в разделе есть и пример.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 10.03.2009, 15:19   #230
Maxadal
 
Регистрация: 08.03.2009
Сообщений: 7
По умолчанию

Предыдущие 2 ответа на мой вопрос тривиальны и не несут всебе необходимую информацию о сложившейся у меня проблеме ((( ... возможно я что-то не так обьяснил... теперь решил прикрепить 2 изабражения для полной оценки ситуации в ходе программы.. на первом рисунке изображена часть игрового поля (карты)... в ней я взял 3 елемента матрицы.. в верхней и нижней ячейках находиться по юниоту ... во 2-м изображении я показал ход их движения.. допустим юнит перемещаеться за 10 ходов в соседнюю клетку, это его скорость... допустим первым движение начал юниот1(или оба вместе)... так как запись его положения в пустую клетку произойдёт лишь когда он или они сделают по 5 перемещений из 10, то возникает вопрос как помечать и использовать такие клетки(в который он или они перемещаються)???... красный движеться к примеру сначала вниз а потом направо, а синиq только вверх или ещё как-нибудь, при этом нехотелось бы чтобы они находились в одной клетке вместе, как быть с отображением такого участка карты ведь клетка по центру сначала свободна и на неё движуться 2 или 3 юнита... а потом 1 из них перевым записался вэту клетку , что делать второму???... идти назад или как??? нехотелось бы также чтобы изображения этих юнитов накладывались друг на друга, или если юнит двидежеться к примеру со смещением влево на 5 шагов то он естественно будет "задевать" соседние элементы, что если на них переместиться некий обьект???
Изображения
Тип файла: bmp ю1.bmp (22.3 Кб, 247 просмотров)
Тип файла: bmp ю2.bmp (22.3 Кб, 209 просмотров)
Maxadal вне форума Ответить с цитированием
Ответ


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

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

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


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