forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на BlitzMax (http://forum.boolean.name/forumdisplay.php?f=106)
-   -   Vivo (http://forum.boolean.name/showthread.php?t=16218)

Nikich 10.03.2012 16:53

Ответ: Vivo
 
Я все же решил сделать по-другому. Переделаю игру в 3D, и вместо картинок будут спрайты, чтобы не изобретать велосипед.

Mhyhr 10.03.2012 17:36

Ответ: Vivo
 
Nikich, всегда в таких случаях двигается камера(точнее - это манипуляции с матрицами). В 2D камерах ортогональная проекция.(в Blitz3D вроде тоже есть ортогональный режим.).Вот и все различия. Как раз и спрайты пригодятся.

Nikich 10.03.2012 18:02

Ответ: Vivo
 
ну не знаю, ничего о камерах в 2Д в блитце я не слышал. Может есть сторонние библиотеки, но я ими не пользуюсь.

Spy4433 10.03.2012 18:30

Ответ: Vivo
 
есть origin x,y или как то так команда попробуй ее

но в этом случае гуи и персонаж надо ценровать отсноительно сдвига )

FireOwl 11.03.2012 16:47

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 222399)
ну не знаю, ничего о камерах в 2Д в блитце я не слышал. Может есть сторонние библиотеки, но я ими не пользуюсь.

Ты же не хочешь сказать, что ждешь готовой команды "СоздайтеМнеКамеруВ2Д()"?

Это реализуется двумя-тремя операторами.

Дано:
-блоки, каждый имеет свои координаты относительно точки отсчета (0,0). Эти координаты изменяться НЕ БУДУТ.
-игрок, который тоже имеет координаты, относительно точки отсчета (0,0).
-воображаемая камера которая должна:
--висеть над тем местом, которое задано ее координатами (относительно точки отсчета (0,0))
--показывать соответствующие блоки

Координаты игрока будут совпадать с координатами камеры, в случае жесткой привязки (тогда игрок будет всегда по центру экрана)
Или немного плавать относительно координат камеры, если нужна плавная смена направления (камера "летает" за игроком).

Заводим две переменные: camera_x, camera_y

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

If block.x>0 and block.x<640 then
        if block.y>0 and block.y<480 then
                drawimage img_block, block.x, block.y
        endif
endif

Надо изменить это условие примерно так:
Код:

If block.x>camera_x and block.x<(camera_x+640) then
        if block.y>camera_y and block.y<(camera_y+480) then
                drawimage img_block, block.x-camera_x, block.y-camera_y
        endif
endif

Не так уж и сложно.

Nikich 11.03.2012 17:32

Ответ: Vivo
 
Гм. А какой способ лучше? Через origin короче, но двигать начало системы координат подозрительно.
Хотя команды "БыстроМнеКамеруЗапилил()" явно не хватает.
UPD
И почему координаты ГГ должны совпадать с координатами камеры? Ведь тогда игрок за экран сможет убежать.

reumep 11.03.2012 22:06

Ответ: Vivo
 
Цитата:

Сообщение от Nikich (Сообщение 222477)
Гм. А какой способ лучше? Через origin короче, но двигать начало системы координат подозрительно.
Хотя команды "БыстроМнеКамеруЗапилил()" явно не хватает.
UPD
И почему координаты ГГ должны совпадать с координатами камеры? Ведь тогда игрок за экран сможет убежать.

тогда наилучшая команда "СделатьИгруЗаипцаКакЯХочу()"

Nikich 11.03.2012 22:37

Ответ: Vivo
 
Кстати, все еще требуется помощь в создании сайта.

Жека 12.03.2012 05:36

Ответ: Vivo
 
Самое простое делать через Origin. Делаешь для карты Origin(scrollX, scrollY), а для гуи возвращаешь в начало Origin(0,0).

Nikich 12.03.2012 17:27

Ответ: Vivo
 
Вложений: 1
Опять проблемы. Что-то они зачастили. Возможно, вы слышали о такой игре ProjectZomboid, если инет, скачайте и поиграйте она того стоит. Но не в этом дело. Поговорив с геймдизайнером, мы пришли к мнению, что графику стоит сделать изометрическую. И сразу же возник вопрос. Это довольно трудно объяснить тем кто не играл, но я попробую. У нас есть одна стена, через неё пройти мы не можем. Если мы расположим ее на одном тайле, то всё прекрасно и понятно, но тогда она будет уж слишком толстой. Разработчики этой игры думали также, и сделали стены идеально плоскими, разместив их между(!) тайлами. То есть их ширина равна одному пикселю. В этом и есть вопрос: как же тогда делать коллизию, если она не занимает не один тайл? Если я не смог объяснить, поиграйте в эту игру и попробуйте обойти стены домов, тогда станет понятно.

Spy4433 12.03.2012 19:47

Ответ: Vivo
 
ну сделать проверку пересечений линия :) если правильно понял

(про стенки) ?

Nikich 12.03.2012 20:46

Ответ: Vivo
 
Не, это муторно. Тогда придется в основании каждой стенки рисовать еще линии. Должно быть что-то проще.

Жека 13.03.2012 06:57

Ответ: Vivo
 
Мне такой вариант подумался.

Сделать плитки объектами (Type), задать им свойства "наличие стенки на краю плитки" по четерём направлениям. (id тайла тоже сюда, если уместно)
Field walls%[4] ;0 - нет стены, 1 - есть

А потом, когда игрок решит покинуть текущую плитку (curCell), делать проверку стенки в нужном направлении (direction).
if(curCell\walls[direction]<>0) Return ;есть стена, никуда не двигаемся

direction = {0,1,2,3} - заранее заданные константы направления, 0 например вверх и далее по часовой стрелке (как уж условишься сам).

Nikich 13.03.2012 10:01

Ответ: Vivo
 
Так тоже не катит. Этот способ хорош, если ГГ пытается перейти с клетки со стенкой на свободную клетку. А если наоборот то фиг. Тогда придется еще просчитывать какая у него следующая клетка.

FireOwl 13.03.2012 13:25

Ответ: Vivo
 
Ну так у клетки на которой стоит человечек тоже можно прописать этот параметр для той же стенки. Только надо еще отдельно хранить где-то массив этих стенок, ведь они могут быть разных типов (камень, кирпич, дерео, дверь, окно и т.д.)


Часовой пояс GMT +4, время: 10:42.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot