从旋转图像的同一点拍摄
Shoot from same point of a rotating image
我正在尝试为 LOVE 中的自上而下射击游戏制作一个基本原型,但我在让子弹旋转时从图像的同一点射击时遇到了一些问题。这是我目前使用的代码,当子弹从图像中心射出时效果很好,但我希望它从枪所在的精灵右侧射出:
function love.load()
love.graphics.setBackgroundColor(54, 172, 248)
player = love.graphics.newImage('/assets/images/player.png')
playerX = 300
playerY = 300
playerSpeed = 200
bullets = { }
bulletSpeed = 250
cursor = love.mouse.newCursor('assets/images/crosshair.png', 24, 24);
love.mouse.setCursor(cursor);
end
function love.update(dt)
-- Get mouse position to rotate player
local mouseX, mouseY = love.mouse.getPosition()
playerRotation = math.atan2(mouseY - playerY, mouseX - playerX);
-- Keyboard input to move the player
if love.keyboard.isDown('s') then
playerY = playerY + playerSpeed * dt
elseif love.keyboard.isDown('w') then
playerY = playerY - playerSpeed * dt
end
if love.keyboard.isDown('a') then
playerX = playerX - playerSpeed * dt
elseif love.keyboard.isDown('d') then
playerX = playerX + playerSpeed * dt
end
-- update all bullets position
for i, v in ipairs(bullets) do
v.x = v.x + (v.dx * dt)
v.y = v.y + (v.dy * dt)
end
end
function love.draw(dt)
-- Draw player
love.graphics.draw(player, playerX, playerY, playerRotation, 0.5, 0.5, player:getWidth() / 2, player:getHeight() / 2);
-- Draw all bullets
love.graphics.setColor(128, 128, 128)
for i, v in ipairs(bullets) do
love.graphics.circle("fill", v.x, v.y, 3);
end
end
function love.mousepressed(x, y, button)
if button == 1 then
local startX = playerX;
local startY = playerY;
local mouseX = x
local mouseY = y
local angle = math.atan2((mouseY - startY), (mouseX - startX))
local bulletDx = bulletSpeed * math.cos(angle)
local bulletDy = bulletSpeed * math.sin(angle)
table.insert(bullets, {x = startX , y = startY, dx = bulletDx, dy = bulletDy})
end
end
如何在精灵旋转时从同一点绘制它?
如果我没听错的话,你有一张代表你的播放器的图像。 (playerX, playerY) 是您的播放器的位置,也就是您图像的中心。
Atm 你从图像中心开始你的子弹。
所以你的子弹的起点对玩家旋转是不变的。
如果你把枪从玩家中心移开,它会围绕那个点旋转,半径是枪位置到玩家位置的距离。
因此只需将其乘以您的半径即可:
local gunXRotated = playerX + r * math.cos(t)
local gunYRotated = playerY + r * math.sin(t)
其中 t 是你的旋转角度,r 是玩家中心和枪口之间的欧氏距离。
然后简单地使用新的枪支坐标作为你的子弹原点。
我正在尝试为 LOVE 中的自上而下射击游戏制作一个基本原型,但我在让子弹旋转时从图像的同一点射击时遇到了一些问题。这是我目前使用的代码,当子弹从图像中心射出时效果很好,但我希望它从枪所在的精灵右侧射出:
function love.load()
love.graphics.setBackgroundColor(54, 172, 248)
player = love.graphics.newImage('/assets/images/player.png')
playerX = 300
playerY = 300
playerSpeed = 200
bullets = { }
bulletSpeed = 250
cursor = love.mouse.newCursor('assets/images/crosshair.png', 24, 24);
love.mouse.setCursor(cursor);
end
function love.update(dt)
-- Get mouse position to rotate player
local mouseX, mouseY = love.mouse.getPosition()
playerRotation = math.atan2(mouseY - playerY, mouseX - playerX);
-- Keyboard input to move the player
if love.keyboard.isDown('s') then
playerY = playerY + playerSpeed * dt
elseif love.keyboard.isDown('w') then
playerY = playerY - playerSpeed * dt
end
if love.keyboard.isDown('a') then
playerX = playerX - playerSpeed * dt
elseif love.keyboard.isDown('d') then
playerX = playerX + playerSpeed * dt
end
-- update all bullets position
for i, v in ipairs(bullets) do
v.x = v.x + (v.dx * dt)
v.y = v.y + (v.dy * dt)
end
end
function love.draw(dt)
-- Draw player
love.graphics.draw(player, playerX, playerY, playerRotation, 0.5, 0.5, player:getWidth() / 2, player:getHeight() / 2);
-- Draw all bullets
love.graphics.setColor(128, 128, 128)
for i, v in ipairs(bullets) do
love.graphics.circle("fill", v.x, v.y, 3);
end
end
function love.mousepressed(x, y, button)
if button == 1 then
local startX = playerX;
local startY = playerY;
local mouseX = x
local mouseY = y
local angle = math.atan2((mouseY - startY), (mouseX - startX))
local bulletDx = bulletSpeed * math.cos(angle)
local bulletDy = bulletSpeed * math.sin(angle)
table.insert(bullets, {x = startX , y = startY, dx = bulletDx, dy = bulletDy})
end
end
如何在精灵旋转时从同一点绘制它?
如果我没听错的话,你有一张代表你的播放器的图像。 (playerX, playerY) 是您的播放器的位置,也就是您图像的中心。
Atm 你从图像中心开始你的子弹。 所以你的子弹的起点对玩家旋转是不变的。
如果你把枪从玩家中心移开,它会围绕那个点旋转,半径是枪位置到玩家位置的距离。
因此只需将其乘以您的半径即可:
local gunXRotated = playerX + r * math.cos(t)
local gunYRotated = playerY + r * math.sin(t)
其中 t 是你的旋转角度,r 是玩家中心和枪口之间的欧氏距离。
然后简单地使用新的枪支坐标作为你的子弹原点。