我正在尝试制作特定的“吃豆子游戏”。
基本上,主要对象是:吃豆子和水果。
背景图片是某张地图的图片,这意味着游戏受到外部框架的约束。
框架本身以像素设置,我将其转换为坐标(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米的三维球)。
吃豆人的运动由算法确定(算法:使用水果和吃豆人的列表,我们从两个列表中计算两个对象的距离,并采用特定吃豆人旅行所需的最小距离
就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
我正在寻找有关如何使行李员这样移动而不是保持静止的一般方向。
答案 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));
对于进餐部分,只有在它们与吃豆人距离足够近的情况下,才从列表中删除它们。要添加水果,您可以执行相同的操作,将其添加到列表中。您还可以让pacman存储水果对象来模拟“目标锁定”,或者不断检查最近的水果。
希望这对您有所帮助,我很想看看您的游戏!