当前位置: 首页 > wzjs >正文

盘锦门户网站建设广州市设计院官网

盘锦门户网站建设,广州市设计院官网,网站备案信息更改,德吉机械东莞网站建设业务逻辑:初始化小球随机自有移动,遇到屏幕边缘反弹,摇杆介入后小球停止自有移动,按照摇杆控制方向移动。 https://download.csdn.net/download/AnalogElectronic/90453667 https://download.csdn.net/download/AnalogElectronic…

业务逻辑:初始化小球随机自有移动,遇到屏幕边缘反弹,摇杆介入后小球停止自有移动,按照摇杆控制方向移动。

https://download.csdn.net/download/AnalogElectronic/90453667
https://download.csdn.net/download/AnalogElectronic/90453667

实现效果
在这里插入图片描述

核心代码

package com.example.snakegame2import android.annotation.SuppressLint
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.gestures.detectDragGestures
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlin.math.cos
import kotlin.math.sin
import kotlin.random.Randomclass MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {BallControlScreen()}}@SuppressLint("CoroutineCreationDuringComposition")@Composablefun BallControlScreen() {var ballX by remember { mutableStateOf(200f) }var ballY by remember { mutableStateOf(300f) }var dx by remember { mutableStateOf(0f) }var dy by remember { mutableStateOf(0f) }var canvasWidth by remember { mutableStateOf(400f) }var canvasHeight by remember { mutableStateOf(400f) }// 初始化随机方向val angle = Random.nextFloat() * 360fdx = cos(Math.toRadians(angle.toDouble())).toFloat()dy = sin(Math.toRadians(angle.toDouble())).toFloat()Column(horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.Center,modifier = Modifier.fillMaxSize()) {// 小球绘制区域Canvas(modifier = Modifier.size(400.dp).padding(20.dp).onSizeChanged { size ->canvasWidth = size.width.toFloat()canvasHeight = size.height.toFloat()},onDraw = {// 绘制蓝色边界线drawRect(color = Color.Blue,topLeft = Offset(0f, 0f),size = Size(size.width, size.height),style = Stroke(width = 2f))// 绘制小球,背景为白色drawCircle(color = Color.Red,radius = 20f,center = Offset(ballX, ballY))})// 虚拟摇杆Joystick(modifier = Modifier.size(100.dp),onJoystickMoved = { x, y ->// 归一化摇杆输入,确保dx和dy的范围在[-1, 1]dx = xdy = y})// 根据摇杆移动更新小球位置GlobalScope.launch(Dispatchers.Main) {while (true) {// 摇杆控制方向,但不改变速度ballX += dx * 10ballY += dy * 10// 碰撞检测if (ballX < 20) {ballX = 20fdx = -dx} else if (ballX > canvasWidth - 20) {ballX = canvasWidth - 20dx = -dx}if (ballY < 20) {ballY = 20fdy = -dy} else if (ballY > canvasHeight - 20) {ballY = canvasHeight - 20dy = -dy}delay(16)}}}}@Composablefun Joystick(modifier: Modifier = Modifier,onJoystickMoved: (Float, Float) -> Unit = { _, _ -> }) {var offsetX by remember { mutableStateOf(0f) }var offsetY by remember { mutableStateOf(0f) }Box(modifier = modifier.pointerInput("Joystick") {detectDragGestures(onDragStart = {offsetX = 0foffsetY = 0fonJoystickMoved(0f, 0f)},onDrag = { change, dragAmount ->val size = sizeval center = Offset((size.width / 2).toFloat(), (size.height / 2).toFloat())val position = change.position - centerval distance = position.getDistance()val maxDistance = size.width / 2if (distance > maxDistance) {val normalizedPosition = if (distance > maxDistance) {val ratio = maxDistance / distanceOffset(position.x * ratio, position.y * ratio)} else {position}offsetX = normalizedPosition.x / maxDistanceoffsetY = normalizedPosition.y / maxDistance} else {offsetX = position.x / maxDistanceoffsetY = position.y / maxDistance}onJoystickMoved(offsetX, offsetY)},onDragEnd = {offsetX = 0foffsetY = 0fonJoystickMoved(0f, 0f)})}) {// 摇杆背景Canvas(modifier = Modifier.fillMaxSize()) {drawCircle(color = Color.Gray,radius = size.width / 2)}// 摇杆帽子Canvas(modifier = Modifier.size(60.dp).align(Alignment.Center),onDraw = {drawCircle(color = Color.Blue,radius = size.width / 2,center = Offset(size.width / 2 + (offsetX * (size.width / 2 - 10)),size.height / 2 + (offsetY * (size.height / 2 - 10))))})}}
}

