【问题标题】:Gui- make an object move by a certain criteriaGui- 使对象按特定标准移动
【发布时间】:2019-05-19 08:53:01
【问题描述】:

我正在尝试制作一个特定的“吃豆人游戏”。
基本上主要的对象是:pacman和fruit。

背景图是某张地图的图片,表示游戏是被外框绑定的。
框架本身以像素为单位设置,我将其转换为坐标 (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);
}

水果是不会移动的静态物体。

所有吃豆人的通用速度为每秒 1 米,进食半径为 1 米,这意味着特定吃豆人进食半径内的每个水果都将被吃掉并从水果列表中删除(“进食半径”更像一个半径为 1 米的三维球体)。

吃豆人的运动是由一种算法确定的(算法:使用水果和吃豆人的列表,我们计算两个列表中两个物体的距离,取特定吃豆人所需的最小距离.

距离公式:

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

就桂而言:

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);
            
}
}

我的主要目标是在我将对象(pacmens 和水果)放在地图上之后,它应该看起来像这样:https://media.giphy.com/media/5UDHI0JLxBBElUFuCs/giphy.gif

我正在寻找一个大致的方向,让我的打包员像这样移动而不是保持静止。

【问题讨论】:

  • TL;博士请发帖minimal reproducible example。我们不需要对您的应用程序了解太多,就可以回答诸如“使对象按特定标准移动”之类的一般性问题。有关 mcve 和基于计算移动对象的示例,请参阅 this answer

标签: java swing awt graphics2d java-2d


【解决方案1】:

你想让吃豆人(?)直线追逐水果,对吧? 这真的很简单,如果您添加越来越多的功能,它应该看起来很有趣。

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

矢量 * 速度 * 时间增量

",其中 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 足够近,您只能从列表中删除它们。要添加水果,您也可以这样做,将它们添加到列表中。您还可以让 pacman 存储水果对象以模拟“目标锁定”或不断检查最近的水果。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 2011-09-14
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多