问题描述
大家好,这是我的第一个问题,所以请随时提出建设性的批评。
我正在使用 scalafx 制作太空射击游戏,但我面临一个问题,当我在 laser
循环中绘制子弹 AnimationTimer
时,每当玩家射击另一颗子弹时,程序只会呈现最新的子弹和旧子弹就消失了。
为简洁起见,我将仅发布与子弹输入和渲染相关的主要 AnimationTimer
循环:
//List of stuffs (Bullets,enemies etc)
var laserListB : ListBuffer[Laser] = ListBuffer()
val timer = AnimationTimer( currentNanoTime => {
//Calculating time since last frame for frame independant rendering
var elapsedtime : Double = (currentNanoTime - lastNanoTime) / 1000000000.0;
lastNanoTime = currentNanoTime;
//Input check
//SKIPPED PLAYER MOVEMENT CODE
if(shootPress){
var Now = System.nanoTime()
//Checking for atkSpeed cooldwon
if((lastShootNano <= 0L) || ((Now - lastShootNano) >= player.atkSpeed)){
laserListB += player.shoot()
}
lastShootNano = Now
}
//Updating position
for(laser <- laserListB){
laser.sprite.veLocityX = 0
laser.sprite.veLocityY = -400
laser.sprite.update(elapsedtime)
}
//Rendering
//Bullets
for(laser <- laserListB){
laser.sprite.render(gc)
}
})
以下是我的 Sprite
类:
import scalafx.scene.image.Image
import scalafx.scene.canvas.GraphicsContext
import scalafx.geometry.Rectangle2D
class Sprite(
private var _image : Image,private var _positionX : Double,private var _positionY : Double,private var _veLocityX : Double,private var _veLocityY : Double,private var _width : Double,private var _height : Double){
//Functions
def render(gc : GraphicsContext){
gc.drawImage(_image,_positionX,_positionY);
}
}
如果你需要,这是我的播放器的拍摄功能:
def shoot() = {
//Setting up laser sprite
val laser = new Laser(_atkSprite,damage,true)
laser.sprite.veLocityX = 0
laser.sprite.veLocityY = -400
laser.sprite.positionX = _sprite.positionX + (_sprite.width / 2) //Center laser horizontally on player sprite
laser.sprite.positionY = _sprite.positionY - 10 //Slight offset to be a bit higher than the player sprite
laser
}
感谢您阅读到这里:D
编辑1: 这是演示问题的视频:https://youtu.be/DliNyBoa1DI
解决方法
好的,我解决了,这不是 GraphicsContext 的问题,而是因为 Laser
在 player.shoot() 中使用相同的 Sprite
实例化,因此所有 {{1 }}s 将具有相同的 X 和 Y,并且重叠,因此看起来好像它“消失了”。
新代码每次实例化 Laser
时都会实例化一个新的 Sprite
,如下所示:
Laser