2012-05-12 4 views
1

Я в настоящее время делаю потрясающую (на мой взгляд) игру с зомби, и мне нужно знать, как сделать камеру. Я использую библиотеку Slick2d вместе с MarteEngine для java.Камера для 2d игры

Я немного новичок в java и прыгнул прямо в библиотеку, прежде чем действительно углубляться в качели и, таким образом, это, вероятно, отсутствие знаний о графике. Я читал в учебнике, что вы не можете переместить окно игры на карте, поэтому вместо этого вам нужно переместить карту и объекты, чтобы они выглядели как движущиеся камеры.

Если бы я сделал это так, похоже, это было бы очень ресурсоемким. Мне нужно было бы пропустить всех зомби, выживших, объект, hitbox и т. Д., Чтобы переместить их координаты. Я уже пробовал этот метод один раз, и на самом деле скорость не двигалась одинаково. Возможно, это связано с тем, что я обрабатывал его с разными скоростями обновления.

Я видел несколько вещей при использовании graphics.translate, но я этого не понимаю. Поэтому любые предложения по перемещению камеры были бы замечательными! Заранее спасибо.

+1

Вы также можете посмотреть здесь http://gamedev.stackexchange.com/questions/53541/sidescrolling-troubles/53617#53617 – Savlon

ответ

11

Вы можете определенно переместить камеру. См. my answer to this question, в котором объясняется, как перемещать камеру, отображать мир относительно указанной камеры и некоторые другие полезные советы о том, как это сделать и как решать , что рисовать на экране при движении камеры.

Хотя вполне возможно использовать translate(x, y), это само по себе не решает проблемы отсечения (как узнать, что рисовать на экране), и это не все. Кроме того, когда вы думаете об этом, действительно нет большой разницы между переводом поверхности и перемещением камеры. Это все относительно, и пока пиксели движутся в правильном направлении, не имеет большого значения, если вы «перемещаете камеру по отношению к миру» или «перемещаете мир относительно камеры» - они по существу, та же операция.

Что касается Swing, то be glad you didn't start there. Swing предназначен для настольных приложений с окнами, меню, кнопками, сложными системами событий и т. П. По ряду причин Swing ужасен для игр, не последним из которых является то, как работает конвейер рендеринга в Swing; это прекрасно для настольных приложений, но становится яростью отчаяния для игр и большинства типов рендеринга, которые должны быть в режиме реального времени и интенсивной графики. Все в порядке, потому что Swing не был создан для решения проблем разработчиков игр.

+0

Удивительный. Это правильный ответ. –

+0

Спасибо за это, ваш пост потрясающий. Таким образом, в основном камера будет видовым экраном игры, и вы визуализируете все, что компенсируется этим окном? Итак, если моя камера начинается с (0,0), и я перемещаю ее (100 100), то я бы что-то первоначально в (40,40) на (140,140) сейчас? – Paha

+0

Этот последний комментарий был ужасно неправильным. Я имел в виду, что если вы «переместите» свою камеру на (40,40), тогда объект приблизится к вам на 40 и 40. И тогда только визуализируйте ее, когда она находится внутри диапазона камеры. – Paha

2

Возможно, вы ищете метод translate(x, y) класса Graphics. Этот метод доступен как из стандартного класса Java Swing/AWT Graphics, так и для версии Slick2D, поэтому имейте в виду, что это не специфичная для Slick2D функция.

Что такое перевод, это перемещение начальной точки всех будущих операций рисования. Что это значит? Ну, имейте в виду, что точка происхождения обычно находится в (0, 0). Таким образом, притяжение точки в позиции (40, 50) будет направлено на положение экрана (40, 50). Однако translate() перемещает эту опорную точку, что, в свою очередь, влияет на все остальные операции рисования.

Например, если translate(50, 60) будет перемещать точку начала координат на 50 пикселей вправо по оси x и на 60 пикселей вниз по оси y (поскольку в компьютерном программисте более высокие значения y ниже на экране). Затем, нарисуя точку в точке (40, 50), на самом деле рисует на экране (40 + 50, 50 + 60) или (90, 110). Это сила использования translate().

Обычно рекомендуется переместить исходную точку обратно (0, 0) после того, как вы закончите рисование, или что-то может быть испорчено. Однако выполнение translate(0, 0) не выполнит эту задачу и фактически ничего не сделает абсолютно. Это связано с тем, что метод перевода перемещает начало координат в относительно. Вместо этого просто убедитесь, что для каждого звонка translate(x, y) у вас есть другой звонок translate(-x, -y). Это не позволит исходной точке выйти из-под контроля.

Если вы хотите использовать этот метод для того, чтобы камера следила за одним из ваших объектов, важно заметить, что вы хотите перевести начало координат, используя отрицательное значение позиции этого объекта. Например, чтобы следовать за игроком с позиции вектора «поз»:

g.translate(-player.pos.x, -player.pos.y); 

// Render everything 

g.translate(player.pos.x, player.pos.y); 

Это происходит потому, что вы хотите, чтобы фон двигаться влево, когда игрок перемещается вправо, в противном случае вы будете иметь все, следующий за игрок.

+0

Удивительное объяснение, спасибо. Другой вопрос ... если бы я не хотел, чтобы меня переводили, как бы я справился с этим? MarteEngine в основном добавляет все в один мир, поэтому, если я переведу весь мир, если он ВСЕГДА (это потрясающе), но я создал объект интерфейса, который также перемещается. Опять же, спасибо за прекрасное объяснение; – Paha

+0

@Paha Нет проблем, поэтому этот сайт существует. :) Во всяком случае, единственный способ удержать что-то от перевода - либо (1) отменить перевод, пока вы рисуете этот объект, либо (2) вычесть начало перевода из точки, где вы нарисовываете блок, чтобы отрицать эффекты перевода. –

+0

Хмм не уверен, могу ли я использовать перевод тогда. MarteEngine auto делает все для меня, а это значит, что мне придется пойти и переопределить все рендеры. Он также отбрасывает методы вращения моего героя. Я буду продолжать работать с ним и посмотреть, что я могу сделать. – Paha

Смежные вопросы