Untitled
Guest 70 2nd Dec, 2024
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