当然!以下是对代码的详细解释,包括导入的包和每一行代码的作用:

导入的包

import android.annotation.SuppressLint
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.gestures.detectDragGestures
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlin.math.cos
import kotlin.math.sin
import kotlin.random.Random
  • android.annotation.SuppressLint:用于抑制特定的编译器警告。
  • android.os.Bundle:用于传递活动之间的数据。
  • androidx.activity.ComponentActivity:Android 的活动基类,用于创建活动。
  • androidx.activity.compose.setContent:用于设置活动的内容为 Jetpack Compose UI。
  • androidx.compose.foundation.Canvas:用于绘制自定义图形。
  • androidx.compose.foundation.gestures.detectDragGestures:用于检测拖拽手势。
  • androidx.compose.foundation.layout.Arrangement:用于布局子组件的排列方式。
  • androidx.compose.foundation.layout.Box:用于创建一个容器,可以包含多个子组件。
  • androidx.compose.foundation.layout.Column:用于创建垂直排列的布局。
  • androidx.compose.foundation.layout.fillMaxSize:用于使组件填充父容器。
  • androidx.compose.foundation.layout.padding:用于为组件添加内边距。
  • androidx.compose.foundation.layout.size:用于设置组件的大小。
  • androidx.compose.runtime.Composable:用于标记一个可组合函数。
  • androidx.compose.runtime.getValue:用于从 mutableStateOf 获取值。
  • androidx.compose.runtime.mutableStateOf:用于创建一个可变状态。
  • androidx.compose.runtime.remember:用于在组合中记住一个值。
  • androidx.compose.runtime.setValue:用于设置 mutableStateOf 的值。
  • androidx.compose.ui.Alignment:用于对齐组件。
  • androidx.compose.ui.Modifier:用于修改组件的属性。
  • androidx.compose.ui.geometry.Offset:用于表示一个二维坐标。
  • androidx.compose.ui.geometry.Size:用于表示一个大小。
  • androidx.compose.ui.graphics.Color:用于表示颜色。
  • androidx.compose.ui.graphics.drawscope.Stroke:用于绘制边框。
  • androidx.compose.ui.input.pointer.pointerInput:用于处理指针输入。
  • androidx.compose.ui.layout.onSizeChanged:用于在组件大小改变时触发回调。
  • androidx.compose.ui.unit.dp:用于表示密度无关的像素。
  • kotlinx.coroutines.Dispatchers:用于处理协程的调度。
  • kotlinx.coroutines.GlobalScope:用于创建全局协程。
  • kotlinx.coroutines.Job:用于表示协程的作业。
  • kotlinx.coroutines.delay:用于在协程中延迟执行。
  • kotlinx.coroutines.launch:用于启动协程。
  • kotlin.math.cos:用于计算余弦值。
  • kotlin.math.sin:用于计算正弦值。
  • kotlin.random.Random:用于生成随机数。

主活动类

class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {BallControlScreen()}}
}
  • MainActivity:主活动类,继承自 ComponentActivity
  • onCreate:活动的生命周期方法,用于初始化活动。
  • setContent:设置活动的内容为 Jetpack Compose UI,调用 BallControlScreen 函数。

小球控制屏幕

