从旋转图像的同一点拍摄

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 你从图像中心开始你的子弹。 所以你的子弹的起点对玩家旋转是不变的。

如果你把枪从玩家中心移开,它会围绕那个点旋转,半径是枪位置到玩家位置的距离。

距离1可以参考单位圆

因此只需将其乘以您的半径即可:

local gunXRotated = playerX + r * math.cos(t)
local gunYRotated = playerY + r * math.sin(t)

其中 t 是你的旋转角度,r 是玩家中心和枪口之间的欧氏距离。

然后简单地使用新的枪支坐标作为你的子弹原点。