Salve a tutti, sto facendo un minigioco e mi servirebbe un aiutino.
Il gioco consiste nel cliccare su dei bersagli con il mouse e una volta cliccati devono scomparire (una sorta di tiro al bersaglio); i bersagli devono essere generati randomicamente, con posizione casuale appena fuori dallo schermo e possono avere 3 tipi di movimenti: orizzontale, verticale e diagonale.
I bersagli che nascono a destra o a sinistra dello schermo devono muoversi orizzontalmente verso il lato opposto dello schermo e stessa cosa per quelli che nascono in alto o in basso dello schermo ma con senso verticale.
Quelli che si muovono diagonalmente invece devono essere generati agli angoli dello schermo.
Gli obiettivi non devono essere generati tutti insieme ma deve passare qualche secondo tra la generazione di ogni bersaglio.

Io ho scritto questo codice ma non so come generare i bersagli in modo random e con direzioni diverse (orizzontale,verticale, diagonale). Sapreste aiutarmi e darmi qualche consiglio?
codice:
class GiocoPanel extends JPanel{
			Dimension myGioco = new Dimension(750, 530);
			Color myColor = new Color(9, 64, 32);
			Timer t,t1;
			ArrayList bersagli;
			
			public GiocoPanel(){
				setPreferredSize(myGioco);
				setBackground(myColor);
				Genera();
				
				t = new Timer(20, new ActionListener(){
						public void actionPerformed(ActionEvent event){
							if(bersagli != null){
								for(int i=0; i<bersagli.size(); i++){
									((Bersaglio)(bersagli.get(i))).move();
								}
							}
						repaint();
					}
				});
				t.start();
			}
			public void Genera(){
				bersagli = new ArrayList();
				t1 = new Timer(1200, new ActionListener(){
						public void actionPerformed(ActionEvent event){
							bersagli.add(new Bersaglio(0,0));
							((Bersaglio)bersagli.get(bersagli.size()-1)).setSpeed(2);
							((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(1,1);
						}
				});
				t1.start();
			}							
			
			public void paintComponent(Graphics g){
				super.paintComponent(g);
				Graphics2D g2 = (Graphics2D)g;
				    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
				if(bersagli==null)
					bersagli = new ArrayList();
				else
					disegna(g2);
					g2.setColor(new Color(9,64,32));
			}
			
			public void disegna(Graphics2D g2){
				for(int i=0; i<bersagli.size(); i++){
					((Bersaglio)bersagli.get(i)).disegna(g2);
				}
			}
		}
}

class Bersaglio{
	Ellipse2D.Double cerchio1, cerchio2, cerchio3, cerchio4, cerchio5;
	double raggio;
	double G = 30;
	Point2D centro;
	Color cBersaglioRosso, cBersaglioBianco;
	Vector2 direzione;
	double speed;
	
	public Bersaglio(double x, double y){		
		centro = new Point2D.Double(x, y);
		cBersaglioRosso = new Color(210, 0 ,5);
		cBersaglioBianco = new Color(255,255,255);
		
		direzione = new Vector2(0,0);
		speed = 0;
	
		raggio = G;
		cerchio1 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2,  raggio*2);
		
		raggio = (4*G)/5;
		cerchio2 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
		
		raggio = (3*G)/5;
		cerchio3 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
		
		raggio = (2*G)/5;
		cerchio4 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
		
		raggio = G/5;
		cerchio5 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
	}
	
	public void disegna(Graphics2D figura){
				figura.setColor(cBersaglioRosso);
				figura.fill(cerchio1);
				figura.setColor(cBersaglioBianco);
				figura.fill(cerchio2);
				figura.setColor(cBersaglioRosso);
				figura.fill(cerchio3);
				figura.setColor(cBersaglioBianco);
				figura.fill(cerchio4);
				figura.setColor(cBersaglioRosso);
				figura.fill(cerchio5);
			}
		public void setSpeed(double s) {speed = s;	}
		public double getSpeed()       { return speed;  }
		public void setDirection(Vector2 v) {direzione = v; }
		public void setDirection(double dx, double dy) { direzione = new Vector2(dx,dy); direzione.normalize(); }
		public Vector2 getDirection()	{ return direzione; }
		
		public void move(){
			double raggio = G;
			centro = new Point2D.Double(centro.getX()+(direzione.getX()*speed), centro.getY()+(direzione.getY()*speed) );
			cerchio1.setFrame( centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
			raggio = (4*G)/5;
			cerchio2.setFrame(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
			raggio = (3*G)/5;
			cerchio3.setFrame(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
			raggio = (2*G)/5;
			cerchio4.setFrame(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
			raggio = G/5;
			cerchio5.setFrame(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
			}
		public void directTo(Point2D p){
			direzione = new Vector2( p.getX() - centro.getX(), p.getY() - centro.getY() );
			direzione.normalize();
		}	
}

class Vector2{
	
	private double x,y;
	
	public Vector2(double a, double b){
		x = a;
		y = b;
	}
	
	public double getX() {return x; }
	public void setX(double a) { x = a; }
	public double getY() {return y; }
	public void setY(double b) { y = b; }
	
	
	public double length(){
		return (Math.sqrt(Math.pow(x,2)+Math.pow(y,2)));
	}
	
	public void normalize(){
		double l = length();
		x = x/l;
		y = y/l;
	}
}