当前位置: 首页 > 知识库问答 >
问题:

使用鼠标瞄准LibGDX

柯昆
2023-03-14

我正在libGDX中制作一个游戏,我在设置Bullet类时遇到了麻烦。我无法让射弹去鼠标位置。

我试图用Math.atan()来找到我需要射击的角度,但是我不能让它工作。现在我只是用距离来寻找x轴和y轴上的速度。

private static final int SPEED = 500;
private static Texture texture;
String path = "C:\\Users\\minicodcraft\\Downloads\\game\\core\\assets\\";
private float x, y; // starting position
private float xVelocity, yVelocity;
private float yPos; // the y position of the mouse input
private float xPos; // the x position of the mouse input

public Bullet(float x, float y, float yPos, float xPos) {
    this.x = x;
    this.y = y;
    this.xPos = xPos;
    this.yPos = yPos;
    this.xVelocity = 0f;
    this.yVelocity = 0f;
    calcDirection();


    if (texture == null) {
        texture = new Texture(path + "Bullet.png");
    }
}

private void calcDirection() {
    float xDistanceFromTarget = Math.abs(xPos - x);
    float yDistanceFromTarget = Math.abs(yPos - y);
    float totalDistanceFromTarget = xDistanceFromTarget + yDistanceFromTarget;
    xVelocity = xDistanceFromTarget / totalDistanceFromTarget;
    yVelocity = yDistanceFromTarget / totalDistanceFromTarget;
    if (xPos < x) {
        xVelocity *= -1;
    }
    if (yPos < y) {
        yVelocity *= -1;
    }
}

public void update(float deltaTime) {
    if (x > 0 && y > 0) {
        x += xVelocity * SPEED * deltaTime;
        y += yVelocity * SPEED * deltaTime;
    } else if (x < 0 && y > 0) {
        x -= xVelocity * SPEED * deltaTime;
        y += yVelocity * SPEED * deltaTime;
    } else if (x > 0 && y < 0) {
        x += xVelocity * SPEED * deltaTime;
        y -= yVelocity * SPEED * deltaTime;
    } else if (x < 0 && y < 0) {
        x -= xVelocity * SPEED * deltaTime;
        y -= yVelocity * SPEED * deltaTime;
    }
}

public void render(SpriteBatch batch) {
    batch.draw(texture, x, y);
}

共有1个答案

常元章
2023-03-14

以下代码给出了从玩家位置到鼠标位置的速度:

float diffX = mouse.x - player.x;
float diffY = mouse.y - player.y;
float angle = (float) Math.atan2(diffY, diffX);
float velX = (float) (Math.cos(angle));
float velY = (float) (Math.sin(angle));
Vector2 velocity = new Vector2(velX, -velY);
velocity.nor();
velocity.scl(magnitudeSpeed);
velocity.scl(deltaTime);

然后速度。x是速度的x分量。分别代表y。无需再次乘以速度和deltaTime,上面已经做过。

 类似资料:
  • Malmo是微软针对Minecraft的人工智能框架,由游戏本身的一个模块和一个用于发送输入和接收世界数据的多平台框架组成。 Minecraft的瞄准是圆柱形的。它存储在偏航(左和右)和俯仰(上和下)中,而不是完全旋转的四元数。偏航从最左侧的-180度变为最右侧的180度。音高从-90直接指向上(天顶)到90直接指向下(最低点)。在我的代码中,我将它们存储为(重新创建,使其工作方式与XNA非常相似

  • 所以,我有一艘附加了“硬点”的船,可以把武器放在上面。放置后,它们瞄准鼠标位置,旋转范围有限:参见此处 旋转范围基于minAngle和maxAngle,并通过eulerAngles计算。父硬点槽的z,加/减角度修改器(在本例中为20)。我不得不做一些奇怪的旋转巫术(参见代码片段中的OneEightyToThreeSixty()),以使鼠标的视角与minAngle/maxAngle的格式匹配。 角度

  • 我对推送通知和FCM(Firebase云消息传递)非常陌生。 我有一个应用程序,用户可以登录,我想发送推通知给这个特定的用户。用户可以同时登录多个设备,因此必须向所有这些设备发送通知。 我知道如何向特定设备发送通知,因为我已经按照官方留档的教程进行了操作,并且我有一个用户注册的服务器。 所以我想保存令牌()发送到我的服务器,然后向保存在此用户下的所有令牌发送推送通知。 但有两个问题: 如果用户注销

  • 我想让我的用户能够订阅特定的事件(频道),以限制他们收到的推送通知。 例 当事件发生在第8组时。 如何向订阅组8的所有用户发送推送通知?-在我上面的例子中,通知应该发送到user1和user2,而不是3。

  • 我刚刚使用创建了一个新项目。我的Google-foo可能会让我失望,但我没有找到与我的答案相关的任何内容(如果我错过了一些明显的东西,请链接到另一个SO答案或相关文档)。 如果我想确保此新项目符合 .NET 标准 2.0,我现在该怎么办?

  • 本文向大家介绍使用js获取鼠标坐标相关面试题,主要包含被问及使用js获取鼠标坐标时的应答技巧和注意事项,需要的朋友参考一下