Java Pong Game

Status
Niet open voor verdere reacties.

maarten54321

Gebruiker
Lid geworden
7 nov 2010
Berichten
121
Hallo allemaal! :)

Ik ben bezig aan mijn eerste Java game die al bijna af is, maar ik zit vast;
Het probleem ligt hem aan het "balkje". Er wordt alleen gecontroleerd als de muis bewogen is. Daardoor kan hij niet altijd controleren of het balletje wel op het balkje terecht gekomen is. Jammer kan in Java een class maar een ding erven... Dus eigenlijk wordt er alleen gecontroleerd of het balletje tegen het balkje komt als de muis tegelijkertijd beweegt. Hoe kan ik dit oplossen?

Alvast bedankt! :)

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Pong extends JFrame 
    implements MouseMotionListener {

    private JButton button;
    private JPanel panel;
    private boolean mouse = true;
    private Ball ball;
    private int mouseX;

    public static void main(String[] args) {
        Pong frame = new Pong();
        frame.setSize(476, 248);
        frame.createGUI();
        frame.show();
    }

    private void createGUI() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container window = getContentPane();
        window.setLayout(new FlowLayout());
        
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(450, 200));
        panel.setBackground(Color.white);
        panel.addMouseMotionListener(this);
        window.add(panel);
    }
    
    public void mouseDragged(MouseEvent e) {
    }
    
    public void lose() {
        ball.stop();
        
        JOptionPane.showMessageDialog(null, "You hava losed!");
        
        System.exit(0);
    }
    
    public void draw() {
        Graphics paper = panel.getGraphics();
        
        paper.setColor(Color.white);
        paper.fillRect(0, 190, 450, 10);
        
        paper.setColor(Color.red);
        paper.fillRect(mouseX, 190, 35, 10);
    }
    
    public void control() {
        int ballX = ball.getX();
        int ballY = ball.getY();
        final int width = 35;
        
        //Handles only x
        if ((ballY == 180) && (mouseX - 16 < ballX) && (mouseX + 16 > ballX)) {
            
        }
        else {
           lose();
        }
    }
    
    public void mouseMoved(MouseEvent e) {
        mouseX = e.getX();
        
        if (mouse) {
        ball = new Ball(panel);
        ball.start();
        mouse = false;
        }
        
        draw();
        control();
    }
}

class Ball extends Thread {
    
    private Graphics graphics;
    
    private int x = 0;
    private int y = 0;
    
    private boolean running = true;
    
    private int xChange = 1;
    private int yChange = 1;
    
    private int diameter = 10;
    private Color color = Color.blue;
    
    public Ball(JPanel panel) {
        graphics = panel.getGraphics();
    }
    
    public void changeColor(Color c) {
        color = c;
    }
    
    public Color getColor() {
        return color;
    }
    
    public void changeDiameter(int d) {
        diameter = d;
    }
    
    public int getDiameter() {
        return diameter;
    }
    
    public int getX() {
        return x;
    }
    
    public int getY() {
        return y;
    }
    
    public void run() {
        while (running) {
        delete();
        move();
        bounce();
        draw();
        delay();
        }
    }
    
    private void delete() {
        graphics.setColor(Color.white);
        graphics.fillOval(x,y,diameter,diameter);
    }
    
    private void move() {
        x = x + xChange;
        y = y + yChange;
    }
    
    private void bounce() {
        //Handles x
        if ((x == 0) || (x == 440)) {
            xChange = -xChange;
        }
        //Handles y
        if ((y == 0) || (y==180)) {
            yChange = -yChange;
        }
    }
    
    private void draw() {
        graphics.setColor(color);
        graphics.fillOval(x,y,diameter,diameter);
    }
  
    private void delay() {
        try {
            Thread.sleep(8);
        }
        catch (InterruptedException e) {
        }
    }
}
 
Laatst bewerkt:
Hey Maarten,

Wat je zegt is niet helemaal waar:
Abstracte klassen (die gebruik maken van extends), daarvan kan er maar één worden geïmplementeerd.
Interfaces (die gebruik maken van implements), daarvan kunnen er meerdere worden geïmplementeerd.

Wat mogelijk een idee is om bijvoorbeeld gebruik te maken van een javax.swing.Timer,
en gebruik te maken van de ActionListener.

Sowieso zou ik het absoluut NIET aanraden om gebruik te maken van een thread voor een bal!
Je kan dit straks allemaal in de timer kwijt!

Kijk hier maar eens naar:
http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

Als je vragen hebt horen we het!
 
Bedankt! :D
Misschien gaat het met interfaces, maar wat is nu echt de bedoeling van interfaces. Normaal beschrijven deze toch een bepaalde class?

Alvast bedankt! :D
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan