首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用GraphicsContext绘制同一图像多个实例

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

Stack Overflow用户
提问于 2021-07-13 17:30:01
回答 1查看 24关注 0票数 0

大家好,这是我的第一个问题,所以请随时给出建设性的批评。我正在和ScalaFX做一个太空射击游戏,我面临着一个问题,当我在我的AnimationTimer循环中绘制子弹laser时,每当玩家发射另一个子弹时,程序只渲染最新的子弹,而旧的子弹就消失了。

为简洁起见,我将只发布与项目符号输入和渲染相关的主AnimationTimer循环:

代码语言:javascript
复制
      //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类:

代码语言:javascript
复制
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);
    }
}

如果你需要,这是我的播放器的射击功能:

代码语言:javascript
复制
    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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-14 13:56:22

好的,我解决了这个问题,这不是GraphicsContext的问题,而是因为Laser在player.shoot()中是用相同的Sprite实例化的,因此所有的Laser都有相同的X和Y,并且是重叠的,因此看起来就像是“消失了”。

每次实例化Laser时,新代码都会实例化一个新的Sprite,如下所示:

代码语言:javascript
复制
    def shoot() = {
        //Laser sprites
        val atkImg = new Image(getClass.getResourceAsStream("/Images/small_laser_blue.png"))
        val atkSprite = new Sprite(atkImg, 0, 0, 0, 0, atkImg.getWidth(), atkImg.getHeight())
        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
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68359845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档