从旋转图像的同一点进行拍摄

我正在尝试制作一个基本的顶部射击游戏原型,但我在将子弹从图像旋转时出现了一些问题。 我目前的代码很好用,因为子弹从图像的中心射出,但我希望它从精灵的右侧,即枪的位置射出:

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)
  -- 获取鼠标位置以旋转玩家
  local mouseX, mouseY = love.mouse.getPosition()
  playerRotation = math.atan2(mouseY - playerY, mouseX - playerX);

  -- 键盘输入移动玩家
  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

  -- 更新所有子弹位置
  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)
  -- 绘制玩家
  love.graphics.draw(player, playerX, playerY, playerRotation, 0.5, 0.5, player:getWidth() / 2, player:getHeight() / 2);

  -- 绘制所有子弹
  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

如何从精灵的同一点绘制它被旋转时的图像?

点赞
用户2858170
用户2858170

如果我理解正确的话,你有一个代表你的玩家的图像。(playerX,playerY)是你的玩家的位置,其中图像的中心点在那里。

目前你的子弹从图像中心开始。 因此,子弹的起始点与玩家的旋转无关。

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

对于1的距离,可以参考单位圆 [![单位圆](https://i.stack.imgur.com/YrRZl.png)](https://i.stack.imgur.com/YrRZl.png)

所以只需将其与半径相乘,即:

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

其中t为你的旋转角度,r为玩家中心和枪口之间的欧几里德距离。

然后只需使用新的枪坐标作为你的子弹的起点。

2016-03-11 10:11:11