vito-Z80

Parallax background generator

Feb 5th, 2019
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 4.98 KB | None | 0 0
  1. import com.badlogic.gdx.Gdx
  2. import com.badlogic.gdx.graphics.GL20
  3. import com.badlogic.gdx.graphics.OrthographicCamera
  4. import com.badlogic.gdx.graphics.Pixmap
  5. import com.badlogic.gdx.graphics.Texture
  6. import com.badlogic.gdx.graphics.g2d.Sprite
  7. import com.badlogic.gdx.graphics.g2d.SpriteBatch
  8. import com.badlogic.gdx.graphics.g2d.TextureRegion
  9. import com.badlogic.gdx.graphics.glutils.FrameBuffer
  10. import com.badlogic.gdx.math.Vector2
  11. import com.badlogic.gdx.utils.BufferUtils
  12. import com.badlogic.gdx.utils.viewport.FitViewport
  13.  
  14. val FRAME_BUFFER_WIDTH = BufferUtils.newIntBuffer(16).let {
  15.     Gdx.gl20.glGetIntegerv(GL20.GL_MAX_TEXTURE_SIZE, it)
  16.     println("Max Texture Size on platform: ${it.get(0)}")
  17.     it.get(0)
  18. }
  19. const val FRAME_BUFFER_HEIGHT = 200
  20.  
  21. /*
  22.     спрайт печатается во фреймбуфер один раз в "ширину печатаемого спрайта"
  23.     в текущем случаее каждые 256 кадров (размер спрайта trees.png 256х256)
  24.     фреймбуфер не очищается что бы не перепечатывать имеющиеся спрайты, просто сдвигается "u" координата буфера
  25.    
  26.     Такой паралакс можно юзать на современных девайсах с GL_MAX_TEXTURE_SIZE == 4096 и больше.
  27.     В пиксельном трешаке GL_MAX_TEXTURE_SIZE == 1024 и больше.
  28.    
  29.     Если "u" координат подходит к концу - 2 ширины экрана, обнулить "u" координату.
  30.     При использовании паралакс как генерируемый задний фон при приблежении ("u" координаты - 2 ширины отображаемой области),
  31.     начать дублировать печатаемые спрайт в начало "u" координат (u - (GL_MAX_TEXTURE_SIZE - visibleArea.width * 2)),
  32.     и когда "u" будет равна (u -(GL_MAX_TEXTURE_SIZE - visibleArea.width)), обнулить "u"
  33.    
  34.     fixme - печатать следующий спрайт когда последний напечатаный полностью отображен в отображаемой области
  35.  */
  36. class GameFB(val batch: SpriteBatch) {
  37.  
  38.     private val bufferViewport = FitViewport(FRAME_BUFFER_WIDTH.toFloat(), FRAME_BUFFER_HEIGHT.toFloat(), OrthographicCamera(FRAME_BUFFER_WIDTH.toFloat(), FRAME_BUFFER_HEIGHT.toFloat()))
  39.     private var playArea: TextureRegion
  40.     private val fb: FrameBuffer
  41.     private var playAreaSprite = Sprite()
  42.  
  43.     private val treesTexture: Texture
  44.     private val trees = Sprite()
  45.     private val visibleArea = Vector2() //  размер отображаемой области буфера
  46.     private var scrollX: Int    //  координата X отрисовки последующего спрайта (trees)
  47.     private val fbPix: Float    //  пиксель в буфере
  48.  
  49.     init {
  50.         visibleArea.set(500f, FRAME_BUFFER_HEIGHT.toFloat())
  51.         treesTexture = Texture("trees.png")
  52.         trees.setRegion(treesTexture)
  53.         trees.setBounds(0f, 0f, treesTexture.width.toFloat(), treesTexture.height.toFloat())
  54.         scrollX = treesTexture.width
  55.         fb = FrameBuffer(Pixmap.Format.RGBA4444, FRAME_BUFFER_WIDTH, FRAME_BUFFER_HEIGHT, false)
  56.         bufferViewport.update(0, 0, true)
  57.         batch.projectionMatrix = bufferViewport.camera.combined
  58.         playArea = TextureRegion(fb.colorBufferTexture)
  59.         playArea.flip(false, true)
  60.         playAreaSprite.setRegion(playArea)
  61.         playAreaSprite.setBounds(
  62.                 64f, 64f,
  63.                 visibleArea.x, visibleArea.y
  64.         )
  65.  
  66.         fbPix = 1f / FRAME_BUFFER_WIDTH.toFloat()
  67.         //  просчитать uv координаты для видимой области буфера
  68.         playAreaSprite.u2 = visibleArea.x / FRAME_BUFFER_WIDTH.toFloat()
  69.         playAreaSprite.v = visibleArea.y / FRAME_BUFFER_HEIGHT.toFloat()
  70.  
  71.         //  предаварительно замостить 3 раза
  72.         update()
  73.         scrollX = treesTexture.width
  74.         update()
  75.         scrollX = treesTexture.width
  76.         update()
  77.     }
  78.  
  79.     fun draw(batch: SpriteBatch) {
  80.         playAreaSprite.draw(batch)
  81.     }
  82.  
  83.     fun update() {
  84.         if (scrollX == treesTexture.width) {
  85.             batch.projectionMatrix = bufferViewport.camera.combined
  86.             fb.begin()
  87.             batch.begin()
  88.             trees.draw(batch)
  89.             batch.end()
  90.             fb.end()
  91.             trees.x += treesTexture.width.toFloat()
  92.             scrollX = 0
  93.             trees.flip(true, false)
  94.             println("Draw")
  95.         } else {
  96.             scrollX++
  97.         }
  98.  
  99.         //  сдвинуть "u" координату буфера, создав эффект движения вправо
  100.         playAreaSprite.u += fbPix
  101.         playAreaSprite.u2 += fbPix
  102.     }
  103.  
  104.  
  105. }
Advertisement
Add Comment
Please, Sign In to add comment