avatar
Untitled

Guest 70 2nd Dec, 2024

MARKUP 3.10 KB
                                           
                         package com.example.lab5v2024_2025

import android.opengl.GLSurfaceView
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10
import android.opengl.GLU
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.nio.FloatBuffer
import kotlin.math.cos
import kotlin.math.sin

class MyRenderer : GLSurfaceView.Renderer {
    private var angle = 0f // kąt do obracania figury na płótnie
    private var ballX = 0f // pozycja piłki w osi X
    private var ballY = 0f // pozycja piłki w osi Y
    private var ballRadius = 0f // promień piłki (10% długości dłuższej krawędzi)
    private var speedX = 0.01f // prędkość w osi X
    private var speedY = 0f // prędkość w osi Y (brak ruchu w osi Y)
    private var screenWidth = 1f // szerokość ekranu
    private var screenHeight = 1f // wysokość ekranu


    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {

        gl?.glClearColor(0.0f, 1.0f, 0.0f, 1.0f)
    }

    override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
        screenWidth = width.toFloat() / height.toFloat()
        screenHeight = 1f
        gl?.glViewport(0, 0, width, height)
        gl?.glMatrixMode(GL10.GL_PROJECTION)
        gl?.glLoadIdentity()
        GLU.gluOrtho2D(gl, -screenWidth, screenWidth, -1f, 1f)

        val longerSide = if (width > height) width.toFloat() else height.toFloat()
        ballRadius = 0.1f * longerSide / height // 10% długości dłuższej krawędzi
    }

    override fun onDrawFrame(gl: GL10?) {
        // Czyścimy bufor kolorów
        gl?.glClear(GL10.GL_COLOR_BUFFER_BIT)

        // Aktualizacja pozycji piłki
        ballX += speedX
        ballY += speedY

        // Sprawdzenie kolizji z krawędziami ekranu
        if (ballX + ballRadius > screenWidth || ballX - ballRadius < -screenWidth) {
            speedX = -speedX // Zmiana kierunku ruchu w osi X
        }

        // Rysowanie piłki
        drawBall(gl, ballX, ballY, ballRadius)
    }

    private fun drawBall(gl: GL10?, x: Float, y: Float, radius: Float) {
        val numSegments = 100
        val vertices = FloatArray(numSegments * 3)

        for (i in 0 until numSegments) {
            val angle = 2.0 * Math.PI * i / numSegments
            vertices[i * 3] = (x + radius * cos(angle)).toFloat()
            vertices[i * 3 + 1] = (y + radius * sin(angle)).toFloat()
            vertices[i * 3 + 2] = 0f
        }

        val buffer: ByteBuffer = ByteBuffer.allocateDirect(vertices.size * 4)
        buffer.order(ByteOrder.nativeOrder())
        val verticesBuffer: FloatBuffer = buffer.asFloatBuffer()
        verticesBuffer.put(vertices)
        verticesBuffer.position(0)

        gl?.glColor4f(0.0f, 0.0f, 1.0f, 1.0f)
        gl?.glEnableClientState(GL10.GL_VERTEX_ARRAY)
        gl?.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer)
        gl?.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, numSegments)
        gl?.glDisableClientState(GL10.GL_VERTEX_ARRAY)
    }
}
                      
                                       
To share this paste please copy this url and send to your friends
RAW Paste Data
Recent Pastes
Ta strona używa plików cookie w celu usprawnienia i ułatwienia dostępu do serwisu oraz prowadzenia danych statystycznych. Dalsze korzystanie z tej witryny oznacza akceptację tego stanu rzeczy.
Wykorzystywanie plików Cookie
Jak wyłączyć cookies?
ROZUMIEM