![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#321 |
Регистрация: 20.12.2007
Сообщений: 3
|
![]()
to Beermonza:
А можно ли примерчик? (код на Delphi или на С/C++) У меня возникла сложность как раз в определении тайла, на который я "кликаю". До этого я разрабатывал игры с ограниченым числом тайлов. Т.е. с размером, например, 20x20... (Настольные игры) Где вычисление тайла происходит следующим образом: 1. Определяю координаты курсора. 2. Определяю к какому тайлу (ромбу) принадлежит точка курсора.. (В отдельном массиве хранится координаты верхней точки тайла.) Попробывал созадь карту по технологии выше описаной... И при создании карты, например, 100x100 определение тайла теряется... ![]() Последний раз редактировалось Tenray; 23.12.2007 в 04:13. |
![]() |
![]() |
![]() |
#322 | |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]() Цитата:
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)
Проверь себя! Онлайн тестирование | Мой блог |
|
![]() |
![]() |
![]() |
#323 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]()
to Tenray
Ошибок быть не должно, если вся карта целиком входит в область видимого (зона игры). Если же карта не умещается и есть полосы прокрутки, тогда следует прибавлять к определившимся по формуле координатам текущее значение элемента прокрутки. Код:
Допустим, мы сдвинули карту на 5 клеток влево (карта уходит за левый конец игровой зоны), тогда область видимого уже начинается с 5-й клетки карты, расчет координат ведется от нее, т.к. ОНА у нас теперь базовая, а не 0-я. Очень удобно использовать клавиатурный сдвиг карты. В этом случае в процедуре OnKeyDown задаются условия на границы видимого и выполняются простые прибавления к текущей "базовой" координате единицы, или вычитание. Вот пример: Код:
Теперь координаты будут всегда правильно определены с движением мыши, дальше действия OnClick или тот же KeyDown. К сожалению, простого примера нет, а сложный требует множества ресурсов (по количеству конечно) и вырезать интересующие моменты не представляется возможным (очень легко запутать).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 28.03.2010 в 19:26. |
![]() |
![]() |
![]() |
#324 |
Регистрация: 20.12.2007
Сообщений: 3
|
![]()
Спасибо за подсказки, ребята.. Попробую немного переделать...
|
![]() |
![]() |
![]() |
#325 |
Пользователь Подтвердите свой е-майл
Регистрация: 02.01.2007
Сообщений: 62
|
![]()
Привет всем, я недавно начал учить C++Builder и писать простенькую 2D игру. И мне интересно как вы будете всё это превращать в online (скажем чтоб каждый мог видеть передвижение другого игрока). Я сделал так:
1) Игрок жмёт w 2) через clientsocket/sendtext на сервер отправляется "#sendpl#(nick)#(куда, если w то - up) 3) Сервер пережевывает и кидает всем клиентам что делать (подвинуть картинку image1 на 5 вверх) -) Всё работает, но вот пока ходит один игрок, второй не может. Если уже придумали и не жалко поделиться скажите пожалуйста. |
![]() |
![]() |
![]() |
#326 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]()
Вообще, все банально просто. По стандартной схеме клиент-сервер-клиенты. Нюансы в алгоритмах приема и отправки данных.
Клиент. Система клиента строится на дискретных пакетах. Нажав некоторую клавишу, мы создаем команду, в которой зашифрованы основные параметры: координаты места положения, координаты точки назначения, сопутствующие характеристики объекта. Команды идут не текстовые, а наборами байт (буферы). Идентификация происходит по их длине и содержимому, так же узнаются источники команд. Проверка отправляемых команд исключает их идентичность, т.е. если много раз тыкать одну кнопку, указывая в одно и то же место, или выполняя атаку, больше раз в интервал времени чем положено, то ничего отправляться на сервер не должно. Промежуточные команды стробирования отправляются на сервер, чтобы избежать разсинхронизации. Сервер. Масса условий на прием и отправку должна устранять все лишнее и не нужное, снижая трафик. Например, если поступила команда от некоторого клиента, то сервер автоматически должен рассчитать область карты, в которой его можно видеть другим клиентам, и отправлять измененные координаты только клиентам, находящимся в этой области карты. На сервере должна быть организована очередь выполнения команд, так называемая "доска объявлений". Просматривая ее, сервер сам решает что выполнять, а что можно "отсеять". Алгоритм достаточно сложный, один из вариантов строения из теории Экспертных систем. По подробнее об отправке команд (у нас Delphi, но и С++ тоже можно, все понятно будет). Возможно, у Вас алгоритм построен так, что канал занимается одним клиентом, и сервер не может принимать команды других клиентов, поскольку "слушает" постоянно одного. Такого быть не должно.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
![]() |
![]() |
![]() |
#327 |
Пользователь Подтвердите свой е-майл
Регистрация: 02.01.2007
Сообщений: 62
|
![]()
Клиент
Код:
Код:
Код:
P.S. Пожалуйста не пугайтесь моего кода, я недавно начал учить C++builder и эт единственный способ который я увидел. ![]() |
![]() |
![]() |
![]() |
#328 | |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]() Цитата:
Выход. Использование Socket -> ReceiveText(); в Вашей процедуре сервера является ошибочным. Эта команда принимает пакет от любого из клиентов, и не дает возможности серверу "прослушать" всех клиентов, поскольку она выполняется постоянно. Следует ввести стробирование, ...создать общий цикл на число пользователей, в нем применить команду ServerSocket1-> Socket -> Connections[i] -> ReceiveText(); , т.е. слушать конкретного клиента и выполнять действия, что у Вас прописаны. Таким образом, сервер по порядку "прослушает" всех до ServerSocket1-> Socket -> ActiveConnections и перейдет опять к первому и так команды всех клиентов будут выполняться. Но, не исключено, когда пользователей станет побольше, чем 100 понадобится синхронизация, да и не только из-за числа клиентов, сколько из-за проблем в каналах (провайдерские глюки), ...ведь от выполнения первой команды первого клиента до его второй команды (по циклу сервера) пройдет достаточно времени, чтобы на ПК клиента персонаж ушел дальше, чем его успел "передвинуть" сервер и отослать остальным. Значительно эффективнее передавать не команду движения, а вообще, какие либо изменения в нем: движется ли еще в том же направлении или уже сменил его. Сервер при этом должен отсчитывать такт изменеий, и останавливать все действия, если при очередном "прослушивании" клиента ничего не "услышит". Кроме того, полезно ввести таймаут на выполнения "цикла прослушивания", лишние команды не нужны, если они пытаются двигать объекты быстрее, чем это заложено в анимации и физике движений.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
|
![]() |
![]() |
![]() |
#329 |
Пользователь Подтвердите свой е-майл
Регистрация: 02.01.2007
Сообщений: 62
|
![]()
Спасибо большое!
![]() Но если вам не трудно, я вас ещё немного помучаю глупыми вопросами. Я так понял сервер должен делать примерно это?! Код:
|
![]() |
![]() |
![]() |
#330 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]()
На Delphi процедура "прослушивания" всех клиентов выглядела бы так:
Код:
Думаю, на C++ переложить не трудно, как точно синтаксис я не в курсе. Ну, тут нужна конкретика, ...в какую форму? ...в какой объект? ...для чего? ...какие требования?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 05.01.2008 в 21:07. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Уроки по созданию игр для новичков... | -=DeS=- | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 750 | 14.11.2017 20:26 |
Музыка программистов - как вы относитесь к АРИИ? | Весёлый Жека | Свободное общение | 46 | 10.10.2008 22:32 |
Конкурсы по созданию игр на Delphi | mutabor | Свободное общение | 0 | 15.06.2007 12:40 |
Работа по созданию ПО | remix | Фриланс | 3 | 22.04.2007 11:00 |