Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Java, il fantasmino si blocca sui muri!

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

  2. #2
    Questa è la classe del fantasmino
    e infine la classe del fantasmino


    codice:
    import java.awt.geom.Rectangle2D;
    
    
    public class Fantasmino extends Thread{
    	public void run()
    	{
    	while(true)
    		{
    		Main.differenzaCoordinataxRosso=Main.xPacman -Main.xFantasminoRosso;
    		Main.differenzaCoordinatayRosso=Main.yPacman -Main.yFantasminoRosso;
    		Main.xOldFantasminoRosso = Main.xFantasminoRosso;
    		Main.yOldFantasminoRosso = Main.yFantasminoRosso;
    	 switch (Main.direzioni){
    		
    	 
    		case 1: {	
    					Main.xFantasminoRosso--;
    				}break;
    		case 2: {
    			 	
    			 	 	Main.xFantasminoRosso++;
    				}break;
    		case 3: {
    				
    				 	Main.yFantasminoRosso--;
    			
    				}break;
    		case 4: {
    				
    					Main.yFantasminoRosso++;
    				}break;
    		case 5: {
    					if(Main.differenzaCoordinataxRosso>0){
    						Main.xFantasminoRosso ++;
    					}
    					if(Main.differenzaCoordinataxRosso<0){
    						Main.xFantasminoRosso --;
    					}
    				}break;
    		case 6: {
    					if(Main.differenzaCoordinatayRosso>0){
    						Main.yFantasminoRosso ++;
    					}
    					if(Main.differenzaCoordinatayRosso<0){
    						Main.yFantasminoRosso --;
    					}
    		}break;
    	 }
    	
    	 // classe, run e whiletrue
    	 
    	 if(Main.differenzaCoordinataxRosso<Main.differenzaCoordinatayRosso)
    		{
    		 								if(Main.differenzaCoordinataxRosso<0){
    		 										Main.direzioni =1;
    		
    		 													}
    		 								if(Main.differenzaCoordinataxRosso>0){
    		 										Main.direzioni =2;
    		 													}
    		 								if(Main.differenzaCoordinataxRosso==0){
    		 											if(Main.differenzaCoordinatayRosso<0){
    		 																	Main.direzioni=3;
    		 																					}
    		 											if(Main.differenzaCoordinatayRosso>0){
    		 																	Main.direzioni=4;
    		 																					}
    		 													}
    		
    		
    		}
    	if(Main.differenzaCoordinataxRosso>Main.differenzaCoordinatayRosso){
    										if(Main.differenzaCoordinatayRosso>0){
    												Main.direzioni = 4;			
    															}
    										if(Main.differenzaCoordinatayRosso<0){
    												Main.direzioni = 3;
    															}
    	
    										if(Main.differenzaCoordinatayRosso==0){
    												if(Main.differenzaCoordinataxRosso<0){
    																			Main.direzioni =1;
    			
    																								}
    												if(Main.differenzaCoordinataxRosso>0){
    																			Main.direzioni =2;
    																								}
    			
    															}
    		}
    	if(Main.differenzaCoordinataxRosso==Main.differenzaCoordinatayRosso){
    										Main.direzioni = (int)Math.random()*6+5;
    	}
    		for(int i=0;i<Main.muri.size();i++)
    		{
    
    										if(Main.muri.get(i).intersects((Rectangle2D) Main.FantasminoRosso)){
    										Main.xFantasminoRosso= Main.xOldFantasminoRosso;
    										Main.yFantasminoRosso=Main.yOldFantasminoRosso;
    										Main.intersecato=true;
    										}
    										}
    												if(Main.intersecato==true){
    												if(Main.direzioni==1 || Main.direzioni ==2) {
    													System.out.println("intersecato asse x");
    
    																			if(Main.differenzaCoordinatayRosso>0){
    																				System.out.println("cambio direzione 4");
    																					
    																				Main.direzioni = 4;			
    																													}
    																			if(Main.differenzaCoordinatayRosso<0){
    																				System.out.println("cambio direzione 3");
    					
    																				Main.direzioni = 3;
    																												}
    																			if(Main.differenzaCoordinatayRosso==0){
    																				Main.direzioni = (int)Math.random()*4+3;
    																			}
    																						Main.intersecato=false;	}
    													if(Main.intersecato==true){	
    														System.out.println("intersecato asse y");
    
    												if(Main.direzioni==3 || Main.direzioni==4){
    																			if(Main.differenzaCoordinataxRosso<0){
    																									Main.direzioni =1;
    																													}
    																			if(Main.differenzaCoordinataxRosso>0){
    																									Main.direzioni= 2;
    																													}
    																			if(Main.differenzaCoordinataxRosso==0){
    																				 		Main.direzioni = (int)Math.random()*2+1;
    
    																			}																									Main.intersecato=false;
    																					}
    													}
    													} 
    	try
    	{ 
    	Thread.sleep(7);
    	}
    catch(InterruptedException e)
    	{
    	
    	}
    }	
    }
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ho capito, ma per risolvere il tuo problema (che anche se è specifico) dobbiamo prenderci tutto il tuo codice e debuggarlo, cosa che non tutti hanno tempo/voglia di farlo.

    Prova ad attaccare un debugger (semplificando il tutto gestendo solo il fantasmino) e vedi cosa dovrebbe fare che non fa (o che non fa correttamente

  4. #4
    Se vi può aiutare il problema è solo nel codice dove c'è l'intersect, lo so perchè senza di quello il fantasmino insegue pacman in modo perfetto, è solo che non rispetta i muri...

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ok e tu sai quale è il problema.
    Scrivi su un foglio cosa deve fare in teoria (in pseudo codice) e scrivi sull'altro cosa in realtà fa.
    A questo punto puoi iniziare a vedere cosa non va nel codice

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.