Sto realizzando un gioco di prova in cui voglio che il livello scorra costantemente. Per creare questo effetto ho stabilito una classe di telecamere che memorizza semplicemente una posizione vector2 e una direzione enum. Contiene anche un metodo pubblico per "spostare" che cambia semplicemente la posizione a un tasso fisso. Quindi uso questa posizione quando eseguo il ciclo attraverso la mia serie di tessere durante il disegno. Funziona tutto bene.
Tuttavia, mi è stato detto che avrei dovuto usare una matrice Transform per spostare la telecamera e che avrei dovuto fornire questo quando avvierò lo spritebatch. Sono un po 'confuso a.) Come funziona? come se lo stessi dando solo quando inizia lo spritebatch come fa a sapere di cambiare posizione? b.) Perché sicuramente ho ancora bisogno della posizione della telecamera per quando cerco tra le piastrelle?
Al momento non riesco a farlo funzionare, ma non è una sorpresa dato che non capisco completamente come dovrebbe funzionare. Attualmente nel mio tentativo (codice da seguire) le tessere disegnate cambiano, il che significa che la posizione della telecamera sta cambiando, ma la posizione della finestra rimane invariata (cioè all'origine della telecamera). Gradirei davvero alcuni consigli / indicazioni su come dovrebbe essere usato?
Telecamera:
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));
}
}
Livello:
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();
}
Gioco - chiama solo il sorteggio nel livello:
protected override void Draw(GameTime gameTime) {
mGraphics.GraphicsDevice.Clear(Color.Black);
//mSpriteBatch.Begin();
// Draw the level.
mLevel.Draw(mSpriteBatch);
//mSpriteBatch.End();
base.Draw(gameTime);
}
================================================== =============================== MODIFICA:
Innanzitutto, grazie a craftworkgames per il tuo aiuto finora.
Ho giocato con il suggerimento. Quando ho disegnato tutte le tessere, il franco è aumentato a circa 15 da 30 - probabilmente perché i livelli sono piuttosto grandi.
Quindi quello che ho fatto è applicare la matrice e muovermi in aggiornamento (come suggerito) ma in disegno uso la posizione delle telecamere per scorrere le tessere (ovvero iniziare il contatore a sinistra e terminare a destra). Funziona tutto bene e ne sono contento :-)
Il mio nuovo problema risiede nel lettore. Ovviamente, poiché ora sto spostando la telecamera anziché il livello, il giocatore viene lasciato indietro dal camer mentre la sua posizione rimane fissa. Ho pensato a due soluzioni a questo problema, la prima è semplicemente considerare la posizione delle telecamere quando si disegna il lettore. Vale a dire nella funzione di disegno è sufficiente aggiungere la posizione della telecamera alla posizione del giocatore. Il secondo è avviare un nuovo batch di sprite per il giocatore che non ha trasformazioni. vale a dire terminare lo spritebatch dopo aver disegnato le tessere, quindi avviarne uno nuovo quando si disegna il giocatore. So che entrambi funzioneranno, ma non riesco a capire che sarebbe meglio in termini di prestazioni / buona codifica? Non sono sicuro di quali siano le implicazioni sulle prestazioni dall'avvio del batch due volte?