19aslan05
Goto Top

Probleme beim Breakout Game

Guten Abend,

Ich beschäftige mich nun seit 4 Wochen mit der Programmierung des Spiels Breakout Game und habe soweit alles fertig. Ich habe letztendlich jedoch kleinere Probleme gefunden, die ich aber nicht lösen kann und würde mich über Hilfe freuen.

Probleme: - Bei Kontakt zwischen dem Ball und den Blöcken wird der Ball zwar meistens abgeprallt, aber manchmal fliegt dieser auch hindurch, sodass der Ball einfach weiter noch oben fliegt.
- Wenn das Spiel beginnt spawnt der Ball zwar in der Mitte, aber wenn der Ball unten rausfliegt kommt er nach einer Weile wieder oben heraus, statt wieder von der Mitte anzufangen. (Hierzu weiß ich leider nicht, wie ich das machen sollte.)
- Mein letztes Problem wäre, dass ich nicht genau weis, wie ich einen Neustart des Spiels mache, wenn alle Blöcke zersötrt sind.

Mein Code besteht aus 4 Klassen, ich werde diese hier rein stellen und hoffe auf eure Hilfe face-smile

Main Klasse:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class Main extends Applet implements Runnable, KeyListener
{
	// Doppelpuffer Variablen
	private Image dbImage;
	private Graphics dbGraphics;
	
	private Thread th = new Thread(this);
	private boolean running = true;
	
	private int fps = 50;
	
	private int punkte = 0;
	private int zerstört = 0;
	private int maxBricks = 0;
	
	private Ball ball;
	private Player player;
	private ArrayList<Brick> bricks = new ArrayList<Brick>();
	
	private String level = {".........................",  
			                  ".........................",  
			                  "..b....b....b....b.....",  
			                  ".........................",  
			                  "..b....b....b....b.....",  
			                  ".........................",  
			                  "..b....b....b....b.....",  
			                  ".........................",  
			                  "..b....b....b....b.....",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  ".........................",  
			                  };
	
	public void init()
	{
		ball = new Ball(getSize().width/2,getSize().height/2,10,Color.red);
		player = new Player(150, getSize().height-32);
		
		for(int y = 0; y < level.length; y++)
		{
			for(int x = 0; x < level[y].length(); x++)
			{
				if(level[y].charAt(x) == 'b')  
				{
					bricks.add(new Brick(x*16, y*16));
					maxBricks++;
				}
			}
		}
		
		addKeyListener(this);
	}
	public void start()
	{
		th.start();
	}
	public void stop()
	{
		running = false;
	}
	public void destroy()
	{
		running = false;
	}
	public void run()
	{
		while(running)
		{
			ball.move(getSize(), player);
			player.move(getSize().width);
			
			for(int i = 0; i < bricks.size(); i++)
			{
				ball.checkCollision(bricks.get(i));
				if(!bricks.get(i).alive)
				{
					bricks.remove(i);
					punkte++;
					zerstört++;
				}
			}
			
			repaint();
			try
			{
				Thread.sleep(1000/fps);
			}
			catch(Exception e)
			{
				
			}
		}
	}
	
	public void update(Graphics g)
	{
		if(dbImage == null)
		{
			dbImage = createImage(this.getSize().width, this.getSize().height);
			dbGraphics = dbImage.getGraphics();
		}
		
		dbGraphics.setColor(this.getBackground());
		dbGraphics.fillRect(0,0,this.getSize().width, this.getSize().height);
		
		dbGraphics.setColor(this.getForeground());
		paint(dbGraphics);
		
		g.drawImage(dbImage,0,0,this);
	}
	
	public void paint(Graphics g)
	{
		g.fillRect(0, 0, getSize().width, getSize().height);
		ball.draw(g);
		player.draw(g);
		for(Brick b : bricks)
		{
			b.draw(g);
		}
		g.setColor(Color.blue);
		g.drawString("Punkte: "+punkte,10,20);  
		g.drawString(zerstört+"/"+maxBricks,370,20);	  
	}
	public void keyPressed (KeyEvent e)
	{
		if(e.getKeyCode() == KeyEvent.VK_LEFT)
		{
			player.goingLeft = true;
		}
		if(e.getKeyCode() == KeyEvent.VK_RIGHT)
		{
			player.goingRight = true;
		}
	}
	public void keyReleased (KeyEvent e)
	{
		if(e.getKeyCode() == KeyEvent.VK_LEFT)
		{
			player.goingLeft = false;
		}
		if(e.getKeyCode() == KeyEvent.VK_RIGHT)
		{
			player.goingRight = false;
		}
	}
}

Ball Klasse:

import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.Random;


