首先,我必须说这是一个转贴。我之前的帖子被标记为重复,尽管我在编辑中清楚地说明为什么这与另一个不同,但似乎没有人会访问它。问题仍然是完全有效且完全没有答案,所以请不要仅仅因为其他人也在与Pacman制作游戏而将其标记为重复。如果我纠正这个问题的方法是错误的,请原谅我并告诉我解决这个问题的正确方法,因为我对这个网站的运作方式知之甚少。
我以前的帖子如下:
我正在创造一个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所遵循的线平行。不幸的是,我不知道如何实现这一结果。
更新:我想发布一些新的和额外的代码: 我用来获取角度的方法(输入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度时垂直。此外,线条正在移动,这至少是不可取的。这段代码也影响了我将端点直接放在墙上的愿望。请允许我详细说明我的计划的目标:
谢谢。
更新(重新发布): 自上次更新以来,我的最佳代码没有改变。然而,我已经考虑过为什么它不起作用,并产生了以下假设:它在90度倍数上的工作和其他角度一样可怕。但是,角度的性质使我无法看到线条在移动。因此,我必须猜测代码是有缺陷的,因为它无法忽视Pacman的运动。
更新:
为了响应我多次收到的图片请求,我从VGR的优秀代码工作的几个角度中选择了rendering。
正如我所说,代码以90度的倍数工作,例如上面的那个,但是对于所有其他角度都没有正确渲染。并且响应VGR的评论,当Pacman的x和y改变时(因为他们不应该),他们永远不会移动,但是会响应Pacman改变角度而移动。把这些线条想象成Corridor
的墙壁总是移动到Pacman需要去的地方。当Pacman沿着走廊走下去时,他们永远都不会移动,但是当他到达死胡同时,走廊会转移到适合他的新标题。我真诚地希望这会有所帮助。
答案 0 :(得分:2)
你有正确的想法:
Shape originalClip = myBuffer.getClip();
myBuffer.clipRect(0, 40, 1000, 1000 - 40);
double x = pm.getX();
double y = pm.getY();
double angle = Math.atan2(pm.getdy(), pm.getdx());
double dx = PACMAN_RADIUS * Math.sin(angle);
double dy = PACMAN_RADIUS * Math.cos(angle);
double x1 = x - dx;
double x2 = x + dx;
double y1 = y - dy;
double y2 = y + dy;
myBuffer.setColor(Color.BLUE);
myBuffer.drawLine((int) (x1 - 5000 * dy),
(int) (y1 + 5000 * dx),
(int) (x1 + 5000 * dy),
(int) (y1 - 5000 * dx));
myBuffer.drawLine((int) (x2 - 5000 * dy),
(int) (y2 + 5000 * dx),
(int) (x2 + 5000 * dy),
(int) (y2 - 5000 * dx));
myBuffer.setClip(originalClip);
一些注意事项: