ฉันกำลังทำเกมทดสอบที่ฉันต้องการให้เลื่อนระดับอย่างต่อเนื่อง ในการสร้างเอฟเฟกต์นี้ฉันได้สร้างคลาสกล้องที่เก็บตำแหน่งเวกเตอร์ 2 และทิศทาง Enum นอกจากนี้ยังมีวิธีการสาธารณะเพื่อ 'ย้าย' ซึ่งเพียงเปลี่ยนตำแหน่งในอัตราคงที่ จากนั้นฉันจะใช้ตำแหน่งนี้เมื่อวนลูปผ่านอาร์เรย์ของกระเบื้องเมื่อวาดภาพ ทั้งหมดนี้ทำงานได้ดี
อย่างไรก็ตามฉันได้รับแจ้งว่าฉันควรใช้ Transform matrix เพื่อย้ายกล้องและฉันควรให้สิ่งนี้เมื่อฉันเริ่ม spritebatch ฉันสับสนเล็กน้อย a.) วิธีนี้ทำงานอย่างไร ราวกับว่าฉันจะให้มันก็ต่อเมื่อ spritebatch เริ่มต้นจะรู้ได้อย่างไรว่าจะเปลี่ยนตำแหน่งได้อย่างไร b.) ทำไมฉันยังต้องการตำแหน่งกล้องเมื่อฉันวนผ่านกระเบื้อง?
ในขณะที่ฉันไม่สามารถทำงานได้ แต่ก็ไม่แปลกใจเลยที่ฉันไม่เข้าใจวิธีการทำงาน ขณะนี้ฉันกำลังพยายาม (โค้ดให้ติดตาม) กระเบื้องที่กำลังถูกเปลี่ยนแปลงซึ่งหมายถึงตำแหน่งของกล้องกำลังเปลี่ยนแปลง แต่ตำแหน่งของวิวพอร์ตยังคงไม่เปลี่ยนแปลง (เช่นที่จุดเริ่มต้นของกล้อง) ฉันจะขอบคุณคำแนะนำ / คำแนะนำเกี่ยวกับวิธีการใช้งาน
กล้อง:
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 สำหรับความช่วยเหลือของคุณ
ฉันเล่นด้วยคำแนะนำ เมื่อฉันวาดไพ่ทั้งหมด fr tanked ไปประมาณ 15 จาก 30 - อาจเป็นเพราะระดับที่ค่อนข้างใหญ่
ดังนั้นสิ่งที่ฉันได้ทำคือใช้เมทริกซ์และย้ายในการปรับปรุง (ตามที่แนะนำ) แต่ในการวาดฉันใช้ตำแหน่งกล้องสำหรับการวนลูปผ่านกระเบื้อง (เช่นเริ่มนับที่ด้านซ้ายและสิ้นสุดที่ไทล์ขวา) ทั้งหมดนี้ทำงานได้ดีและฉันมีความสุขกับมัน :-)
ปัญหาใหม่ของฉันอยู่ในโปรแกรมเล่น เห็นได้ชัดว่าตอนนี้ฉันกำลังขยับกล้องมากกว่าระดับผู้เล่นจะได้รับการทิ้งไว้ข้างหลังโดยผู้คุมเนื่องจากตำแหน่งของมันคงที่ ฉันคิดว่าจะแก้ปัญหานี้ได้สองวิธีอย่างแรกคือการพิจารณาตำแหน่งกล้องเมื่อวาดภาพผู้เล่น เช่นในฟังก์ชั่นการวาดเพียงเพิ่มตำแหน่งกล้องไปยังตำแหน่งผู้เล่น ประการที่สองคือการเริ่มชุดเทพดาใหม่สำหรับผู้เล่นที่ไม่มีการแปลง คือจบ spritebatch หลังจากวาดรูปแล้วเริ่มอันใหม่เมื่อทำการวาดภาพผู้เล่น ฉันรู้ว่าทั้งสองจะทำงานได้ แต่ฉันไม่สามารถทำหัวก้อยซึ่งจะดีกว่าในแง่ของประสิทธิภาพ / การเขียนโปรแกรมที่ดี? ฉันไม่แน่ใจว่าสิ่งที่เกี่ยวข้องกับประสิทธิภาพนั้นมาจากการเริ่มแบตช์สองครั้งหรือไม่