You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Love2D项目中缩放枪精灵后消失的问题求助

问题分析与解决方案

核心问题1:Gun类实现错误

你的Gun类存在语法和逻辑错误,导致枪的属性异常:

  • 子类初始化方法写法错误:Gun:init() 需改为 function Gun:init()
  • 直接给类对象赋值Gun.sprite,而非实例的self.sprite,导致实例无法正确获取精灵资源
  • 不必要继承Player类,Gun与Player是独立实体,继承会引入冗余属性(比如默认的width=80),干扰缩放逻辑

修复后的Gun类:

local class = require('libraries/middleclass')

local Gun = class('Gun')

function Gun:init()
    self.sprite = love.graphics.newImage('sprites/gun.png')
    -- 获取精灵原始尺寸,用于计算缩放比例
    self.width = self.sprite:getWidth()
    self.height = self.sprite:getHeight()
    -- 自定义目标缩放尺寸,可根据需求调整
    self.targetWidth = 40
    self.targetHeight = 20
end

return Gun

核心问题2:缩放参数理解错误

love.graphics.draw()的sx和sy参数是缩放比例,而非目标宽高。你之前传入gun.width和gun.height(继承自Player的80),相当于把枪精灵放大80倍,超大尺寸的精灵会完全超出屏幕范围,因此看起来消失了。

正确缩放方式

方式1:按固定比例缩放(比如缩放到原尺寸的0.5倍)

love.graphics.draw(gun.sprite, playerCollider:getX(), playerCollider:getY(), 0, 0.5, 0.5)

方式2:缩放到指定目标尺寸

通过精灵原始尺寸计算缩放比例:

-- 计算缩放比例:目标尺寸 ÷ 原始尺寸
local scaleX = gun.targetWidth / gun.width
local scaleY = gun.targetHeight / gun.height
love.graphics.draw(gun.sprite, playerCollider:getX(), playerCollider:getY(), 0, scaleX, scaleY)

额外优化:调整绘制位置(可选)

缩放后若枪的位置偏移,可通过设置绘制原点(第5、6个参数)校准,比如让枪的中心点对准玩家位置:

love.graphics.draw(gun.sprite, playerCollider:getX(), playerCollider:getY(), 0, scaleX, scaleY, gun.width/2, gun.height/2)

修复后的love.draw()示例

function love.draw()
    if playerRotation == 0 then
        love.graphics.draw(player.sprite, playerCollider:getX() - player.width + player.width / 3, playerCollider:getY() - player.height * 2 + player.height / 2)
    elseif playerRotation == 1 then
        love.graphics.draw(player.spriteLeft, playerCollider:getX() - player.width + player.width / 3, playerCollider:getY() - player.height * 2 + player.height / 2)
    end
    love.graphics.draw(ground.sprite, ground.x, ground.y, 0, love.graphics.getWidth(), love.graphics.getHeight())
    
    -- 计算缩放比例并绘制枪
    local scaleX = gun.targetWidth / gun.width
    local scaleY = gun.targetHeight / gun.height
    love.graphics.draw(gun.sprite, playerCollider:getX(), playerCollider:getY(), 0, scaleX, scaleY, gun.width/2, gun.height/2)
end

最后注意事项

确保正确创建Gun实例:

-- 在主文件中
local Gun = require('gun')
gun = Gun:new() -- 必须用:new()创建实例,不能直接使用Gun类对象

内容的提问来源于stack exchange,提问作者Ayyy nonomusCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:03:14