Ich habe ein kleines Problem beim Ändern der Farbe eines 2d Objekts. Ich habe mir den Code für ein Pong-Spiel aus dem Internet genommen, um ihn für ein eigenes Spiel umzuschreiben. Mein Spiel besitzt 3 Klassen: Die Pong Class:
Die PongPanel Class:
Und die Ball Class:
Nun zum eigentlichen Problem: Ich möchte dass der Ball die Farbe zufällig auf Rot, Gelb, Blau oder Grün ändert, wenn er die Kante von einem der Würfel an den beiden Seiten berührt und diese dann bis zur nächsten Berührung behält. Prinzipiell funktiert das Ändern der Farbe schon, aber wenn danach wieder die repaint()-Methode aufgerufen wird, ist der Ball wieder schwarz.
Was ich schon versucht habe ist:
Aber auch so wurde der Ball wieder schwarz. Auch nach einer Möglichkeit zum Festlegen einer Standardfarbe habe ich gesucht, aber etwas dertiges habe ich nirgendwo gefunden.
Ich weiß echt nicht mehr weiter und es wäre sehr nett wenn mir jemand helfen könnte.
Java:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.JTextField;
public class Pong extends JFrame {
private PongPanel panel;
double buttonclicksG2=0;
double buttonclicksG3=0;
ImageIcon myImage = new ImageIcon("Images/Würfel2.png");
public Pong() {
setResizable(false);
getContentPane().setForeground(Color.BLACK);
setSize(690, 346);
setTitle("Pong");
setBackground(Color.WHITE);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setLayout(null);
JButton btnNewButton = new JButton(myImage);
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Noch ohne Funktion
}
});
btnNewButton.setBounds(0, 112, 65, 65);
getContentPane().add(btnNewButton);
panel = new PongPanel(this);
panel.setBounds(65, 106, 554, 71);
getContentPane().add(panel);
JButton btnNewButton_1 = new JButton(myImage);
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Noch ohne Funktion
}
});
btnNewButton_1.setBounds(619, 112, 65, 65);
getContentPane().add(btnNewButton_1);
}
public PongPanel getPanel() {
return panel;
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Throwable e) {
e.printStackTrace();
}
new Pong();
}
}
Die PongPanel Class:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
import javax.swing.Timer;
public class PongPanel extends JPanel implements ActionListener{
private Pong game;
private Ball ball;
public PongPanel(Pong game) {
Color c = new Color(240, 240, 240);
setBackground(c);
this.game = game;
ball = new Ball(game);
Timer timer = new Timer(5, this);
timer.start();
setFocusable(true);
}
private void update() {
ball.update();
}
public void actionPerformed(ActionEvent e) {
update();
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
ball.paint(g);
}
}
Und die Ball Class:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.HashMap;
import javax.swing.JOptionPane;
public class Ball {
private static final int WIDTH = 30, HEIGHT = 30;
private Pong game;
private int x, y, xa = 2;
public Ball(Pong game) {
this.game = game;
x = game.getWidth() / 2;
y = game.getHeight()/2-150;
}
public void update() {
x += xa;
if (x < 0) {
x = 0;
xa = -xa;
}
else if (x > game.getWidth() - WIDTH - 135) {
xa = -xa;
}
else {
}
}
public Rectangle getBounds() {
return new Rectangle(x, y, WIDTH, HEIGHT);
}
public void paint(Graphics g) {
if (x < 1||x > game.getWidth() - WIDTH - 135) {
int zufallszahl = getZufallszahl();
if (zufallszahl<1||zufallszahl>4){
} else if (zufallszahl==1){
Color Kreisfarbe = new Color(255, 0, 0);
g.setColor(Kreisfarbe);
g.fillRect(x, y, WIDTH, HEIGHT);
} else if (zufallszahl==2){
Color Kreisfarbe = new Color(228, 255, 0);
g.setColor(Kreisfarbe);
g.fillRect(x, y, WIDTH, HEIGHT);
} else if (zufallszahl==3){
Color Kreisfarbe = new Color(32, 255, 60);
g.setColor(Kreisfarbe);
g.fillRect(x, y, WIDTH, HEIGHT);
} else if (zufallszahl==4){
Color Kreisfarbe = new Color(56, 140, 255);
g.setColor(Kreisfarbe);
g.fillRect(x, y, WIDTH, HEIGHT);
}
} else {
g.fillRect(x, y, WIDTH, HEIGHT);
}
}
private static int getZufallszahl(){
int zufallszahl;
zufallszahl = (int) (Math.random() * 4+1);
return zufallszahl;
}
}
Nun zum eigentlichen Problem: Ich möchte dass der Ball die Farbe zufällig auf Rot, Gelb, Blau oder Grün ändert, wenn er die Kante von einem der Würfel an den beiden Seiten berührt und diese dann bis zur nächsten Berührung behält. Prinzipiell funktiert das Ändern der Farbe schon, aber wenn danach wieder die repaint()-Methode aufgerufen wird, ist der Ball wieder schwarz.
Was ich schon versucht habe ist:
Java:
g.setColor(g.getColor);
Ich weiß echt nicht mehr weiter und es wäre sehr nett wenn mir jemand helfen könnte.