Я делаю тестовую игру, где хочу, чтобы уровень постоянно прокручивался. Чтобы создать этот эффект, я установил класс камеры, который просто хранит позицию вектора и направление перечисления. Он также содержит публичный метод «перемещения», который просто меняет позицию с фиксированной ставкой. Затем я использую эту позицию при циклическом просмотре массива плиток при рисовании. Это все отлично работает.
Однако мне сказали, что я должен использовать матрицу Transform для перемещения камеры, и что я должен предоставить это при запуске spritebatch. Я немного запутался.) Как это работает? как будто я даю его только тогда, когда начинается spritebatch, как он знает, что нужно продолжать менять позицию? б.) Почему так же, как и раньше, мне все еще нужно положение камеры, когда я перебираю плитки?
В настоящий момент я не могу заставить его работать, но это не удивительно, так как я не совсем понимаю, как это должно работать. В настоящее время в моей попытке (код для подражания) изменяемые плитки изменяются, что означает, что положение камер меняется, но положение области просмотра остается неизменным (т.е. в начале координат камеры). Я был бы очень признателен за совет / руководство о том, как его следует использовать?
камера:
class Camera {
// The position of the camera.
public Vector2 Position {
get { return mCameraPosition; }
set { mCameraPosition = value; }
}
Vector2 mCameraPosition;
public Vector2 Origin { get; set; }
public float Zoom { get; set; }
public float Rotation { get; set; }
public ScrollDirection Direction { get; set; }
private Vector2 mScrollSpeed = new Vector2(20, 18);
public Camera() {
Position = Vector2.Zero;
Origin = Vector2.Zero;
Zoom = 1;
Rotation = 0;
}
public Matrix GetTransform() {
return Matrix.CreateTranslation(new Vector3(mCameraPosition, 0.0f)) *
Matrix.CreateRotationZ(Rotation) *
Matrix.CreateScale(Zoom, Zoom, 1.0f) *
Matrix.CreateTranslation(new Vector3(Origin, 0.0f));
}
public void MoveCamera(Level level) {
if (Direction == ScrollDirection.Up)
{
mCameraPosition.Y = MathHelper.Clamp(mCameraPosition.Y - mScrollSpeed.Y, 0, (level.Height * Tile.Height - level.mViewport.Height));
}
}
Уровень:
public void Update(GameTime gameTime, TouchCollection touchState) {
Camera.MoveCamera(this);
}
public void Draw(SpriteBatch spriteBatch) {
//spriteBatch.Begin();
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise, null, mCamera.GetTransform());
DrawTiles(spriteBatch);
spriteBatch.End();
}
Игра - просто вызывает ничью в пределах уровня:
protected override void Draw(GameTime gameTime) {
mGraphics.GraphicsDevice.Clear(Color.Black);
//mSpriteBatch.Begin();
// Draw the level.
mLevel.Draw(mSpriteBatch);
//mSpriteBatch.End();
base.Draw(gameTime);
}
================================================== =============================== РЕДАКТИРОВАТЬ:
Во-первых, спасибо вам craftworkgames за вашу помощь.
Я играл с предложением. Когда я рисовал все фишки, французы увеличивались до 15 с 30 - вероятно, потому что уровни довольно большие.
Итак, что я сделал, это применил матрицу и переместился в обновлении (как предложено), но при рисовании я использую положение камер для циклического прохода по тайлам (т. Е. Начинаю счетчик слева и заканчиваю справа). Это все работает хорошо, и я доволен этим :-)
Моя новая проблема заключается в плеере. Очевидно, что теперь я перемещаю камеру, а не уровень, игрок остается позади, поскольку его позиция остается неизменной. Я подумал о двух решениях этой проблемы, во-первых, просто учитывать положение камеры при рисовании игрока. Т.е. в функции ничьей просто добавьте положение камеры в положение игрока. Второй - запустить новый спрайт для игрока, у которого нет трансформации. то есть завершить спрайт-пакет после рисования тайлов, а затем начать новый при рисовании игрока. Я знаю, что оба будут работать, но я не могу придумать, какие из них были бы лучше с точки зрения производительности / хорошего кодирования? Я не уверен, что влияет на производительность при запуске пакета дважды?