无法使用 GraphicsContext 绘制同一图像的多个实例

问题描述

大家好,这是我的第一个问题,所以请随时提出建设性的批评。 我正在使用 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