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
相关产品推荐
相关产品推荐

