从Java

时间:2016-03-24 19:12:50

标签: java swing awt

首先,我必须说这是一个转贴。我之前的帖子被标记为重复,尽管我在编辑中清楚地说明为什么这与另一个不同,但似乎没有人会访问它。问题仍然是完全有效且完全没有答案,所以请不要仅仅因为其他人也在与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度时垂直。此外,线条正在移动,这至少是不可取的。这段代码也影响了我将端点直接放在墙上的愿望。请允许我详细说明我的计划的目标:

  1. 感受Pacman的正确角度
  2. 绘制两条平行于Pacman路径的线,这样Pacman就不会 随时拦截他们。优选地,这些线将具有 以下四行中至少两行的端点:x = 0,x = 1000,y = 40,y = 1000
  3. 无论Pacman的X&amp; Y.换句话说,由于Pacman在路径上的进展发生任何变化,线条不应该改变。
  4. 当Pacman的角度发生变化时,线条会发生变化以反映出这种变化。只要正确的结果,具有正确角度的静态(非移动)线存在,无论每次调用是否运行计算都无关紧要。
  5. 谢谢。

    更新(重新发布): 自上次更新以来,我的最佳代码没有改变。然而,我已经考虑过为什么它不起作用,并产生了以下假设:它在90度倍数上的工作和其他角度一样可怕。但是,角度的性质使我无法看到线条在移动。因此,我必须猜测代码是有缺陷的,因为它无法忽视Pacman的运动。

    更新: 为了响应我多次收到的图片请求,我从VGR的优秀代码工作的几个角度中选择了rendering。 正如我所说,代码以90度的倍数工作,例如上面的那个,但是对于所有其他角度都没有正确渲染。并且响应VGR的评论,当Pacman的x和y改变时(因为他们不应该),他们永远不会移动,但是会响应Pacman改变角度而移动。把这些线条想象成Corridor的墙壁总是移动到Pacman需要去的地方。当Pacman沿着走廊走下去时,他们永远都不会移动,但是当他到达死胡同时,走廊会转移到适合他的新标题。我真诚地希望这会有所帮助。

1 个答案:

答案 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);

一些注意事项:

  • clipRect用于确保线条不会在y = 40之上绘制。
  • 转换为度数没有必要转换回弧度。
  • atan2期望 dy 作为第一个参数, dx 作为第二个参数。