@SuppressLint("CoroutineCreationDuringComposition")
@Composable
fun BallControlScreen() {var ballX by remember { mutableStateOf(200f) }var ballY by remember { mutableStateOf(300f) }var dx by remember { mutableStateOf(0f) }var dy by remember { mutableStateOf(0f) }var canvasWidth by remember { mutableStateOf(400f) }var canvasHeight by remember { mutableStateOf(400f) }// 初始化随机方向val angle = Random.nextFloat() * 360fdx = cos(Math.toRadians(angle.toDouble())).toFloat()dy = sin(Math.toRadians(angle.toDouble())).toFloat()Column(horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.Center,modifier = Modifier.fillMaxSize()) {// 小球绘制区域Canvas(modifier = Modifier.size(400.dp).padding(20.dp).onSizeChanged { size ->canvasWidth = size.width.toFloat()canvasHeight = size.height.toFloat()},onDraw = {// 绘制蓝色边界线drawRect(color = Color.Blue,topLeft = Offset(0f, 0f),size = Size(size.width, size.height),style = Stroke(width = 2f))// 绘制小球,背景为白色drawCircle(color = Color.Red,radius = 20f,center = Offset(ballX, ballY))})// 虚拟摇杆Joystick(modifier = Modifier.size(100.dp),onJoystickMoved = { x, y ->// 归一化摇杆输入,确保dx和dy的范围在[-1, 1]dx = xdy = y})// 根据摇杆移动更新小球位置GlobalScope.launch(Dispatchers.Main) {while (true) {// 摇杆控制方向,但不改变速度ballX += dx * 10ballY += dy * 10// 碰撞检测if (ballX < 20) {ballX = 20fdx = -dx} else if (ballX > canvasWidth - 20) {ballX = canvasWidth - 20dx = -dx}if (ballY < 20) {ballY = 20fdy = -dy} else if (ballY > canvasHeight - 20) {ballY = canvasHeight - 20dy = -dy}delay(16)}}}
}
  • @SuppressLint("CoroutineCreationDuringComposition"):抑制特定的编译器警告。
  • @Composable:标记一个可组合函数。
  • BallControlScreen:小球控制屏幕的可组合函数。
  • var ballX by remember { mutableStateOf(200f) }:初始化小球的 X 坐标。
  • var ballY by remember { mutableStateOf(300f) }:初始化小球的 Y 坐标。
  • var dx by remember { mutableStateOf(0f) }:初始化小球的水平速度。
  • var dy by remember { mutableStateOf(0f) }:初始化小球的垂直速度。
  • var canvasWidth by remember { mutableStateOf(400f) }:初始化画布的宽度。
  • var canvasHeight by remember { mutableStateOf(400f) }:初始化画布的高度。
  • val angle = Random.nextFloat() * 360f:生成一个随机角度。
  • dx = cos(Math.toRadians(angle.toDouble())).toFloat():将角度转换为水平速度。
  • dy = sin(Math.toRadians(angle.toDouble())).toFloat():将角度转换为垂直速度。
  • Column:创建一个垂直排列的布局。
  • horizontalAlignment = Alignment.CenterHorizontally:水平居中对齐。
  • verticalArrangement = Arrangement.Center:垂直居中排列。
  • modifier = Modifier.fillMaxSize():使组件填充父容器。
  • Canvas:绘制小球和边界线的画布。
  • modifier = Modifier.size(400.dp).padding(20.dp):设置画布的大小和内边距。
  • onSizeChanged:在画布大小改变时更新 canvasWidthcanvasHeight
  • onDraw:绘制蓝色边界线和小球。
  • drawRect:绘制蓝色边界线。
  • drawCircle:绘制小球。
  • Joystick:虚拟摇杆的可组合函数。
  • modifier = Modifier.size(100.dp):设置摇杆的大小。
  • onJoystickMoved:处理摇杆的移动事件。
  • GlobalScope.launch(Dispatchers.Main):启动一个协程,用于更新小球的位置。
  • while (true):无限循环,持续更新小球的位置。
  • ballX += dx * 10:根据摇杆的输入更新小球的 X 坐标。
  • ballY += dy * 10:根据摇杆的输入更新小球的 Y 坐标。
  • if (ballX < 20):检测小球是否碰到左边界。
  • if (ballX > canvasWidth - 20):检测小球是否碰到右边界。
  • if (ballY < 20):检测小球是否碰到上边界。
  • if (ballY > canvasHeight - 20):检测小球是否碰到下边界。
  • delay(16):延迟 16 毫秒,使小球的移动更加平滑。

虚拟摇杆

