После долгого перерыва из-за плотной череды заказов, рад сообщить что нашёл время для личных проектов.
И первым же делом поспешил к реализации новых задумок касаемых Asteroids Online.
За последние две недели я переписал сетевую начинку сервера и клиента, добавил в процесс игры новые элементы и применил новый арт.
Обо всём об этом поподробнее...
Во первых я сурово переписал всё на TCP/IP как и обещал.
Во время тестирования процесса под новым протоколом произошла очень некрасивая ошибка памяти "на ровном месте"... Я был в недоумении и весьма подавлен и если бы не ряд моих сетевых наработок и разработанных приложений, то я бы наверное заморозил проект до озарения или пока не пришло бы желание переписать всё. Проблема заключалась в том, что когда я зажимал кнопку стрельбы и кол-во пуль доходило до определённого кол-ва происходила ошибка на сервере из-за того, что буфер посылаемых данных сокета почему-то принимал размер примерно в 1 гигабайт...
После 2-х дней передряг всё разрешилось само вследствие моих переписок классов пакетов и менеджеров миров... Честно говоря я сам так и не понял уверенно где была ошибка.
У меня было две версии, которые как я догадываюсь работали сообща:
1) вероятнее всего всё было из-за использования типа word для кол-ва объектов в пакете заместо типа со знаком, например integer.
И в таких моментах
for i := 0 to Count(тот самый word) - 1...
вообщем сами знаете что бывает когда без знаковое становится меньше нуля.
2) был какой-то касяк в операции move(Mas[i], Buf[n], Size) когда Mas являлся массивом определённых типов, который и был заполнен с ошибкой из пункта 1, а Buf - байтовый массив.
Вот и набивался пакет нереального размера неизвестными кусками памяти, а потом ещё и в буфер засылался. Вообщем по невнимательности неуглядел такую ерунду...
Думаю не лишним будет напоминание читателям быть повнимательнее к таким мелочим.
Ну, благо то, что это недоразумение так или иначе миновало)
И так, TCP/IP на первых тестах оказался нисколько не медленнее UDP и таким образом в этой переписке одни только плюсы)
Кстати я переименовал игру в более компактное название) Теперь это просто Asteroids Online)
Теперь про процесс игры.
Добавил кораблику новый вид оружия - лазер, который можно видеть на заглавной картинке. Лазер будет самым быстрым и самым слабым оружием, далее по урону будет уже знакомая плазма, но и будет медленнее, а самым мощным будет третье оружие, которое я пока не буду раскрывать)
Объектам не сферической формы(корабль, некоторые астероиды, лазер) организовал точечное определение границ, об этом процессе стоит написать отдельную тему я думаю. Добавил фоновую музычку, чтобы не так тихо было тестить) Для этого использовал библиотеку Squall.dll версии 1.48(если есть новее - дайте знать).
Всё это я тестирую в одиночной игре, сделав её временно через сервер))
Астероиды летают, кружатся, корабли стреляют, теперь дело стоит за коллизией, онлайн игрой, оружием - плазмой, третьим оружием, миникартой и можно будет уже организовывать обновление и выкладывать клиент, чтобы желающие могли наблюдать за процессом дальнейших улучшений уже непосредственно.
И в завершении обзора обновлений стоит отметить некоторые элементы нового арта, сделанного специально для игры дизайнером и художницей Azumi.
Главное меню пока что выглядит так(подлежит переделке):
А вот кораблик удирает от двух астероидов(тут всё кроме кораблика уже своё):
Ну и всё пока)
Надеюсь всем понравилось)
И первым же делом поспешил к реализации новых задумок касаемых Asteroids Online.
За последние две недели я переписал сетевую начинку сервера и клиента, добавил в процесс игры новые элементы и применил новый арт.
Обо всём об этом поподробнее...
Во первых я сурово переписал всё на TCP/IP как и обещал.
Во время тестирования процесса под новым протоколом произошла очень некрасивая ошибка памяти "на ровном месте"... Я был в недоумении и весьма подавлен и если бы не ряд моих сетевых наработок и разработанных приложений, то я бы наверное заморозил проект до озарения или пока не пришло бы желание переписать всё. Проблема заключалась в том, что когда я зажимал кнопку стрельбы и кол-во пуль доходило до определённого кол-ва происходила ошибка на сервере из-за того, что буфер посылаемых данных сокета почему-то принимал размер примерно в 1 гигабайт...
После 2-х дней передряг всё разрешилось само вследствие моих переписок классов пакетов и менеджеров миров... Честно говоря я сам так и не понял уверенно где была ошибка.
У меня было две версии, которые как я догадываюсь работали сообща:
1) вероятнее всего всё было из-за использования типа word для кол-ва объектов в пакете заместо типа со знаком, например integer.
И в таких моментах
for i := 0 to Count(тот самый word) - 1...
вообщем сами знаете что бывает когда без знаковое становится меньше нуля.
2) был какой-то касяк в операции move(Mas[i], Buf[n], Size) когда Mas являлся массивом определённых типов, который и был заполнен с ошибкой из пункта 1, а Buf - байтовый массив.
Вот и набивался пакет нереального размера неизвестными кусками памяти, а потом ещё и в буфер засылался. Вообщем по невнимательности неуглядел такую ерунду...
Думаю не лишним будет напоминание читателям быть повнимательнее к таким мелочим.
Ну, благо то, что это недоразумение так или иначе миновало)
И так, TCP/IP на первых тестах оказался нисколько не медленнее UDP и таким образом в этой переписке одни только плюсы)
Кстати я переименовал игру в более компактное название) Теперь это просто Asteroids Online)
Теперь про процесс игры.
Добавил кораблику новый вид оружия - лазер, который можно видеть на заглавной картинке. Лазер будет самым быстрым и самым слабым оружием, далее по урону будет уже знакомая плазма, но и будет медленнее, а самым мощным будет третье оружие, которое я пока не буду раскрывать)
Объектам не сферической формы(корабль, некоторые астероиды, лазер) организовал точечное определение границ, об этом процессе стоит написать отдельную тему я думаю. Добавил фоновую музычку, чтобы не так тихо было тестить) Для этого использовал библиотеку Squall.dll версии 1.48(если есть новее - дайте знать).
Всё это я тестирую в одиночной игре, сделав её временно через сервер))
Астероиды летают, кружатся, корабли стреляют, теперь дело стоит за коллизией, онлайн игрой, оружием - плазмой, третьим оружием, миникартой и можно будет уже организовывать обновление и выкладывать клиент, чтобы желающие могли наблюдать за процессом дальнейших улучшений уже непосредственно.
И в завершении обзора обновлений стоит отметить некоторые элементы нового арта, сделанного специально для игры дизайнером и художницей Azumi.
Главное меню пока что выглядит так(подлежит переделке):
А вот кораблик удирает от двух астероидов(тут всё кроме кораблика уже своё):
Ну и всё пока)
Надеюсь всем понравилось)



