Gui заставить объект двигаться по определенным критериям - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь создать определенную «игру Пакмана».
В основном, основными объектами являются: пакман и фрукты.

Фоновое изображение - это изображение определенной карты, означающее, что игра ограничена внешней рамкой.
Сам кадр установлен в пикселях, которые я преобразую в координаты ( Преобразование в шир. /lng координаты пикселей на заданной карте (с 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 метр).

Движение Пакмена определяется алгоритмом ( Алгоритм : используя список фруктов и pacmen, мы вычисляем расстояние 2объекты из обоих списков, принимая минимальное расстояние, необходимое для перемещения конкретного пакмана.

Формула расстояния:

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

}
}

Моя главная цель - после того, как я поставлю свои предметы (pacmens и фрукты) oНа карте это должно выглядеть примерно так: https://media.giphy.com/media/5UDHI0JLxBBElUFuCs/giphy.gif

Я ищу общее руководство, как заставить моих упаковщиков двигаться так, а не оставаться неподвижными.

1 Ответ

0 голосов
/ 19 декабря 2018

Вы хотите сделать так, чтобы пак-мужчины (?) Преследовали фрукты по прямой линии, верно?Это действительно просто, и это должно выглядеть весело, если вы добавляете все больше и больше функций.

Вы бы сделали цикл, пытаясь найти ближайший фрукт, а затем проведите линию, используя две точки: положение пакмана ифрукты.Затем вам нужно вычесть точку плода минус пакман.Это вектор, представляющий линию, которую должен пройти pacman.Нормализовать вектор, чтобы получить вектор единичной длины, с которым мы можем работать.Теперь нам нужно добавить крошечную долю этого вектора, чтобы переместить пакмана к фрукту.Формула выглядит так: «

вектор * скорость * time_delta

», где time_delta равно 1, деленному на частоту кадров или фактическую разницу во времени, если вы можете ее получить.Я обычно использую первое.Это так за одну секунду, ваш 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.Чтобы добавить фрукты, вы можете сделать то же самое, добавить их в список.Вы также можете заставить pacman хранить объект с фруктами, чтобы имитировать «целевой замок», или постоянно проверять наличие ближайших фруктов.

Надеюсь, это помогло вам, и я хотел бы увидеть вашу игру!

...