public class Ball
{
	private double x = 0, y = 0, xspeed = 4.5, yspeed = 4.5, radius = 15;
	private Color color = Color.blue;
	private Ellipse2D.Double bounds;
	private Random rand = new Random();


	public Ball(int x, int y)
	{
		this.x = x;
		this.y = y;
	}	

	public Ball(int x, int y, int radius, Color color)
	{
		this.x = x;
		this.y = y;
		this.radius = radius;
		this.color = color;
	}	
	
	public void checkCollision(Brick b)
	{
		Rectangle2D.Double self = new Rectangle2D.Double(x-radius, y-radius, radius*2, radius*2);
		Rectangle2D.Double brick = new Rectangle2D.Double(b.x, b.y, b.width, b.height);
		if(self.intersects(brick))
		{
			b.alive = false;
			
			if(x > b.x && x+radius*2 < b.x+b.width)
			{
				yspeed = -yspeed;
			}
			else
			{
				xspeed = -xspeed;
			}
		}
	}
	
	public void move (Dimension dim, Player player)
	{
		x += xspeed;
		y += yspeed;
		
		if(x < 0)
			xspeed = Math.abs(xspeed);
		if(x > dim.width)
			xspeed = -Math.abs(xspeed);
		
		if(y < 0)
			yspeed = Math.abs(yspeed);
		
/*		if(x > player.getX() && x < player.getX() + player.getWidth())
		{
			if(y >= player.getY() && y <= player.getY()+player.getHeight())
			{
				yspeed = -Math.abs(yspeed);
				yspeed -= .2;
				
				double dist = x-(player.getX()+(player.getWidth()/2));
				xspeed = dist/10;
			}
		}*/
		
		Rectangle2D.Double playerBounds = new Rectangle2D.Double(player.getX(), player.getY(), player.getWidth(), player.getHeight());
		Rectangle2D.Double selfBounds = new Rectangle2D.Double(x-radius, y-radius, radius*2, radius*2);
		if(playerBounds.intersects(selfBounds))
		{
			yspeed = -Math.abs(yspeed);
			yspeed -= .2;
			
			double dist = x-(player.getX()+(player.getWidth()/2));
			xspeed = dist/10;
		}
		
		if(y > dim.height+200)
		{
			y = 0;
		}
	}
	
	public void draw(Graphics g)
	{
		g.setColor(color);
		g.fillOval((int)(x-radius), (int)(y-radius), (int)(radius*2), (int)(radius*2));
	}
}	

Player Klasse:

import java.awt.*;

public class Player 
{
	int x = 0, y = 0, width = 120, height = 16;
	public boolean goingLeft = false;
	public boolean goingRight = false;
	public Player(int x, int y)
	{
		this.x = x;
		this.y = y;
	}
	
	public int getX()
	{
		return x;
	}
	
	public int getY()
	{
		return y;
	}
	
	public int getWidth()
	{
		return width;
	}
	
	public int getHeight()
	{
		return height;
	}
	
	public void move(int maxWidth)
	{
		if(goingLeft)
			x -= 10;
		if(goingRight)
			x += 10;
		if(x < 0)
			x = 0;
		if(x+120 > maxWidth)
			x = maxWidth-120;
	}
	
	public void draw(Graphics g)
	{
		g.fillRect(x, y, width, height);
	}
}

Blöcke Klasse:

import java.awt.*;
import java.awt.geom.*;

public class Brick
{
	int x, y, width = 64, height = 16;
	public boolean alive = true;
	
	public Brick(int x, int y)
	{
		this.x = x;
		this.y = y;
	}
	
	public void draw(Graphics g)
	{
		g.setColor(Color.yellow);
		g.fillRect(x, y, width, height);
	}
}

Ich bedanke mich schonmal herzlich im Voraus face-smile

MfG

Aslan

Content-Key: 274834

Url: https://administrator.de/contentid/274834

Printed on: April 25, 2024 at 13:04 o'clock

Member: Snowman25
Snowman25 Jun 18, 2015 at 14:44:44 (UTC)
Goto Top
Ist das... ASCII Breakout?
Respekt...
Member: wiesi200
wiesi200 Jun 20, 2015 at 19:38:06 (UTC)
Goto Top
Tourette?
Member: Snowman25
Snowman25 Jun 21, 2015 at 15:21:28 (UTC)
Goto Top
Zitat von @wiesi200:

Tourette?

Jetzt würde ich schon gern wissen, auf welche Weise ich beleidigt wurde.
Member: wiesi200
wiesi200 Jun 21, 2015 at 17:30:31 (UTC)
Goto Top
Der Kommentar von @19Aslan05 war beleidigend.