@Composable
fun Joystick(modifier: Modifier = Modifier,onJoystickMoved: (Float, Float) -> Unit = { _, _ -> }
) {var offsetX by remember { mutableStateOf(0f) }var offsetY by remember { mutableStateOf(0f) }Box(modifier = modifier.pointerInput("Joystick") {detectDragGestures(onDragStart = {offsetX = 0foffsetY = 0fonJoystickMoved(0f, 0f)},onDrag = { change, dragAmount ->val size = sizeval center = Offset((size.width / 2).toFloat(), (size.height / 2).toFloat())val position = change.position - centerval distance = position.getDistance()val maxDistance = size.width / 2if (distance > maxDistance) {val normalizedPosition = if (distance > maxDistance) {val ratio = maxDistance / distanceOffset(position.x * ratio, position.y * ratio)} else {position}offsetX = normalizedPosition.x / maxDistanceoffsetY = normalizedPosition.y / maxDistance} else {offsetX = position.x / maxDistanceoffsetY = position.y / maxDistance}onJoystickMoved(offsetX, offsetY)},onDragEnd = {offsetX = 0foffsetY = 0fonJoystickMoved(0f, 0f)})}) {// 摇杆背景Canvas(modifier = Modifier.fillMaxSize()) {drawCircle(color = Color.Gray,radius = size.width / 2)}// 摇杆帽子Canvas(modifier = Modifier.size(60.dp).align(Alignment.Center),onDraw = {drawCircle(color = Color.Blue,radius = size.width / 2,center = Offset(size.width / 2 + (offsetX * (size.width / 2 - 10)),size.height / 2 + (offsetY * (size.height / 2 - 10))))})}
}
  • @Composable:标记一个可组合函数。
  • Joystick:虚拟摇杆的可组合函数。
  • modifier: Modifier = Modifier:设置摇杆的修饰符。
  • onJoystickMoved: (Float, Float) -> Unit = { _, _ -> }:处理摇杆的移动事件。
  • var offsetX by remember { mutableStateOf(0f) }:初始化摇杆的水平偏移量。
  • var offsetY by remember { mutableStateOf(0f) }:初始化摇杆的垂直偏移量。
  • Box:创建一个容器,包含摇杆的背景和帽子。
  • modifier = modifier.pointerInput("Joystick"):处理摇杆的指针输入。
  • detectDragGestures:检测拖拽手势。
  • onDragStart:在拖拽开始时重置偏移量。
  • onDrag:在拖拽过程中更新偏移量。
  • onDragEnd:在拖拽结束时重置偏移量。
  • Canvas:绘制摇杆的背景。
  • drawCircle:绘制灰色的摇杆背景。
  • Canvas:绘制摇杆的帽子。
  • drawCircle:绘制蓝色的摇杆帽子。

希望这个详细解释能帮助你更好地理解代码!如果有任何问题或需要进一步优化,请随时告诉我。

http://www.dtcms.com/wzjs/822963.html

相关文章:

  • 深圳赶集同城网站建设成都教育网站建设公司价格
  • 海珠免费网站建设网站制作哪家好又便宜
  • 有关做洁净工程的企业网站网站没被收录
  • 个人网站的制作步骤企业网站国内现状
  • 河南省建设监理网站长沙移动网站
  • 沈阳网站制作列表网表白网址在线制作平台
  • 宁波网站建设设计制作银川市住房和城乡建设局网站
  • 门户网站建设思路常州市住房和城乡建设局网站
  • 让人家做网站需要问什么问题做自媒体必备的8个网站
  • 服务器 网站打开慢做的网站为什么看不到图片
  • 如何判断网站做的关键词网站网页设计内容
  • 麻涌东莞网站建设上海网站建设哪家技术好
  • 诚信企业品牌网站建设做网站卖广告多少钱
  • 台州免费自助建站模板wordpress gif动画
  • 想要建设一个网站都需要注意什么做兼职上什么网站找
  • 有什么做3维的案例网站个人网站的主题
  • 商城网站技术方案绿化面积 建设网站
  • 网站建设解决方案网站建设服务条款
  • 做网站的目的是啥线上宣传推广方案
  • 网站建设费用主要包括那几项河南平台网站建设制作
  • 网站首页框架图有了域名空间怎么做网站
  • 静态网站源码辽宁网站定制企业
  • 汽车服务站建站流程网站公司用什么软件做网站
  • 工具网站有哪些嘉兴品牌网站
  • 网站建设通俗讲建站塔山双喜
  • php做网站主题wordpress 过滤
  • 福清市城乡建设局网站网站备案营业执照
  • 做网站用c 还是php网站设置反爬虫的主要原因
  • 成都网站建设公司浅谈wordpress环境需求
  • 怎么用wix做网站有没有免费装修设计的网站