【问题标题】:Java 2d Shooting direction with mouseJava 2d 用鼠标射击方向
【发布时间】:2012-05-11 21:41:57
【问题描述】:

我的问题可能很简单。我今天大部分时间都在考虑一种算法(这很可能是几个 if 语句),它将确定鼠标指向的方向并朝那个方向发射子弹。我已经对子弹进行了测试,以确保它们通过向定义的方向射击来射击。

我将如何计算鼠标是在播放器的左侧、右侧、顶部、底部还是在播放器的角落?

已解决:感谢您的所有帮助,但经过一天的思考,我想出了一个自己的方法。我所做的是使用 if 语句来确定当我按下鼠标时,它是否会与播放器的顶部、底部、右侧、左侧或角落发生碰撞。无论如何,这是我的代码。附言我使用变量x1 作为mousex,y1 作为mousey,x 作为playerx,y 作为player y。我唯一拥有的其他变量是 dx 和 dy,但您应该知道它们的作用。

//top
if (x1 > x && x1 < x + 40 && y1 > y - 250 && y1 < y){
        dy = -1;
    dx = 0;
}
//right
if (x1 > x + 40 && x1 < x + 250 && y1 > y && y1 < y + 40){
    dx = 1;
    dy = 0;
}
//bottom
if (x1 > x && x1 < x + 40 && y1 > y+40 && y1 < y+250){
    dy = 1;
    dx = 0;
}
//left
if (x1 < x && x1 > x - 250 && y1 > y && y1 < y + 40){
    dx = -1;
    dy = 0;
}
//top right corner
if (x1 > x + 40 && x1 < x + 250 && y1 > y - 250 && y1 < y){
    dx = 1;
    dy = -1;
}
//top left corner
if (x1 < x && x1 > x - 250 && y1 > y - 250 && y1 < y){
    dx = -1;
    dy = -1;
}
//bottom right corner
if (x1 > x + 40 && x1 < x + 250 && y1 > y + 40 && y1 < y + 250){
    dx = 1;
    dy = 1;
}
//bottom left corner
if (x1 < x && x1 > x - 250 && y1 > y + 40 && y1 < y + 250){
    dx = -1;
    dy = 1;
} 

【问题讨论】:

  • 您的实际问题是什么?如果您知道鼠标在哪里(x 和 y 坐标),并且您知道枪在哪里,那么一些简单的几何和数学应该可以确定子弹的角度或 x 和 y 速度。
  • 我的实际问题是我将如何计算鼠标是在播放器的左侧、右侧、顶部、底部,还是在播放器的角落
  • 简单代数会为你解答这个问题——如果你只看大方向,你甚至不需要三角函数。您尝试过什么,您的代码在哪里卡住了?
  • 好吧...我一直在反复试验,所以我真的没有代码,因为我已经删除了很多次,但我知道我在哪里搞砸了。我可以让角落工作,但我知道如何做侧面,因为角落的一些属性 if 语句适合播放器侧面的属性。
  • “但我知道我在哪里搞砸了。” 为了尽快获得更好的帮助,请发布您的最佳尝试SSCCE。就目前而言,我正在考虑投票结束这个“不是一个真正的问题”。

标签: java algorithm direction projectile


【解决方案1】:

如果要在按下鼠标按钮时实现射击,则必须实现鼠标移动动作侦听器。

简单的直线方程就可以了。

解决方法:获取按钮按下时的初始点(x0,y0)。当按下鼠标移动时,得到(x1,y1) 鼠标移动的点(这不断变化) - 得到直线方程 - (你有 2 个点,所以找到 slope 然后用一个点得到equation of the line)。

现在子弹的发射方向是perpendicular to this line through (x1,y1)。因此,当已知另一个方程时,您可以找到该垂直线的方程。现在要知道是否必须向上或向下射击是相对于找出枪指向哪一侧(方向存储在变量中)

毕竟,当鼠标仍然移动时,旧点现在将是(x1,y1),新点将是(x2,y2),您继续实施这些更改。

【讨论】:

  • 好吧,如果你想知道如何找到枪对准上(N),下(S),右(E)或左(W) - 首先在初始位置显示枪在某个常数游戏开始时的位置(比如 N),然后当玩家滚动时(或者您可以使用一些按钮或键实现),您可以将方向更改为 NE 或 E 或 SE 或 S 等或任何角度(度)并存储角度变量中的信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多