Salve a tutti, sto facendo Pacman, solo che con la classe del fantasmino sto avendo alcuni problemi, sul controllo del fantasmino per meglio dire... vi posto qui tutte le classi. Il fantasmino praticamente quello che dovrebbe fare è calcolare un nuovo percorso una volta che interseca il muro, quello che fa è che rimane fermo e impazzisce... provare per credere. Ecco qui le classi.

codice:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.Timer;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;


public class Main extends JPanel implements KeyListener{
	
	static JFrame f,f1,f2;
	static JPanel p1;
	static Main p;
	static Image imgProiettile,imgSfondo,imgPacman,imgFantasminoRosso,imgFantasminoViola,imgFantasminoVerde,imgFantasminoArancione;
	static int direzioniRandom,xProiettile,yProiettile,oldDirezioni,direzioni,tastoPremuto,xPacman=17,yPacman=19,x,y,xOldPacman,yOldPacman,xFantasminoRosso=340,yFantasminoRosso=250,xOldFantasminoRosso,yOldFantasminoRosso,distanzaPacmanFantasminoRosso,differenzaCoordinataxRosso,differenzaCoordinatayRosso,xFantasminoVerde=340,yFantasminoVerde=250,xOldFantasminoVerde,yOldFantasminoVerde,distanzaPacmanFantasminoVerde,differenzaCoordinataxVerde,differenzaCoordinatayVerde,xFantasminoViola=340,yFantasminoViola=250,xOldFantasminoViola,yOldFantasminoViola,distanzaPacmanFantasminoViola,differenzaCoordinataxViola,differenzaCoordinatayViola,xFantasminoArancione=340,yFantasminoArancione=250,xOldFantasminoArancione,yOldFantasminoArancione,distanzaPacmanFantasminoArancione,differenzaCoordinataxArancione,differenzaCoordinatayArancione;
	static Shape Proiettile,Pacman,Pallini,FantasminoRosso,FantasminoVerde,FantasminoViola,FantasminoArancione;
	static ArrayList <Shape> muri,Palle,Mostri,proiettili ;
	static Pacman pac;
	static boolean muroCostruito=false,pallaAggiunta=false,finestraPrincipale=true,finestraGioco=false,intersecato=false;
	static Graphics2D g1;
	static Fantasmino fant;
	static Fantasmino2 fant2;
	static Fantasmino3 fant3;
	static Fantasmino4 fant4;
	
	
	public static void main(String[] args) {
		Mostri = new ArrayList<Shape>();
        muri = new ArrayList<Shape>();
		Palle = new ArrayList<Shape>();
		proiettili = new ArrayList<Shape>();
		JFrame f = new JFrame();
		p = new Main();
		Dimension screenD = Toolkit.getDefaultToolkit().getScreenSize();
		
		f.setSize(476,428);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocation( (screenD.width-486) /2 ,(screenD.height- 438)/2 );
		p.setBackground(Color.BLUE);
		imgFantasminoRosso =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\Gifs\\Rosso2.gif");       
		imgProiettile =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\Gifs\\Proiettile.gif");       
		imgFantasminoViola =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\Gifs\\viola2.gif");       
		imgFantasminoVerde =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\Gifs\\verde2.gif");       
		imgFantasminoArancione =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\Gifs\\arancione2.gif");       
		imgPacman =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\gifs\\rambo2DX.gif");       
		p.addKeyListener(p);
		p.setFocusable(true);
		
		f.setResizable(false);
		f.add(p);
		f.setVisible(true);
		
		pac = new Pacman();
		fant = new Fantasmino();
		fant2 = new Fantasmino2();
		fant3 = new Fantasmino3();
		fant4 = new Fantasmino4();

		pac.start();
		fant.start();
		

	}

	
	public void paint (Graphics g){
		g1 = (Graphics2D)g ; 
		super.paint(g1);
		g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
		
		

		g1.drawImage(imgPacman, xPacman,yPacman, 35,35, this);
		g1.drawImage(imgFantasminoRosso, xFantasminoRosso,yFantasminoRosso, 30,30, this);
		
		Pacman = new Rectangle2D.Double(xPacman,yPacman,30,30);
		FantasminoRosso = new Rectangle2D.Double(xFantasminoRosso,yFantasminoRosso,30,30);
		
		

		aggiungiMuro(0,80,40,20);
		aggiungiMuro(0,100,20,60);
		aggiungiMuro(0,240,20,80);
		aggiungiMuro(20,300,20,20);
		aggiungiMuro(100,320,50,80);
		aggiungiMuro(100,220, 50,20);
		aggiungiMuro(100,160, 50,20);
		aggiungiMuro(100,0, 50,80);
		aggiungiMuro(200,60, 90,20);
		aggiungiMuro(200,220, 90,20);
		aggiungiMuro(200,160, 20,60);
		aggiungiMuro(270,160,20,60);
		aggiungiMuro(260,160, 10,20);
		aggiungiMuro(220,160, 10,20);
		aggiungiMuro(200,320,90,20);
		aggiungiMuro(340,0, 50,80);
		aggiungiMuro(340,160, 50,20);
		aggiungiMuro(340,220, 50,20);
		aggiungiMuro(340,320, 50,80);
		aggiungiMuro(430,300, 20,20);
		aggiungiMuro(450,240,20,80);
		aggiungiMuro(430,80, 20,20);
		aggiungiMuro(450,80, 20,80);
		aggiungiMuro(0,0,480,3);
		aggiungiMuro(0,0,3,80);
		aggiungiMuro(0,320,3,100);
		aggiungiMuro(0,397,470,3);
		aggiungiMuro(467,0,3,80);
		aggiungiMuro(467,320,3,100);
		muroCostruito = true ;
		for (int i=0;i<muri.size();i++){
				g1.fill(muri.get(i));
				}
		
		aggiungiPalla(60,30,10);
		aggiungiPalla(90,30,10);
		aggiungiPalla(120,30,10);
		aggiungiPalla(60,60,10);
		aggiungiPalla(90,60,10);
		aggiungiPalla(120,60,10);
		aggiungiPalla(90,100,10);
		aggiungiPalla(120,100,10);
		aggiungiPalla(20,100,10);
		aggiungiPalla(20,120,10);
		aggiungiPalla(20,140,10);
		aggiungiPalla(20,160,10);
		aggiungiPalla(20,180,10);
		pallaAggiunta = true;
		for (int i=0;i<Palle.size();i++)
			g1.fill(Palle.get(i));



		}

	
	public static void aggiungiMuro(int xMuro,int yMuro,int lunghezza,int larghezza){
		Rectangle2D muro = new Rectangle2D.Double(xMuro, yMuro, lunghezza, larghezza);
		g1.setColor(Color.BLACK);

		if(!muroCostruito){
		muri.add(muro);

		}
		}
	
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode()== KeyEvent.VK_LEFT){
			imgPacman =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\gifs\\rambo2SX.gif");       
		
			tastoPremuto= 1;
		}
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			imgPacman =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\gifs\\rambo2DX.gif");       
	
			tastoPremuto = 2;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			imgPacman =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\gifs\\rambo2DW.gif");       

	
			tastoPremuto = 3;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_UP){
			imgPacman =Toolkit.getDefaultToolkit().createImage("D:\\Università\\Java\\eclipse\\Pacman\\gifs\\rambo2UP.gif");       
	
			tastoPremuto = 4;
		}
		if(e.getKeyCode()==KeyEvent.VK_SPACE){
			proiettili.add(Proiettile);
			switch (Main.tastoPremuto)
			{
			case 1 :
					
					xProiettile --;
						
						
					break ;
			case 2 : 
					   
					xProiettile++;
					
					break ;
			case 3 : 
					yProiettile++;
					break;
			case 4 : 
					yProiettile--;
					break;
			}
		}
	
	}


	
	
	public static void aggiungiPalla(int xPalla,int yPalla , int raggio){
		Ellipse2D Pallini = new Ellipse2D.Double(xPalla,yPalla,raggio,raggio); 

		g1.setColor(Color.yellow);
		if(!pallaAggiunta){
			Palle.add(Pallini);
		}
	}
	
	
	
	
	

	public void keyReleased(KeyEvent arg0) {}
	public void keyTyped(KeyEvent arg0) {}


	
	


}


