用Java从一个角度画线
首先,我必须说这是一个转载。我以前的帖子被标记为重复,尽管我在编辑中非常清楚地说了为什么这篇文章与另一篇不同,但似乎没有人会访问它。这个问题仍然是完全正确的,完全没有答案,所以请不要仅仅因为其他人也在和Pacman玩游戏就把它标记为重复的。如果我纠正这个错误的方法是错误的,请原谅我,并告诉我正确的方法来解决这样的问题,因为我仍然很少知道这个网站是如何运作的 我以前的帖子如下:用Java从一个角度画线,java,swing,awt,Java,Swing,Awt,首先,我必须说这是一个转载。我以前的帖子被标记为重复,尽管我在编辑中非常清楚地说了为什么这篇文章与另一篇不同,但似乎没有人会访问它。这个问题仍然是完全正确的,完全没有答案,所以请不要仅仅因为其他人也在和Pacman玩游戏就把它标记为重复的。如果我纠正这个错误的方法是错误的,请原谅我,并告诉我正确的方法来解决这样的问题,因为我仍然很少知道这个网站是如何运作的 我以前的帖子如下: import java.awt.*; public class Corridor { public Corridor()
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);
}
}
我正在制作一款以吃豆人为主题的乒乓球游戏。为了增加主题,我想在Pacman面对的角度画两条线,一条在球的两边。我把所有东西都放在一个JPanel中,因为我的教育还没有达到使用组件的程度。我试图创建一个从我的Pacman获取参数的走廊对象,但我不知道如何执行trig。我的帧是1000乘1000,顶部40个像素高的栏用于显示数据。我的“吃豆人”以度为单位给出信息,所以请在回答中说明这一点。谢谢你,我会尽力回答你的任何问题
更新:我已经做了一些工作,我有一些关于这个主题的代码可以分享。详情如下:
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);
}
}
我尝试使用一种新策略来获取线条(出现在drawLines方法中):
这种方法是试图画一条直线穿过吃豆人的路径。我的想法是,如果我能做到这一点,我可以通过分别增加和减少第1行和第2行的y点来实现墙。它在90的每一个倍数(包括0)中似乎都工作得很好。然而,它在所有其他角度都以一种非常奇怪的方式工作。我能提供的唯一具体情况是,它在45度处垂直。此外,线路在移动,这一点也不可取。这段代码也损害了我的愿望,让端点直接在墙上。请允许我详细说明我的课程目标:
正如我所说,代码以90度的倍数工作,比如上面的一个,但不能正确地渲染所有其他角度。作为对VGR评论的回应,当吃豆人的x和y改变时,它们从不移动(因为它们不必移动),但会随着吃豆人角度的改变而移动。把这些线想象成走廊的墙,总是移动到Pacman需要去的地方。当“吃豆人”沿着走廊走下去时,他们永远不会移动,但一旦他到达一个死胡同,走廊就会移动以适应他的新方向。我真诚地希望这能有所帮助 你的想法是对的:
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);
一些注意事项:
- 用于确保线不会在y=40以上绘制
- 仅将角度转换回弧度是没有意义的
- 期望dy作为第一个参数,dx作为第二个参数
- 你的想法是对的:
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);
一些注意事项:
- 用于确保线不会在y=40以上绘制
- 仅将角度转换回弧度是没有意义的
- 期望dy作为第一个参数,dx作为第二个参数