Results 1 to 3 of 3
  1. #1
    frallan is offline Member
    Join Date
    Nov 2009
    Posts
    1
    Rep Power
    0

    Default need help with a simple game im making

    I am making a game that is similar to a game called ''tiger kycklingstuds'' from the site extrude.se, But more simple.
    My problem is that it works fine when I only use one ball in the air, but i can't figure out how to put in several balls like in the game that i mentioned.
    I appreciate if you could help me.
    This is the code that I have written so far , it's in swedish but I hope that you will understand anyway. If not I will try to translate.

    Java Code:
    
    // Klassen TennisBana
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    class TennisBana extends JPanel implements ActionListener{
    	// Actionperformed kommer att anropas var 40 ms. Vi skriver this för
    	// att metoden finns i den egna klassen.
    	private Timer klocka=new Timer(40,this);
    	private JLabel visaPoäng; 	// för att visa poäng
    	private JLabel visaPoängliv;
    	private int poäng; 			// aktuella poäng
    	private int poängliv;
    	private int xMax;			// högsta tillåtna x-koordinat
    	private int yMax;			// högsta tillåtna y-koordinat
    	private int radie;			// bollen radie
    	private int x;				// x-koordinat, bollens mittpunkt
    	private int y;				// y-koordinat, bollens mittpunkt
    	private int vx;				// bollens fart i x-led
    	private int vy;				// bollens fart i y-led
    	private int xSteg;			// bollens steglängd i x-led
    	private int ySteg;			// bollens steglängd i y-led
    	private int racket;			// racketens vänstra kant
    	private int längdR;			// racketens längd
    	private int stegR;			// racketens steglängd
    
    	// Konstruktorn sätter storlek och bakgrundsfärg
    	public TennisBana(){
    		setPreferredSize(new Dimension(500,400));
    		setBackground(Color.white);
    
    	}
    
    	// Metoden start anropas när vi väljer ett nytt spel
    	public void start(JLabel p,JLabel pl){
    		visaPoäng=p;
    		visaPoängliv=pl;
    		// Tar reda på panelens storlek
    		xMax=getSize().width;
    		yMax=getSize().height;
    		// Egenskaper hos boll och racket bestäms
    		radie=15;
    		längdR=80;
    		stegR=15;
    		
    		nollställ();
    
    		// Lyssnar på tangentbordet. Math.max och Math.min används för att
    		// se till att racketens värde inte blir för stort eller för litet.
    		// Metoden max väljer det största av de två värdena och min det minsta.
    		addKeyListener(new KeyAdapter(){
    			public void keyPressed(KeyEvent e){
    				if(e.getKeyCode()==KeyEvent.VK_LEFT){
    					// Kontroll att vi befinner oss inom spelplan
    					racket=Math.max(0, racket-stegR);
    				}
    				else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
    					// Kontroll att vi befinner oss inom spelplan
    					racket=Math.min(xMax-längdR, racket+stegR);
    				}
    			}
    		});
    
    		// Lyssnar på storleksändringar. Om fönstrets storlek har ändrats,
    		// hämtar vi den nya storleken och tilldelar xMax och yMax nya
    		// värden. Därefter ser vi till att fönstret ritas om med repaint.
    		addComponentListener(new ComponentAdapter(){
    			public void componentResized(ComponentEvent e){
    				xMax=e.getComponent().getSize().width;
    				yMax=e.getComponent().getSize().height;
    				e.getComponent().requestFocus();
    				repaint();
    			}
    		});
    	}
    
    	// Här nollställs poängen, starthastighet och läge hos bollen bestäms
    	// och läget för utplacering av racket ges.
    	
    	
    	
    	private void nollställ(){
    
    		xSteg=vx=2;
    		ySteg=vy=5;
    		x=xMax/8;
    		y=radie+120;
    		
    	}
    	private void nytt(){
    		poäng=0;
    		visaPoäng.setText(" 0");
    		poängliv=0;
    		visaPoängliv.setText(" 0");
    		xSteg=vx=2;
    		ySteg=vy=5;
    		x=xMax/8;
    		y=radie+120;
    		racket=xMax/2-längdR/2;
    	}
    	public void startaSpel(){
    		{
    			klocka.start();
    		}
    	}
    
    	public void stoppaSpel(){
    		klocka.stop();
    	}
    
    	public void nyttSpel(){
    		stoppaSpel();
    		nytt();
    		startaSpel();
    	}
    
    	// anropas av timern var 40:e ms
    	public void actionPerformed(ActionEvent e){
    		// Här undersöks bollens läge i y-led. Först testar vi om den nått
    		// den nedre kanten
    		if(y+radie>=yMax-10){
    			
    			// Här testas om bollen missar racketen
    			if(x<racket || x>racket+längdR){
    				Toolkit.getDefaultToolkit().beep();
    				visaPoäng.setText(" " + String.valueOf(++poäng));
    				nollställ();
    				if(poäng>=3){
    					JOptionPane.showMessageDialog(null, "Du förlorade");
    					stoppaSpel();
    				}
    			}
    		
    			
    			
    			// Bollen byter rörelseriktning oavsett om det är träff
    			// eller inte.
    			ySteg=-vy;
    		}
    		// Här byter bollen riktning om den når den övre kanten av spelplanen
    		else if(y-80<=0){
    			ySteg=vy;
    		}
    		// Här byter bollen riktning i x-led om den träffar någon lodrät vägg
    		if(x-60<=0 || x+radie>=xMax){
    			xSteg=-xSteg;
    		}
    		// Här ges bollen nya x- och y-koordinater
    		x+=xSteg-1;
    		y+=ySteg;
    		// En justering om delar av bollen har råkat komma utanför spelplanen sker
    		if(y<radie){
    			y=radie;
    		}
    
    		if (x>400 && y>150)
    		{
    			visaPoängliv.setText(" " + String.valueOf(++poängliv));
    			nollställ();
    			
    			
    		}
    		
    		
    		else if(y>yMax-radie){
    			y=yMax-radie;
    		}
    
    		if(x<radie){
    			x=radie;
    		}
    		else if(x>xMax-radie){
    			x=xMax-radie;
    		}
    		// Panelen ritas om
    		repaint();
    	}
    
    
    	// Ritar bakgrundsfärg samt boll och racket
    	public void paintComponent(Graphics g){
    		super.paintComponent(g);
    		g.fillRect(0,150,60,250);
    		g.fillRect(420,150,100,250);
    		g.setColor(Color.yellow);
    		g.fillOval(x-radie,y-radie,2*radie,2*radie);
    		g.setColor(Color.yellow);
    		g.fillRect(racket,yMax-10,längdR,yMax);
    	}
    }
    Java Code:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Tennis extends JFrame{
    	// Ett nytt objekt av typen Tennisbana skapas, vilket innebär att dess
    	// konstruktor anropas
    	private TennisBana bana=new TennisBana();
    	private JLabel poäng;
    	private JLabel poängliv;
    	private JPanel p;
    	private JButton[] knapp=new JButton[4];
    	private String[] knappText={"Nytt spel","Paus","Fortsätt","Avsluta"};
    
    	public Tennis(){
    		super("Tennis");
    		poäng=new JLabel(" 0",JLabel.CENTER);
    		poängliv=new JLabel(" 0",JLabel.CENTER);
    		poäng.setFont(new Font("Arial", Font.BOLD, 30));
    		poängliv.setFont(new Font("Arial", Font.BOLD, 30));
    		p=new JPanel();
    
    		Lyssnare minLyssnare=new Lyssnare();
    
    		// Här skapar vi de fyra knappobjekten, placerar våra strängar
    		// i dessa, kopplar en lyssnare till varje samt placerar ut
    		// dem i en panel
    		for(int i=0; i<knapp.length; i++){
    			knapp[i]=new JButton();
    			knapp[i].setText(knappText[i]);
    			knapp[i].addActionListener(minLyssnare);
    			p.add(knapp[i]);
    		}
    
    		// Komponenter och paneler placeras i fönstret
    		Container c=getContentPane();
    		c.add(poäng,"West");
    		c.add(poängliv, "East");
    		c.add(bana,"Center");
    		c.add(p,"South");
    
    		addWindowListener(new WindowAdapter(){
    			public void windowClosing(WindowEvent e){
    				System.exit(0);
    			}
    		});
    
    		pack();
    		bana.start(poäng,poängliv);
    	}
    
    	class Lyssnare implements ActionListener{
    		public void actionPerformed(ActionEvent ae){
    			// requestFocus används för att flytta fokus till vår tennisbana.
    			// Vi måste kunna påverka vad som händer där då spelet har börjat.
    			// Beroende på vilken knapp vi har använt, anropas olika metoder.
    			bana.requestFocus();
    			if(ae.getSource()==knapp[0]){
    				bana.nyttSpel();
    			}
    			else if(ae.getSource()==knapp[1]){
    				bana.stoppaSpel();
    			}
    			else if(ae.getSource()==knapp[2]){
    				bana.startaSpel();
    			}
    			else{
    				System.exit(0);
    			}
    		}
    	}
    }
    Java Code:
    // Tangentbordstennis
    public class TennisStart{
    	public static void main(String[] arg){
    		Tennis tennisStart=new Tennis();
    		tennisStart.setVisible(true);
    	}
    }

  2. #2
    Fubarable's Avatar
    Fubarable is offline Moderator
    Join Date
    Jun 2008
    Posts
    19,316
    Blog Entries
    1
    Rep Power
    26

    Default

    You have a single x and a single y to represent the location of the single ball. To have multiple balls, you'll need an arraylist of java.awt.Point in place of the x and y, and you'll have to iterate through this list in your program logic and in your paintComponent.

  3. #3
    macason is offline Member
    Join Date
    Nov 2009
    Posts
    7
    Rep Power
    0

    Default

    I dont understand Swedish but Ill have a swip at it...

    Id be inclined to have ball as a seperate object that you just call ball.position to return its coorinates. Hold the balls in an array, last i looked object serialisation/deserialisation in an arraylist is a slower than a native array.

    I would create all balls you are required to use during the game up front and just set the extra's to invisible. That way you not going to slow the game down mid-flight to create new objects (balls).

    Put each ball in its own thread the sync the threads (I think this will need to be done).

    Its been a while since Ive done this stuff but thats my 2 cents....

Similar Threads

  1. Simple Game example
    By mayuresh34 in forum CLDC and MIDP
    Replies: 1
    Last Post: 10-08-2009, 01:21 PM
  2. Simple Dodging Game
    By Tb0h in forum New To Java
    Replies: 1
    Last Post: 07-18-2009, 02:30 AM
  3. making simple java environment
    By daanlaan in forum New To Java
    Replies: 0
    Last Post: 07-07-2009, 12:22 AM
  4. Making simple hiscore over internet
    By jurka in forum Networking
    Replies: 3
    Last Post: 01-21-2009, 03:23 PM
  5. Replies: 1
    Last Post: 10-02-2008, 03:06 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •