Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import com.badlogic.gdx.Gdx
- import com.badlogic.gdx.graphics.GL20
- import com.badlogic.gdx.graphics.OrthographicCamera
- import com.badlogic.gdx.graphics.Pixmap
- import com.badlogic.gdx.graphics.Texture
- import com.badlogic.gdx.graphics.g2d.Sprite
- import com.badlogic.gdx.graphics.g2d.SpriteBatch
- import com.badlogic.gdx.graphics.g2d.TextureRegion
- import com.badlogic.gdx.graphics.glutils.FrameBuffer
- import com.badlogic.gdx.math.Vector2
- import com.badlogic.gdx.utils.BufferUtils
- import com.badlogic.gdx.utils.viewport.FitViewport
- val FRAME_BUFFER_WIDTH = BufferUtils.newIntBuffer(16).let {
- Gdx.gl20.glGetIntegerv(GL20.GL_MAX_TEXTURE_SIZE, it)
- println("Max Texture Size on platform: ${it.get(0)}")
- it.get(0)
- }
- const val FRAME_BUFFER_HEIGHT = 200
- /*
- спрайт печатается во фреймбуфер один раз в "ширину печатаемого спрайта"
- в текущем случаее каждые 256 кадров (размер спрайта trees.png 256х256)
- фреймбуфер не очищается что бы не перепечатывать имеющиеся спрайты, просто сдвигается "u" координата буфера
- Такой паралакс можно юзать на современных девайсах с GL_MAX_TEXTURE_SIZE == 4096 и больше.
- В пиксельном трешаке GL_MAX_TEXTURE_SIZE == 1024 и больше.
- Если "u" координат подходит к концу - 2 ширины экрана, обнулить "u" координату.
- При использовании паралакс как генерируемый задний фон при приблежении ("u" координаты - 2 ширины отображаемой области),
- начать дублировать печатаемые спрайт в начало "u" координат (u - (GL_MAX_TEXTURE_SIZE - visibleArea.width * 2)),
- и когда "u" будет равна (u -(GL_MAX_TEXTURE_SIZE - visibleArea.width)), обнулить "u"
- fixme - печатать следующий спрайт когда последний напечатаный полностью отображен в отображаемой области
- */
- class GameFB(val batch: SpriteBatch) {
- private val bufferViewport = FitViewport(FRAME_BUFFER_WIDTH.toFloat(), FRAME_BUFFER_HEIGHT.toFloat(), OrthographicCamera(FRAME_BUFFER_WIDTH.toFloat(), FRAME_BUFFER_HEIGHT.toFloat()))
- private var playArea: TextureRegion
- private val fb: FrameBuffer
- private var playAreaSprite = Sprite()
- private val treesTexture: Texture
- private val trees = Sprite()
- private val visibleArea = Vector2() // размер отображаемой области буфера
- private var scrollX: Int // координата X отрисовки последующего спрайта (trees)
- private val fbPix: Float // пиксель в буфере
- init {
- visibleArea.set(500f, FRAME_BUFFER_HEIGHT.toFloat())
- treesTexture = Texture("trees.png")
- trees.setRegion(treesTexture)
- trees.setBounds(0f, 0f, treesTexture.width.toFloat(), treesTexture.height.toFloat())
- scrollX = treesTexture.width
- fb = FrameBuffer(Pixmap.Format.RGBA4444, FRAME_BUFFER_WIDTH, FRAME_BUFFER_HEIGHT, false)
- bufferViewport.update(0, 0, true)
- batch.projectionMatrix = bufferViewport.camera.combined
- playArea = TextureRegion(fb.colorBufferTexture)
- playArea.flip(false, true)
- playAreaSprite.setRegion(playArea)
- playAreaSprite.setBounds(
- 64f, 64f,
- visibleArea.x, visibleArea.y
- )
- fbPix = 1f / FRAME_BUFFER_WIDTH.toFloat()
- // просчитать uv координаты для видимой области буфера
- playAreaSprite.u2 = visibleArea.x / FRAME_BUFFER_WIDTH.toFloat()
- playAreaSprite.v = visibleArea.y / FRAME_BUFFER_HEIGHT.toFloat()
- // предаварительно замостить 3 раза
- update()
- scrollX = treesTexture.width
- update()
- scrollX = treesTexture.width
- update()
- }
- fun draw(batch: SpriteBatch) {
- playAreaSprite.draw(batch)
- }
- fun update() {
- if (scrollX == treesTexture.width) {
- batch.projectionMatrix = bufferViewport.camera.combined
- fb.begin()
- batch.begin()
- trees.draw(batch)
- batch.end()
- fb.end()
- trees.x += treesTexture.width.toFloat()
- scrollX = 0
- trees.flip(true, false)
- println("Draw")
- } else {
- scrollX++
- }
- // сдвинуть "u" координату буфера, создав эффект движения вправо
- playAreaSprite.u += fbPix
- playAreaSprite.u2 += fbPix
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment