引导对象按特定标准移动

时间:2018-12-18 21:39:58

标签: java swing awt graphics2d java-2d

我正在尝试制作特定的“吃豆子游戏”。
基本上,主要对象是:吃豆子和水果。

背景图片是某张地图的图片,这意味着游戏受到外部框架的约束。
框架本身以像素设置,我将其转换为坐标(Conversion of lat/lng coordinates to pixels on a given map (with JavaScript))。 坐标具有以下参数:

public Point3D(double x,double y,double z) 
{

    _x=x;// latitude
    _y=y;// longtitude
    _z=z;// altitude
}


public boolean isValid_GPS_Point(Point3D p)
{
    return (p.x()<=180&&p.x()>=-180&&p.y()<=90&&p.y()>=-90&&p.z()>=-450);
}

水果是不会移动的静态对象。

所有pacmen的通用速度为每秒1米,进食半径为1米,这意味着特定pacman进食半径内的每个水果都将被吃掉并从水果清单中删除(“饮食半径”更像是半径为1米的三维球)。

吃豆人的运动由算法确定(算法:使用水果和吃豆人的列表,我们从两个列表中计算两个对象的距离,并采用特定吃豆人旅行所需的最小距离

距离公式:

  1. 通过地图上的2个GPS点确定向量。
  2. 在向量上使用平方函数:
    sqrt delta(x)^ 2 + delta(y)^ 2 + delta(z)^ 2

就Gui而言:

package gui;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;


public class MainWindow extends JFrame implements MouseListener
{
public BufferedImage myImage;

public MainWindow() 
{
    initGUI();      
    this.addMouseListener(this); 
}

private void initGUI() 
{
    MenuBar menuBar = new MenuBar();
    Menu File = new Menu("File"); 
    Menu Run=new Menu("Run");
    Menu Insert=new Menu("Insert");

    MenuItem New=new MenuItem("New");
    MenuItem Open = new MenuItem("Open");
    MenuItem Save=new MenuItem("Save");
    MenuItem start=new MenuItem("start");
    MenuItem stop=new MenuItem("stop");
    MenuItem packman=new MenuItem("packman");
    MenuItem fruit=new MenuItem("fruit");

    menuBar.add(File);
    menuBar.add(Run);
    menuBar.add(Insert);

    File.add(New);
    File.add(Open);
    File.add(Save);
    Run.add(start);
    Run.add(stop);
    Insert.add(packman);
    Insert.add(fruit);  

    this.setMenuBar(menuBar); 

    try {
         myImage = ImageIO.read(new File("C:\\Users\\Owner\\Desktop\\Matala3\\Ariel1.png"));//change according to your path
    } catch (IOException e) {
        e.printStackTrace();
    }       
}

int x = -1;
int y = -1;

public void paint(Graphics g)
{
    g.drawImage(myImage, 0, 0, this);

    if(x!=-1 && y!=-1)
    {
        int r = 10;
        x = x - (r / 2);
        y = y - (r / 2);
        g.fillOval(x, y, r, r);

    }
}

@Override
public void mouseClicked(MouseEvent arg) {
    System.out.println("mouse Clicked");
    System.out.println("("+ arg.getX() + "," + arg.getY() +")");
    x = arg.getX();
    y = arg.getY();
    repaint();
}

@Override
public void mouseEntered(MouseEvent arg0) {
    System.out.println("mouse entered");        
}

@Override
public void mouseExited(MouseEvent arg0) {
    System.out.println("mouse exited");

}

@Override
public void mousePressed(MouseEvent arg0) {
    System.out.println("mouse Click pressed");  
}

@Override
public void mouseReleased(MouseEvent arg0) {
    System.out.println("mouse Click released"); 
}

}

从此类运行它:

package gui;
import javax.swing.JFrame;

import Geom.Point3D;
import gis.Fruit;


public class Main 
{
public static void main(String[] args)
{
    MainWindow window = new MainWindow();
    window.setVisible(true);
    window.setSize(window.myImage.getWidth(),window.myImage.getHeight());
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
}

我的主要目标是在将我的物体(豌豆和水果)放在地图上之后,它应该以某种方式看起来像这样:https://media.giphy.com/media/5UDHI0JLxBBElUFuCs/giphy.gif

我正在寻找有关如何使行李员这样移动而不是保持静止的一般方向。

1 个答案:

答案 0 :(得分:0)

您想制作一个吃豆人(?)可以直线追逐水果的方法,对吗? 这真的很简单,如果您添加越来越多的功能,应该看起来很有趣。

您将做一个循环,尝试找到最接近的水果,然后使用两点画一条线:吃豆子和水果的位置。然后,您需要减去水果点减去pacman。这是代表吃豆人将要走的线的向量。归一化向量以获得可以使用的单位长度向量。现在,我们需要添加此向量的一小部分才能将pacman移到水果上。公式是“

  

向量*速度* time_delta

“,其中time_delta是1除以fps或实际时差(如果可以得到的话)。我通常使用第一个。这样一秒钟,您pacman将以指定的速度移动。(保持请注意,您指定一个像素是几米!)

    // calculate line
    Vector a = packman.getPosition();
    Vector b = fruit.getPosition();
    Vector ab = b.subtract(a).normalize();

    // for each tick!
    packman.addPosition(ab.multiply(speed * 1 / fps));

Reference:

对于进餐部分,只有在它们与吃豆人距离足够近的情况下,才从列表中删除它们。要添加水果,您可以执行相同的操作,将其添加到列表中。您还可以让pacman存储水果对象来模拟“目标锁定”,或者不断检查最近的水果。

希望这对您有所帮助,我很想看看您的游戏!