poi c'è la classe di Pacman


codice:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;


public class Pacman extends Thread 
	{
	
	public void run()
		{
		while(true)
			{

			for(int i=0;i<Main.muri.size();i++)
				{

				if(Main.muri.get(i).intersects((Rectangle2D) Main.Pacman))
					{
					 
					Main.tastoPremuto =0;
					 Main.xPacman = Main.xOldPacman ;
					 Main.yPacman = Main.yOldPacman ;
					}
				
				}	
		
			
			switch (Main.tastoPremuto)
				{
				case 1 :
						Main.xOldPacman = Main.xPacman; 
						Main.yOldPacman = Main.yPacman;
						Main.xPacman --;
						if(Main.xPacman+20==0)
							{
							if(Main.yPacman>160 || Main.yPacman <220)
								{
								Main.xPacman = 476;
								}		
							}
						break ;
				case 2 : 
						Main.xOldPacman = Main.xPacman; 
						Main.yOldPacman = Main.yPacman;    
						Main.xPacman++;
						if(Main.xPacman==476)
						 	{
							if(Main.yPacman>160 || Main.yPacman <220)
								{
								Main.xPacman = -20;
								}		
						 	}
						break ;
				case 3 : 
						Main.xOldPacman = Main.xPacman; 
						Main.yOldPacman = Main.yPacman;
						Main.yPacman++;
						break;
				case 4 : 
						Main.xOldPacman = Main.xPacman; 
						Main.yOldPacman = Main.yPacman;
						Main.yPacman--;
						break;
				}
						for (int i=0;i<Main.Palle.size();i++){
							if(Main.Palle.get(i).intersects((Rectangle2D)Main.Pacman))
							{
								Main.Palle.remove(i);
							}
						}
						Main.p.repaint();
				
			try
				{ 
				Thread.sleep(5);
				}
			catch(InterruptedException e)
				{
				
				}
			}
		}
}