2013-08-20 7 views
9

Ho cercato di risolvere questo problema per due giorni e ho rinunciato a provare a trovare una soluzione esistente.Fotocamere multiple in libgdx (probabilmente simili in altri framework)

Ho iniziato a imparare libgdx e ho terminato un paio di esercitazioni. E ora ho provato a usare tutto ciò che ho imparato e creare un semplice gioco a scorrimento laterale. Ora, so che ci sono esempi libgdx di questo, ma non ne ho trovato uno che incorpori Box2d con scene2d e attori, nonché mappe affiancate.

Il mio problema principale è con le telecamere.

Hai bisogno di una fotocamera per lo stage (che per quanto ne so è utilizzato per la matrice di proiezione dello SpriteBatch passato al metodo draw() agli attori, se questo è sbagliato, correggimi) e hai bisogno di una fotocamera per TileMapRender per aver chiamato il metodo render(). Inoltre, in alcuni tutorial è presente una videocamera Orthographic nel GameScreen, che viene utilizzata dove necessario.

Ho provato a passare un oggetto OrthographicCamera ai metodi, ho provato a utilizzare la fotocamera dallo stage e la fotocamera da TileMapRenderer ovunque. Es.

OrthographicCamera ocam = new OrthographicCamera(FRUSTUM_WIDTH, FRUSTUM_HEIGHT); 
stage.setCamera(ocam); // In the other cases i replace ocam with stage.getCamera() or the one i use for the tileMap Render 
tileMapRenderer.render(ocam); 
stage.getSpriteBatch().setProjectionMatrix(ocam.combined); // I am not sure if this is needed 

Ho anche provato a utilizzare telecamere diverse ovunque.

Dopo aver provato tutto questo non ho notato cosa succede esattamente quando, ma voglio elencare cosa succede:

  • Non c'è nulla sullo schermo (Probabilmente la fotocamera è lontano dalla roba che viene disegnata)
  • Posso vedere la mappa piastrellata ei contorni dal debugRenderer (uso anche DebugRender ma non penso che interferisca con le telecamere), ma lo sprite dell'attore non è visibile (probabilmente fuori dallo schermo)
  • Riesco a vedere tutto ciò che dovrei ma quando provo a spostare l'attore e la fotocamera, che dovrebbe seguirlo, la sp il rito va più veloce del corpo (il quadrato verde di debug).

Così le mie domande principali sono:

  • non capisco cosa succede quando si dispone di più telecamere. "Attraverso" quale vedi in realtà sul montior?
  • Devo usare più telecamere e come?

Inoltre, ho pensato che dovrei menzionare che sto usando OpenGL ES 2.0.

Mi dispiace per la lunga domanda, ma ho pensato che dovrei descrivere in dettaglio, poiché è un po 'complicato per me.

+0

hai chiamato stage.act() e stage.draw() per rendere lo stage –

risposta

16

Si vedono tutti attraverso tutti allo stesso tempo. Potrebbero tuttavia guardare un mondo completamente diverso, ma tutti rendono il loro punto di vista sullo schermo. È possibile utilizzare più telecamere, o solo una. Se ne usi solo uno, devi assicurarti di aggiornare correttamente la matrice di proiezione, tra il disegno di TiledMap, il tuo Stage con attori e, forse, il Box2DDebugRenderer opzionale.

Vorrei usare una fotocamera extra per Box2DDebugRenderer, perché è possibile buttarla via più tardi. Presumo che tu usi un fattore di conversione per convertire i metri in pixel e viceversa.Avere un rapporto 1: 1 non sarebbe molto buono. Ho sempre usato qualcosa tra 1m = 16px e 1m = 128px.

Così si inizializza in questo modo, e l'uso che uno per il renderer di debug:

OrthographicCamera physicsDebugCam = new OrthographicCamera(Gdx.graphics.getWidth()/Constants.PIXEL_PER_METER, Gdx.graphics.getHeight()/Constants.PIXEL_PER_METER); 

Per la vostra TiledMapRenderer è possibile utilizzare una telecamera in più pure, ma che si lavorerà solo in screen-coordinate, quindi nessuna conversione:

OrthographicCamera tiledMapCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

La TiledMap sarà sempre visualizzata a (0, 0). Quindi è necessario utilizzare la fotocamera per spostarsi sulla mappa. Sarà probabilmente seguirà un corpo, in modo da poter aggiornare tramite:

tiledMapCam.position.set(body.getPosition().x * Constants.PIXELS_PER_METER, body.getPosition().y * Constants.PIXELS_PER_METER) 

O nel caso segue un attore:

tiledMapCam.position.set(actor.getX(), actor.getY()) 

Io in realtà non ho ancora utilizzato scene2d insieme con Box2D, perché io non ha bisogno di interagire molto con i miei oggetti di gioco. È necessario implementare un PhysicsActor personalizzato qui, che estende Actor e crea il bridge da scene2d a Box2D avendo un corpo come proprietà. Dovrà impostare la posizione degli attori, la rotazione ecc. In base al corpo ad ogni passo di aggiornamento. Ma qui hai diverse opzioni. Puoi riutilizzare tiledMapCam e lavorare sulle coordinate dello schermo. In questo caso devi ricordarti sempre di moltiplicare con Constants.PIXELS_PER_METER quando aggiorni il tuo attore. O userai un'altra cam con la stessa vista come la fisica DebugCam. In questo caso non è necessaria alcuna conversione, ma non sono sicuro che ciò potrebbe interferire con alcune cose specifiche di scene2d.

Per ParallaxBackground è possibile utilizzare un'altra fotocamera, per l'interfaccia utente è possibile utilizzare nuovamente un altro stadio e un'altra fotocamera ... o riutilizzarne altri reimpostandoli correttamente. È una tua scelta, ma penso che molte telecamere non influenzino molto le prestazioni. Meno ripristini e conversioni potrebbero addirittura migliorarlo.

Dopo aver impostato tutto, è necessario eseguire il rendering di tutto, utilizzando le telecamere corrette e rendere ogni "livello"/"vista" uno sopra l'altro. Prima un ParallaxBackground, poi il tuo Tiledmap, poi il tuo Entity-Stage, poi la tua vista Box2DDebugging, quindi il tuo stadio dell'interfaccia utente.

In generale, ricordare di chiamare spriteBatch.setProjectionMatrix(cam.combined); e di utilizzare cam.update() dopo aver modificato qualcosa della videocamera.

+0

Ho un problema simile; Sto riproducendo una mappa affiancata usando un'unità e una proiezione personalizzate (come parte di uno stage), e voglio renderizzare un'interfaccia utente di debug con testo come FPS. Tuttavia, anche quando uso una "OrthographicCamera" separata per l'interfaccia utente di debug e la estrai sullo schermo w/h, e la imposto sul batch di sprite usato per renderizzare il testo, renderà il rendering in termini di limiti della mappa, non il mio schermo limiti. Devo resettare qualcosa dopo aver chiamato stage.draw() e prima di debugUi.render() per evitare che ciò accada? Devo mancare qualcosa. – Matthias

+0

@Matthias Si prega di creare una nuova domanda includendo il codice pertinente. – noone

+0

sicuro: http://stackoverflow.com/questions/26936952/resetting-the-viewport-after-creating-rendering-a-scene2d-stage – Matthias

Problemi correlati