Android 动画中出现的多个帧-Kotlin
我正在为我的大学工作开发一个太空入侵者的副本,但是我在太空船的动画方面遇到了一些麻烦。太空船的移动应该根据玩家触摸的位置从屏幕中心向左或向右移动。但是,当宇宙飞船的位置改变时,后面总是有一些帧跟随真实的宇宙飞船。这里有一个屏幕截图: 有些变量是法语的,让我解释一下: -太空船。移动:显示移动方式:-1,向左移动,0,停止,1,向右移动。 -spaceship.bouge():更改飞船位置的方法。 Spaceship.kt:Android 动画中出现的多个帧-Kotlin,android,kotlin,google-play-games,Android,Kotlin,Google Play Games,我正在为我的大学工作开发一个太空入侵者的副本,但是我在太空船的动画方面遇到了一些麻烦。太空船的移动应该根据玩家触摸的位置从屏幕中心向左或向右移动。但是,当宇宙飞船的位置改变时,后面总是有一些帧跟随真实的宇宙飞船。这里有一个屏幕截图: 有些变量是法语的,让我解释一下: -太空船。移动:显示移动方式:-1,向左移动,0,停止,1,向右移动。 -spaceship.bouge():更改飞船位置的方法。 Spaceship.kt: package com.example.spaceinvaders2
package com.example.spaceinvaders2
import android.content.res.Resources
import android.graphics.*
import android.widget.Toast
class Spaceship(res: Resources) {
var x : Int =450
var y : Int =1000
var width : Int
var height: Int
var enMouvement = 0 //0 : à l'arrêt, -1 : vers la gauche, 1 vers la droite
var img : Bitmap = BitmapFactory.decodeResource(res, R.drawable.space_ship)
val paint = Paint()
init {
width = img.width
height = img.height
width /= 15
height /= 15
img = Bitmap.createScaledBitmap(img, width, height, false)
}
fun draw(canvas: Canvas){
canvas.drawBitmap(img, x*1f, y*1f, paint)
}
fun bouge(){
x += 15*enMouvement
}
}
GameView.kt
package com.example.spaceinvaders2
import android.content.Context
import android.graphics.Canvas
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.SurfaceHolder
import android.view.SurfaceView
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_game_view.view.*
import java.lang.Thread.sleep
class GameView @JvmOverloads constructor (context: Context, attributes: AttributeSet? = null,
defStyleAttr: Int = 0): SurfaceView(context, attributes,defStyleAttr), Runnable, SurfaceHolder.Callback{
lateinit var thread: Thread
lateinit var canvas: Canvas
private var drawing = true //Si on joue = true, si on ne joue pas = false
private var spaceship = Spaceship(resources)
override fun run(){
while (drawing){
update()
draw()
sleep(17)
}
}
fun resume(){
//Si l'on revient sur l'application
drawing = true
thread = Thread(this)
thread.start()
}
fun pause(){
//Si l'on sort de l'application
drawing = false
thread.join()
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
//Le toucher sur l'écran change le sens du mvt du spaceship
when (event?.action){
MotionEvent.ACTION_DOWN ->
if (event.x < width/2) spaceship.enMouvement = -1
else if (event.x > width/2) spaceship.enMouvement = 1
MotionEvent.ACTION_UP -> spaceship.enMouvement = 0
}
return true
}
fun update(){
//Mettre les positions des objets à jour
spaceship.bouge()
}
fun draw(){
//Dessiner l'écran
if(holder.surface.isValid){
canvas = holder.lockCanvas()
spaceship.draw(canvas)
holder.unlockCanvasAndPost(canvas)
}
}
override fun surfaceChanged(holder: SurfaceHolder, format : Int, width: Int, height: Int){
}
override fun surfaceCreated(holder: SurfaceHolder){
thread = Thread(this)
thread.start()
}
override fun surfaceDestroyed(holder: SurfaceHolder){
thread.join()
}
}
package com.example.spaceinvers2
导入android.content.Context
导入android.graphics.Canvas
导入android.util.AttributeSet
导入android.view.MotionEvent
导入android.view.SurfaceHolder
导入android.view.SurfaceView
导入android.widget.Toast
导入kotlinx.android.synthetic.main.activity\u game\u view.view*
导入java.lang.Thread.sleep
类GameView@JVM重载构造函数(上下文:上下文,属性:AttributeSet?=null,
defStyleAttr:Int=0):SurfaceView(上下文、属性、defStyleAttr)、Runnable、SurfaceHolder.Callback{
lateinit变量线程:线程
lateinit变量画布:画布
专用var绘图=正确//当前状态下的Si=正确,当前状态下的Si=错误
私人var spaceship=宇宙飞船(资源)
覆盖趣味跑(){
while(绘图){
更新()
画()
睡眠(17)
}
}
有趣的简历(){
//关于上一次申请
绘图=真
线程=线程(此)
thread.start()
}
有趣的停顿{
//Si l'on sort de l'应用程序
绘图=错误
thread.join()
}
重写事件(事件:MotionEvent?):布尔值{
//Le toucher sur l'cran change Le sens du mvt du spaceship
何时(事件?.action){
MotionEvent.ACTION\u向下->
如果(event.xwidth/2)spaceship.enmovement=1,则为else
MotionEvent.ACTION\u UP->spaceship.enmovement=0
}
返回真值
}
趣味更新(){
//目前的情况如何
太空船
}
抽奖{
//德西纳莱克兰酒店
if(holder.surface.isValid){
canvas=holder.lockCanvas()
宇宙飞船.绘制(画布)
支架.解锁画布和立柱(画布)
}
}
覆盖有趣的曲面更改(保持架:SurfaceHolder,格式:Int,宽度:Int,高度:Int){
}
覆盖乐趣surfaceCreated(保持架:SurfaceHolder){
线程=线程(此)
thread.start()
}
覆盖乐趣surfaceDestroyed(支架:SurfaceHolder){
thread.join()
}
}