Jeremy Maldonado Ответов: 1

Как бы я добавил обнаружение столкновений для своей программы


Я создаю программу для имитации вспышки болезни. Программа будет иметь несколько кругов, прыгающих по экрану. У меня есть класс для окна и класс для сущностей. Я создаю экземпляры класса и добавляю их в ArrayList. Я не могу узнать, как добавить обнаружение столкновений. Должен ли я добавить его в класс сущностей? или к классу "драйвер", который управляет фреймом.
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

import javax.swing.JFrame;

public class Simulation {
	static ArrayList<Entity> people = new ArrayList<Entity>();
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("Enter a Number for the population");
		int population = scan.nextInt();
		
		JFrame frame = new JFrame("Outbreak");
		frame.setSize(1000,1000);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		for (int i=0; i<population;i++) {
			frame.setVisible(true);
			Random rand = new Random();
			int xPos = rand.nextInt(900)+50;
			int yPos = rand.nextInt(900)+50;
			if (i==0) {
				Entity person = new Entity(xPos, yPos, true);
				frame.add(person);
				people.add(person);
				
			}else {
				Entity person = new Entity(xPos, yPos, false);
				frame.add(person);
				people.add(person);
			}
		} 
	}
}


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.Timer;
import javax.swing.JComponent;

public class Entity extends JComponent implements ActionListener{
	
	private int xPos;
	private int yPos;
	
	private int size = 20;
	
	private boolean patientZero;
	
	private boolean carrier;

	
	
	Timer tm = 	new Timer(5, this);
	private int xVel = 2;
	private int yVel = 2;
	

	
	public Entity(int xPos, int yPos, boolean zero) {
		this.xPos = xPos;
		this.yPos = yPos;
		if (zero) {
			patientZero = true;
		}else {
			patientZero = false;
		}
	}
	
	
	public void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;
		if (patientZero) {
			g2.setColor(Color.RED);
		}else {
			g2.setColor(Color.BLUE);
		}
		g2.drawOval(this.xPos, this.yPos, size, size);
		g2.fillOval(this.xPos, this.yPos, size, size);
		
		tm.start();
	}
	
	
	public int getX() {
		return xPos;
	}
	public int getY() {
		return yPos;
	}
	
	
	public boolean checkCollision() {
		return false;
	}
	public void actionPerformed(ActionEvent e) {
		if (xPos < 0 || xPos > 950) {
			xVel = -xVel;
		}
		if (yPos < 0 || yPos > 800) {
			yVel = -yVel;
		}
		xPos = xPos+xVel;
		yPos = yPos+yVel;
		

		if (checkCollision()) {
			xVel = -xVel;
			yVel = -yVel;
		}
		repaint();
	}



}

Любая помощь очень ценится

Что я уже пробовал:

Я знаю, что есть способы проверить столкновение овалов (кругов в моем случае) с помощью теоремы Пифагора, но я не знаю, как проверить все круги, Если это имеет смысл.

1 Ответов

Рейтинг:
1

Gerry Schmitz

Во время каждого кадра перемещайте каждый круг, затем циклически проходите через каждый круг, вызывая метод на круге, называемый "IsInContact", и делайте все необходимое для обнаружения "контакта".

"Столкновение" подразумевает событие, тогда как "в контакте" - это состояние, которое более значимо в контексте одного кадра (и применимо к кругу).