在此screenshoot看看:Libgdx有自己的座標系繪製兩個不同的視圖?
我想我的UI分爲兩部分,控制和遊戲繪製區域,但我不希望控制重疊畫圖區,我想遊戲繪製區域的0,0
,在控制區域上方開始。
這可能與Libgdx有關嗎?
在此screenshoot看看:Libgdx有自己的座標系繪製兩個不同的視圖?
我想我的UI分爲兩部分,控制和遊戲繪製區域,但我不希望控制重疊畫圖區,我想遊戲繪製區域的0,0
,在控制區域上方開始。
這可能與Libgdx有關嗎?
正如你所說,你希望每個視圖都有自己的座標系統,因此由朱利安回答splitting the screen technique將做的伎倆,但它並不是所有的正確使用它。
爲了使其充分發揮作用,您應該有兩個獨立的OrthographicCamera
一個用於遊戲繪製視圖,另一個用於控制視圖。我也建議爲每臺相機創建2 Viewport
映射。根據我的經驗,在多攝像頭工作時,請始終爲其創建關聯Viewport
。更適合未來可能引入的變化(即適應任何屏幕分辨率),調試目的(如檢查觸摸,位置等)。
因此,將分割技術與攝像頭/視口管理相結合,您將擁有健壯的系統區域獨立。
代碼
我提供了下面的代碼,因爲它的使用,並在我的遊戲工作,但改變的變量名,以滿足您的需要。它位於Kotlin,但應該比較容易將其視爲Java。 你首先爲遊戲領域的東西初始化東西。
// create a camera
gameAreaCamera = OrthographicCamera()
gameAreaCamera.setToOrtho(false, GAME_WIDTH, GAMEVIEW_HEIGHT)
gameAreaCamera.update()
// create a viewport associated with camera
gameAreaViewport = ExtendViewport(GAME_WIDTH, GAMEVIEW_HEIGHT, gameAreaCamera)
接下來,爲控制區域的東西。
// create a camera
controlAreaCamera = OrthographicCamera()
controlAreaCamera.setToOrtho(false, GAME_WIDTH, CONTROLVIEW_HEIGHT)
controlAreaCamera.update()
// create a viewport associated with camera
controlAreaViewport = ExtendViewport(GAME_WIDTH, CONTROLVIEW_HEIGHT, controlAreaCamera)
PS:通知寬度和每個視圖的高度。它將按照您的意圖佔據區域。
現在你應該在render()
方法中有這樣的東西。
override fun render() {
// clear screen
Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT)
// draw game area
drawGameArea()
// draw control area
drawControlArea()
}
爲了您drawGameArea()
假設sb
是你SpriteBatch
你保持它在當前類,
private fun drawGameArea() {
// the following twos to let system know we will operate against game area's camera
// set the projection matrix
sb.projectionMatrix = gameAreaCamera.combined
// set gl viewport
Gdx.gl.glViewport(0,0,GAME_WIDTH, GAMEVIEW_HEIGHT)
// draw your stuff here...
sb.begin()
...
sb.end()
}
那會去以同樣的方式對drawControlArea()
private fun drawControlArea() {
// the following twos to let system know we will operate against control area's camera
// set the projection matrix
sb.projectionMatrix = controlAreaCamera.combined
// set gl viewport
Gdx.gl.glViewport(0,GAMEVIEW_HEIGHT,GAME_WIDTH, CONTROLVIEW_HEIGHT)
// draw your stuff here...
sb.begin()
...
sb.end()
}
注意Gdx.gl.glViewport()
我們提供目標矩形區域來繪製事物。 Viewport
s不是直接使用,但更多的是告訴系統哪種屏幕大小調整策略適合您的遊戲的圖形到屏幕上,以及更好的調試目的。你可以閱讀更多here。
您最常用的兩個常用選項是ExtendViewport
和FitViewport
。如果您希望遊戲出現並覆蓋屏幕的整個區域,而不會影響縱橫比,並且沒有黑條(左側或右側的黑色),那麼ExtendViewport
很可能就是您想要的,或者如果您想要類似的效果,但與黑條,因此遊戲畫面將是相同的每個球員(因此提供沒有超過寬屏幕播放器的優勢),然後FitViewport
是你的選擇。
正在檢查打在UI
我想你會需要這個,所以我應該包括這一點。 無論何時您需要檢查用戶是否點擊(或點擊)了此UI元素,您可以在其相應的update()
方法中檢查以下內容,以檢查觸摸位置是否在此對象的邊界區域的邊界內。
下面的代碼安全並且與ExtendViewport
一起工作良好,但它也應該與其他Viewport
一樣工作,因爲代碼不需要來自ExtendViewport
的任何特定信息。所以它是通用的。
fun update(dt: Float, cam: Camera: viewport: Viewport) {
// convert screen coordinate to world coordinate
val location = Vector3(Gdx.input.getX(), Gdx.input.getY(), 0f)
cam.unproject(location, viewport.screenX.toFloat(), viewport.screenY.toFloat(), viewport.screenWidth.toFloat(), viewport.screenHeight.toFloat())
if ((Gdx.input.isTouched() &&
boundingRect.contains(location.x, location.y)) {
// do something here...
}
}
您可以使用兩個攝像頭並將它們放置在圖像中顯示的位置。我認爲這個帖子可能會給你一個提示:Split-Screen in LibGDX