注意:对于能够删除副本的人,请参阅第三次更新。
我正在创造一个Pacman主题乒乓球游戏。为了增加主题,我想在Pacman所面对的角度绘制两条线,一条在球的两侧。我把所有东西放在一个JPanel中,因为我没有达到使用组件的教育点。我试图创建一个走廊对象,从我的Pacman中获取参数,但我不知道怎么做trig。我的框架是1000 x 1000,顶部有40个像素的条形图,用于显示数据。 My Pacman以度为单位提供信息,因此请在答案中说明。谢谢,我会尽力回答任何问题。
更新: 我做了一些工作,我已经有一些代码可以分享这个主题了。它在下面:
import java.awt.*;
public class Corridor
{
public Corridor()
{
}
public void drawLines(Graphics myBuffer, BallPacman pm)
{
double x1 = pm.getX();
double y1 = pm.getY() + 150;
double ix = pm.getdx();
double iy = pm.getdy();
double x2 = pm.getX();
double y2 = pm.getY() + 150;
if (iy < 0) {
while (x1 > 0 && y1 > 40) {
x1 -= 0.1;
y1 -= 0.1 * (iy / ix);
}
if (x1 <= 0)
{
y1 += (0 - x1) * (iy / ix);
x1 = 0;
}
else {
x1 += (40 - y1) * (iy / ix);
y1 = 40;
}
while (x2 < 1000 && y2 < 1000) {
x2 += 0.1;
y2 += 0.1 * (iy / ix);
}
if (x2 >= 1000) {
y2 -= (x1 - 1000) * (iy / ix);
x2 = 1000;
}
else {
x2 -= (1000 - y2) * (iy / ix);
y2 = 1000;
}
}
else {
while (x1 > 0 && y1 > 40) {
x1 -= 0.1;
y1 -= 0.1 * -(iy / ix);
}
if (x1 <= 0)
{
y1 += (0 - x1) * -(iy / ix);
x1 = 0;
}
else {
x1 += (40 - y1) * -(iy / ix);
y1 = 40;
}
while (x2 < 1000 && y2 < 1000) {
x2 += 0.1;
y2 += 0.1 * -(iy / ix);
}
if (x2 >= 1000) {
y2 -= (x2 - 1000) * -(iy / ix);
x2 = 1000;
}
else {
x2 -= (y2 - 1000) * -(iy / ix);
y2 = 1000;
}
}
myBuffer.setColor (Color.BLUE);
myBuffer.drawLine ((int)x1, (int)y1, (int)x2, (int)y2);
}
}
不幸的是,这会产生奇怪的结果,例如移动和垂直线。我意识到它只产生一条线,但它是一种测试。 BallPacman有一个移动方法,每次调用一个定时器时都会移动它dx和dy。 dx和dy可能是正面的也可能是负面的。
更新: 我问过我的一位朋友,他说基本上我想要的是两条线与Ballpacman所遵循的线平行。不幸的是,我不知道如何实现这个结果。
更新: 这不完全是另一个问题的副本。另一个问题是关于绘制Pacman本人,我不需要。这个问题是关于如何使用三角法找到Pacman方向的平行线,并找到代码绘制它。我想请社群中的人有权删除此问题的重复状态。我想强调的是,我使用的是单个组件,其中的对象知道如何绘制自己。 在我进行更新时,我想发布一些新的和额外的代码: 我用来获取角度的方法(输入dx和dy):
public double getFAngle (double x, double y)
{
return Math.toDegrees(Math.atan2(x, y));
}
我试图用来获取该行的新策略(存在于drawLines方法中):
double angle = pm.getFAngle (pm.getdx(), pm.getdy());
int x1 = (int) (pm.getX() + 5000 * Math.cos (angle * Math.PI / 180));
int x2 = (int) (pm.getX() - 5000 * Math.cos (angle * Math.PI / 180));
int y1 = (int) (pm.getY() + 5000 * Math.sin (angle * Math.PI / 180));
int y2 = (int) (pm.getY() - 5000 * Math.sin (angle * Math.PI / 180));
myBuffer.setColor (Color.BLUE);
myBuffer.drawLine (x1, y1, x2, y2);
这种方法试图制作一条直接通过Pacman路径的线。我的想法是,如果我能做到这一点,我可以通过简单地增加和减少第1行和第2行的y点来实现墙壁。它在90的每个倍数中都表现得非常完美,包括0.然而,对于所有其他角度,它以非常奇怪的方式工作。我能提供的唯一具体是它在45度时垂直。此外,线条正在移动,这至少是不可取的。这段代码也影响了我将端点直接放在墙上的愿望。 请允许我详细说明我的计划的目标:
谢谢。