Клево-клево :) Мне нра!:)
ОтветитьУдалитьРад, что проект не заброшен, постараюсь быть в первых рядах тестеров.
Насчет for i := 0 to Word - 1... Если i объявлено как integer, то тут проблем быть не должно, ибо выражение Word - 1 должно высчитываться в integer... Впрочем, могу и бессовестно врать на этот счет.
Move() это вообще страшная операция в неумелых руках. В бытность работы с simsmen-ом над его с duncon-ом движком писал smd-загрузчик. В одном месте не очень красиво поступил с Move (сходу не разобравшись в хитрых архитектурных динамических массивах simsmen-а), в результате чего прога вылетала в самых неожиданных местах. Бился неделю, показал simsmen-у, ну а мастер конечно же сходу показал ошибку :)
С тех пор десять раз проверяю верность указателя, SizeOf() и прочего.
Еще раз - успехов и движений в проекте дальше!
Спасибо, Daemon)
ОтветитьУдалитьНасчёт цикла, то правая часть не приводится к типу левой.
А move() только сделала своё дело - забила память)
Я ваще move() уже считаю своей родной процой) Потому что на серверах все пакеты формирую исключительно с помощью неё.
Арт клёвый=) Скорее бы затестить игру. Будем ждать) Успехов в разработке. Хорошо что появилось на проект свободное время.
ОтветитьУдалить