gpt4 book ai didi

java - 如何使 Sprite 螺旋到中心(在 Java 中,但如果你知道一个公式,它也会有所帮助)

转载 作者:行者123 更新时间:2023-11-29 05:38:39 24 4
gpt4 key购买 nike

我正在用 Java 制作一个游戏,其中敌人的 Sprite 会盘旋到中心并损坏主塔。我唯一遇到的问题是使 Sprite 螺旋的公式。我在互联网上找到的所有内容都是这样的:http://scratch.mit.edu/projects/1439249/

这就是我想要做的,但我想让它们从 JFrame 外部而不是 JFrame 内部的某个点螺旋上升到一个点。

我在中四,我对这些公式还不是很了解,如果我在理解这些公式时遇到问题,我深表歉意。提前致谢!

最佳答案

让 sprite 看起来像螺旋形的一种简单方法是假装它附在一条 ARM 上,就像钟表的指针一样,绕着螺旋线的中心旋转。随着那只 ARM 的旋转,慢慢地将 Sprite 沿着 ARM 向中心移动。你最终得到的是经典 Archimedan Spiral

我可以为您模拟一些代码,但这需要几分钟时间。


好的,这是代码。

public static double getArmX(double length, double angle) {
return Math.cos(angle) * length;
}

public static double getArmY(double length, double angle) {
return Math.sin(angle) * length;
}

这些是数学的核心。它们返回与中心的指定距离(长度)和与中心的角度(角度)的实体的 x 和 y 值。

现在,我不知道你的代码是如何设置的,但让我们假设我们有一个名为 spiralProgressdouble 代表你的实体进入螺旋的程度是。在 spiralProgress == 0 时,实体刚刚开始,在 spiralProgress == 1 时,实体位于中心。

获取实体的 x 和 y 的代码如下所示:

double startingRadius = 64;
double rotations = 10;

double x = getArmX(startingRadius * (1-t), t * rotations * Math.PI * 2);
double y = getArmY(startingRadius * (1-t), t * rotations * Math.PI * 2);

在该片段中,startingRadius 是多少个单位(像素,如果这就是 x 和 y 在您的程序中的含义),实体应该从中心开始,旋转 是实体在到达中心之前应该围绕中心循环多少次。

返回的坐标是围绕 {0, 0} 的螺旋,所以如果你想围绕其他点螺旋,比如 {screenWidth/2, screenHeight/2},你会将 screenWidth/2 添加到 x 并将 screenHeight/2 添加到 y

这是演示此数学运算的完整 Java 程序。在窗口中的任意位置单击鼠标以重置螺旋线。

package net.eonz.stackoverflow.spiral;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable, MouseListener {
private static final long serialVersionUID = 1L;
public static final String NAME = "untitled";
public static final int HEIGHT = 600;
public static final int WIDTH = 600;
public static final int SCALE = 1;

private boolean running = false;

public void start() {
running = true;
new Thread(this).start();
this.addMouseListener(this);
}

public void stop() {
running = false;
}

public void run() {
long last = System.currentTimeMillis();

while (running) {
long now = System.currentTimeMillis();
double dt = (now - last) / 1000.0;
last = now;
update(dt);
render();
}
}

double t = 0;

public void update(double dt) {
t += dt / 16;
if (t > 1)
t = 1;
}

public void render() {
BufferStrategy bs = getBufferStrategy();

if (bs == null) {
createBufferStrategy(3);
return;
}

Graphics g = bs.getDrawGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, this.getWidth(), this.getHeight());

/* SPIRAL MATH IS HERE */

double startingRadius = this.getHeight() * 0.40;
double rotations = 10;

double x = getArmX(startingRadius * (1 - t), t * rotations * Math.PI
* 2);
double y = getArmY(startingRadius * (1 - t), t * rotations * Math.PI
* 2);

g.setColor(Color.black);
g.fillRect((int) (x - 8) + this.getWidth() / 2,
(int) (y - 8) + this.getHeight() / 2, 16, 16);

/* END SPIRAL MATH */

g.dispose();
bs.show();
}

public static double getArmX(double length, double angle) {
return Math.cos(angle) * length;
}

public static double getArmY(double length, double angle) {
return Math.sin(angle) * length;
}

@Override
public void mouseClicked(MouseEvent e) {
this.t = 0;
}

@Override
public void mousePressed(MouseEvent e) {

}

@Override
public void mouseReleased(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {

}

@Override
public void mouseExited(MouseEvent e) {

}

public static void main(String[] args) {
Game game = new Game();
game.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
game.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
game.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));

JFrame frame = new JFrame(Game.NAME);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(game, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);

game.start();
}

}

关于java - 如何使 Sprite 螺旋到中心(在 Java 中,但如果你知道一个公式,它也会有所帮助),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18554486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com