TE
TE
Crymes
Guest
Ok, ich glaub OOP mag mich nicht
. Wenn ich das Programm in folgender Form ausführe, dann bekomme ich laufzeitfehler sowohl wenn eine eingabe stattfindet als auch wenn das Fenster wegen Größenänderung neu gezeichnet wird. Wenn ich das richtig verstehe kennen die Methoden die speicheradresse von meinen Objekten nicht, oder?
Ich poste hier mal das komplette Programm:
Klasse Kugel:
Klasse Balken:
Main Klasse Mpspiel:
. Wenn ich das Programm in folgender Form ausführe, dann bekomme ich laufzeitfehler sowohl wenn eine eingabe stattfindet als auch wenn das Fenster wegen Größenänderung neu gezeichnet wird. Wenn ich das richtig verstehe kennen die Methoden die speicheradresse von meinen Objekten nicht, oder? Ich poste hier mal das komplette Programm:
Klasse Kugel:
Code:
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.Random;
public class Kugel {
//Variablen
private int[] fenster;
private int[] position;
private int[] geschwindigkeit;
private int radius;
private int aufprall;
//Zufallsgenerator erstellen
private static Random zufallsgenerator = new Random();
private void KollisionY()
{
if(position[1] + geschwindigkeit[1] >= fenster[1] || position[1] + geschwindigkeit[1] <= 0)
{
geschwindigkeit[1] *= -1;
}
}
private int Geschwindigkeit()
{
if(aufprall >= 5)
{
aufprall = 0;
return(2);
}
return(1);
}
public Kugel(int fensterx, int fenstery, int radius)
{
//Fenstergröße festlegen
fenster = new int[2];
fenster[0] = fensterx;
fenster[1] = fenstery;
//Geschwindigkeiten per Zufall festlegen
geschwindigkeit = new int[2];
geschwindigkeit[0] = zufallsgenerator.nextInt(5);
geschwindigkeit[1] = zufallsgenerator.nextInt(5);
//Ball soll in der Mitte des Fensters starten
position = new int[2];
position[0] = fenster[0]/2;
position[1] = fenster[1]/2;
//Ballradius festlegen
this.radius = radius;
//Geschwindigkeit resetten
aufprall = 0;
}
public void Bewegung()
{
position[0] += geschwindigkeit[0]*Geschwindigkeit();
position[1] += geschwindigkeit[1]*Geschwindigkeit();
//Ball auf Kollision prüfen
KollisionY();
}
public void Slider()
{
geschwindigkeit[0] *= -1;
aufprall++;
}
public boolean KollisionX()
{
if(position[0] >= fenster[0] || position[0] <= 0)
{
return(true);
}
else
{
return(false);
}
}
public int PositionX()
{
return(position[0]);
}
public int GeschwindigkeitX()
{
return(geschwindigkeit[0]);
}
public int Radius()
{
return(this.radius);
}
public void Zeichnen(Graphics2D graphics)
{
graphics.setColor(Color.red);
graphics.fillArc(position[0], position[1], this.radius, this.radius, 0, 360);
}
}
Klasse Balken:
Code:
import java.awt.Color;
import java.awt.Graphics2D;
public class Balken {
private int[] punktoben;
private int[] punktunten;
public Balken(int linienabstandx, int fenstery)
{
//Linienpunkte initialisieren
punktoben = new int[2];
punktoben[0] = linienabstandx;
punktoben[1] = (int)(fenstery*0.5 - fenstery/8);
punktunten = new int[2];
punktunten[0] = linienabstandx;
punktunten[1] = (int)(fenstery*0.5 + fenstery/8);
}
public void MoveUp()
{
if(punktoben[1] > 0)
{
punktoben[1] -= 1;
punktunten[1] -= 1;
}
}
public void MoveDown()
{
if(punktunten[1] < 500)
{
punktoben[1] += 1;
punktunten[1] += 1;
}
}
public int ObenX()
{
return(punktoben[0]);
}
public int ObenY()
{
return(punktoben[1]);
}
public int UntenX()
{
return(punktunten[0]);
}
public int UntenY()
{
return(punktunten[1]);
}
public void Zeichnen(Graphics2D graphics)
{
graphics.setColor(Color.blue);
graphics.drawLine(punktoben[0], punktoben[1], punktunten[0], punktunten[1]);
}
}
Main Klasse Mpspiel:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.*;
public class Mpspiel extends JPanel {
private static Kugel Ball;
private static Balken SliderL;
private static Balken SliderR;
@Override
protected void paintComponent( Graphics g )
{
//Grafikobjekt erstellen und initialisieren
super.paint(g);
Graphics2D graphics = (Graphics2D) g;
graphics.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Zu Zeichnende Dinge
Ball.Zeichnen(graphics);
SliderR.Zeichnen(graphics);
SliderL.Zeichnen(graphics);
}
private static void Fenster()
{
//Fenster erstellen
JFrame Fenster = new JFrame("Multiplayer Spiel");
Fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Fenster.setSize(500, 500);
Fenster.setVisible(true);
Fenster.add(new Mpspiel());
//Eingabe behandeln
Fenster.addKeyListener(new KeyListener()
{
@Override
public void keyTyped(KeyEvent event)
{
// W(87) und S(83) Spieler 1, Pfeil hoch(38)/runter(40) Spieler 2
}
@Override
public void keyReleased(KeyEvent event)
{
//Beenden
if(event.getKeyCode() == KeyEvent.VK_ESCAPE)
{
System.exit(0);
}
}
@Override
public void keyPressed(KeyEvent event)
{
// W und S Spieler 1, Pfeil hoch/runter Spieler 2
if(event.getKeyCode() == KeyEvent.VK_W)
{
SliderL.MoveUp();
}
if(event.getKeyCode() == KeyEvent.VK_S)
{
SliderL.MoveDown();
}
if(event.getKeyCode() == KeyEvent.VK_UP)
{
SliderR.MoveUp();
}
if(event.getKeyCode() == KeyEvent.VK_DOWN)
{
SliderR.MoveDown();
}
}
});
}
public static void main(String[] args) {
//Initialisierung
Fenster();
//Objekte erstellen
Kugel Ball = new Kugel(500, 500, 10);
Balken SliderL = new Balken(30, 500);
Balken SliderR = new Balken(470, 500);
//main loop
while(true)
{
//Ball bewegen
Ball.Bewegung();
//Ball auf Kollision mit Slider prüfen
//SliderR
if((Ball.PositionX() + Ball.GeschwindigkeitX() >= 470-Ball.Radius()) && (Ball.PositionX() + Ball.Radius() <= SliderR.UntenY() && Ball.PositionX() + Ball.Radius() >= SliderR.ObenY() ))
{
Ball.Slider();
}
//SliderL
else if((Ball.PositionX() + Ball.GeschwindigkeitX() >= 30-Ball.Radius()) && (Ball.PositionX() + Ball.Radius() <= SliderL.UntenY() && Ball.PositionX() + Ball.Radius() >= SliderL.ObenY() ))
{
Ball.Slider();
}
//Ball auf GameOver überprüfen
if(Ball.KollisionX() == true)
{
Ball = new Kugel(500, 500, 10);
}
//Bild ausgeben
//Warten, ca. 33 FPS
try
{
Thread.currentThread();
Thread.sleep(30);
} catch (InterruptedException fehler)
{
}
}
}
}


.