Я роблю тестову гру, де хочу, щоб рівень постійно прокручувався. Для створення цього ефекту я створив клас камери, який просто зберігає положення vector2 та напрямок enum. Він також містить публічний метод "переміщення", який просто змінює позицію з фіксованою ставкою. Потім я використовую це положення під час перегляду мого масиву плиток під час малювання. Це все добре працює.
Однак мені сказали, що я повинен використовувати матрицю Трансформації для переміщення камери, і що я повинен надати це під час запуску 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);
}
===================================================== ================================ EDIT:
По-перше, дякую вам craftworkgames за надану допомогу.
Я розігрувався з пропозицією. Коли я намалював усі плитки, fr збився приблизно до 15 з 30 - можливо, тому, що рівні досить великі.
Тож, що я зробив, це застосувати матрицю і переміститись в оновленнях (як пропонується), але на малюнку я використовую положення камер для прокручування плиток (тобто лічильник запуску ліворуч і кінець праворуч плиткою). Це все працює добре, і я цим задоволений :-)
Мій новий випуск лежить у програвачі. Очевидно, що зараз я рухаю камеру, а не рівень, плеєр залишається позаду камери, оскільки його положення залишається фіксованим. Я подумав два рішення цієї проблеми, перше - просто розглянути положення камер під час малювання плеєра. Тобто у фуніціоні жеребкування просто додайте положення камери до позиції гравця. Друга - запустити нову партію спрайту для гравця, який не має трансформації. тобто закінчуйте spritebatch після нанесення плитки, а потім запускайте новий, коли малюєте програвач. Я знаю, що обоє будуть працювати, але я не можу скласти голови хвостів, які були б кращими з точки зору продуктивності / хорошого кодування? Я не впевнений, які наслідки для продуктивності починаються від запуску серії двічі?