Tôi đang làm một trò chơi thử nghiệm, nơi tôi muốn cấp độ liên tục được cuộn. Để tạo hiệu ứng này, tôi đã thiết lập một lớp camera chỉ đơn giản là lưu trữ vị trí vector2 và hướng enum. Nó cũng chứa một phương thức công khai để 'di chuyển', đơn giản là thay đổi vị trí ở một tỷ lệ cố định. Sau đó tôi sử dụng vị trí này khi lặp qua mảng gạch của mình khi vẽ. Tất cả điều này hoạt động tốt.
Tuy nhiên, tôi đã được thông báo rằng tôi nên sử dụng ma trận Biến đổi để di chuyển máy ảnh và tôi nên cung cấp điều này khi tôi khởi động spritebatch. Tôi hơi bối rối a.) Làm thế nào điều này hoạt động? như thể tôi chỉ cho nó khi spritebatch bắt đầu làm thế nào để biết thay đổi vị trí? b.) Tại sao tôi chắc chắn vẫn cần vị trí máy ảnh khi tôi lặp qua các ô?
Hiện tại tôi không thể làm cho nó hoạt động được, nhưng điều đó không có gì đáng ngạc nhiên vì tôi không hoàn toàn hiểu nó hoạt động như thế nào. Hiện tại trong nỗ lực của tôi (mã để theo dõi) các ô được vẽ thay đổi có nghĩa là vị trí camera đang thay đổi, nhưng vị trí của khung nhìn vẫn không thay đổi (tức là tại điểm gốc của camera). Tôi thực sự sẽ đánh giá cao một số lời khuyên / hướng dẫn về cách sử dụng nó?
Máy ảnh:
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));
}
}
Cấp độ:
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();
}
Trò chơi - chỉ cần gọi rút thăm trong cấp độ:
protected override void Draw(GameTime gameTime) {
mGraphics.GraphicsDevice.Clear(Color.Black);
//mSpriteBatch.Begin();
// Draw the level.
mLevel.Draw(mSpriteBatch);
//mSpriteBatch.End();
base.Draw(gameTime);
}
================================================== =============================== CHỈNH SỬA:
Đầu tiên, cảm ơn bạn craftworkgames cho sự giúp đỡ của bạn cho đến nay.
Tôi chơi xung quanh với lời đề nghị. Khi tôi vẽ tất cả các ô, số fr nghiêng đến khoảng 15 từ 30 - có lẽ vì các cấp khá lớn.
Vì vậy, những gì tôi đã làm là áp dụng ma trận và di chuyển trong bản cập nhật (như được đề xuất) nhưng trong bản vẽ, tôi sử dụng vị trí camera để lặp qua các ô (tức là bộ đếm bắt đầu ở bên trái và kết thúc ở ô bên phải). Tất cả đều hoạt động tốt và tôi hài lòng với nó :-)
Vấn đề mới của tôi nằm ở người chơi. Rõ ràng là bây giờ tôi đang di chuyển máy ảnh chứ không phải cấp độ, người chơi bị người quay lại bỏ lại phía sau vì vị trí của nó vẫn cố định. Tôi đã nghĩ đến hai giải pháp cho vấn đề này, đầu tiên là chỉ cần xem xét vị trí camera khi vẽ trình phát. Tức là trong chức năng rút thăm chỉ cần thêm vị trí camera vào vị trí người chơi. Thứ hai là bắt đầu một đợt sprite mới cho người chơi không có biến đổi. tức là kết thúc spritebatch sau khi vẽ các ô sau đó bắt đầu một ô mới khi vẽ trình phát. Tôi biết cả hai sẽ hoạt động, nhưng tôi không thể tạo ra những cái đuôi sẽ tốt hơn về hiệu suất / mã hóa tốt? Tôi không chắc ý nghĩa hiệu suất là gì khi bắt đầu đợt hai lần?