AWT Pong

J

javageschädigt

Gast
hey @ all ;)

ich muss gerade in Informatik das Spiel Pong nachbauen mit AWT. Momentan habe ich 2 Bälle eingefügt (die sich auch bewegen :D) und den linken,oberen und unteren Rand. Ein Paddel habe ich auch (was sich auch bewegt). So nun zu meinem Problem:

Ich habe das Problem, wenn der Ball am Paddel vorbeifliegt und nicht zurückgesetzt bzw. zurückgeprallt wird. Meine Frage nun wie kann ich den Ball zurücksetzen auf das Spielfeld und wie füge ich eine "Score" hinzu ??

Hoffe auf schnelle Antwort ;)
 
T

Tomate_Salat

Gast
ich muss gerade in Informatik das Spiel Pong nachbauen mit AWT.

Omg, es ist wirklich vorgabe das in AWT zu machen? Ich mein: ich bin weder Fan von Swing noch von AWT aber dann doch lieber Swing(was ja auf AWT aufbaut)

Meine Frage nun wie kann ich den Ball zurücksetzen auf das Spielfeld
Ball neu positionieren?! Da du offensichtlich schon eine Animation hast, sollte das doch kein Problem sein?


und wie füge ich eine "Score" hinzu ??
score => HighScore oder die Punkteanzahl im oberen eck?! Ja wie wärs mit Programmieren :lol:
 
J

javageschädigt

Gast
Wie kann ich das den auf Swing optimieren ??
mit Labels??

in etwa soo ??

P.S. Hier hab ich bloß das Problem beim Angucken des Applets im JBuilder der Hintergrund in den Vordergrund geht :'(

Ich hoffe ihr könntet mir dabei behilflich sein (das eilt jetzt nicht)

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

public class Pong extends JApplet implements KeyListener, Runnable{
  // Anfang Variablen
  private JPanel jpaCenter = new JPanel();
  private final int BALKEN_BREITE = 5;
  private final int BALKEN_HOEHE = 40;
  private final int BALL_DURCHMESSER = 10;
  private boolean[] taste = new boolean[256];
  private Point[] balken = new Point[2];
  private int[] lebenSpieler = new int[2];
  private String[] nameSpieler = new String[2];
  private Point ball;
  private Graphics spielfeld;
  private int xBewegung, yBewegung;
  private JPanel jpaNorth = new JPanel();
  private JLabel jlbLinks = new JLabel();
  private JLabel jlbMitte = new JLabel();
  private JLabel jlbRechts = new JLabel();
  private boolean spiel = false, pause;
  private int ballKontakteInFolge, geschwindigkeit;
  // Ende Variablen

  public void init() {
    System.out.println("Init");
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());

    // Anfang Komponenten
    cp.add(jpaCenter, BorderLayout.CENTER);
    cp.add(jpaNorth, BorderLayout.NORTH);
    jpaNorth.add(jlbLinks, BorderLayout.NORTH);
    jlbMitte.setHorizontalAlignment(SwingConstants.CENTER);
    jpaNorth.add(jlbMitte, BorderLayout.NORTH);
    jlbRechts.setText("Bitte clicken sie zum starten hier !   ");
    jlbRechts.setHorizontalAlignment(SwingConstants.RIGHT);
    jpaNorth.add(jlbRechts, BorderLayout.NORTH);
    // Ende Komponenten
    
    addKeyListener(this);
    addMouseListener(new MouseAdapter(){
      public void mouseClicked(MouseEvent e){
        if(jlbRechts.getText().equals("Bitte clicken sie zum starten hier !   "))
          go();
      }
    });
  }
  private void go(){
    System.out.println("Go");
    // setzen der startpositionen der Balken und des balls
    int balkenYPosition = jpaCenter.getHeight() / 2;
    balkenYPosition = balkenYPosition - (BALKEN_HOEHE / 2);
    balken[0] = new Point(1, balkenYPosition);
    balken[1] = new Point((jpaCenter.getWidth() - BALKEN_BREITE - 2), balkenYPosition);
    ball = new Point(100, 100);

    for(int i = 0; i < balken.length; i++){  // Setzen Spielernamen und
      lebenSpieler[i] = 15;                  // deren leben
      nameSpieler[i] = "Spieler" + i;
    }
    showLabel();
    
    spielfeld = jpaCenter.getGraphics();  // definieren des Spielfeld
    paint(); // malen des Spielfeldes
    
    ballKontakteInFolge = 0;
    geschwindigkeit = 5;
    xBewegung = yBewegung = 1;
    pause = false;
    if(!spiel){ // wenn kein Spiel läuft
      spiel = true;
      new Thread(this).start(); // starten des balls
    }
  }
  // Anfang Ereignisprozeduren
  public void keyTyped(KeyEvent e){
    if(e.getKeyChar() == 'n'){
      go();
    }else if(e.getKeyChar() == 'p'){
      if(pause){
        pause = false;
        paint();
      }
      else pause = true;

    }else if(e.getKeyChar() == 'i'){
      pause = true;
      showInfo();
    }
  }
  public void keyPressed(KeyEvent e){
    if(taste[e.getKeyCode()]) return; //wenn das drücken der taste bereits registriert ist dann breche ab
    taste[e.getKeyCode()] = true;
    if(e.getKeyChar() == 'w'){
      moveBalken(e.getKeyCode(), 0, true);
    }else if(e.getKeyChar() == 's'){
      moveBalken(e.getKeyCode(), 0, false);
    }else if(e.getKeyCode() == 38){
      moveBalken(e.getKeyCode(), 1, true);
    }else if(e.getKeyCode() == 40){
      moveBalken(e.getKeyCode(), 1, false);
    }
  }
  public void keyReleased(KeyEvent e){
    taste[e.getKeyCode()] = false;
  }
  public void run(){
    // Bewegen des balls
    System.out.println("Run");
    while(spiel){
      if(ball.y == 1 || (ball.y + BALL_DURCHMESSER) == (jpaCenter.getHeight() - 2)) // Treffen auf oberen oder unteren Rand
        yBewegung *= -1;
      clearBall();
      if(ball.x == 1){
        lebenSpieler[0]--;
        ballKontakteInFolge = 0;
        showLabel();
        if(lebenSpieler[0] == 0){
          showInfo("Herzlichen Glückwunsch " + nameSpieler[1] + " Sie haben gewonnen!!!\n" + nameSpieler[0] + " hatte keien chance und hat verloren! LOSER!!!\n");
          spiel = false;
          return;
        }else{
           int x = (jpaCenter.getWidth() / 2) - (BALL_DURCHMESSER / 2);
           int y = (jpaCenter.getHeight() / 2) - (BALL_DURCHMESSER / 2);
           ball.move(x, y);
        }
      }else if(ball.x == (jpaCenter.getWidth() - 2 - BALL_DURCHMESSER)){
        lebenSpieler[1]--;
        ballKontakteInFolge = 0;
        showLabel();
        if(lebenSpieler[1] == 0){
          showInfo("Herzlichen Glückwunsch " + nameSpieler[0] + " Sie haben gewonnen!!!\n" + nameSpieler[1] + " hatte keien chance und hat verloren! LOSER!!!\n");
          spiel = false;
          return;
        }else{
          int x = (jpaCenter.getWidth() / 2) - (BALL_DURCHMESSER / 2);
          int y = (jpaCenter.getHeight() / 2) - (BALL_DURCHMESSER / 2);
          ball.move(x, y);
        }
      }else if((ball.x == (balken[0].x + BALKEN_BREITE)) && ((ball.y + BALL_DURCHMESSER) >= balken[0].y)&& (ball.y <= (balken[0].y + BALKEN_HOEHE))){
        xBewegung *= -1;    // balken 0
        ballKontakteInFolge++;
        drawBalken(0);
      }else if(((ball.x + BALL_DURCHMESSER) == balken[1].x) && ((ball.y + BALL_DURCHMESSER) >= balken[1].y)&& (ball.y <= (balken[1].y + BALKEN_HOEHE))) {
        xBewegung *= -1;  // balken 1
        ballKontakteInFolge++;
        drawBalken(1);
      }
      ball.x += xBewegung;
      ball.y += yBewegung;
      drawBall();
      if(ballKontakteInFolge == 10 && geschwindigkeit > 1){
        ballKontakteInFolge = 0;
        geschwindigkeit--;
      }
      delay(geschwindigkeit);
      while(pause);
    }
  }
  // Ende Ereignisprozeduren
  private void showLabel(){
    jlbLinks.setText(" " + nameSpieler[0] + ": " + lebenSpieler[0]);
    jlbMitte.setText(" Neues Spiel [n]  Pause [p]  Info [i] ");
    jlbRechts.setText(" " + nameSpieler[1] + ": " + lebenSpieler[1]);
  }
  private void showInfo(){
    showInfo("");
  }
  private void showInfo(final String text){
    new Frame("Info"){
      private Button buOK = new Button();
      private TextArea taAusgabe = new TextArea();
      private Panel paSouth = new Panel();
      {
        setSize(400, 400);
        setLocation(10, 10);
        setLayout(new BorderLayout());
        addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent evt) {setVisible(false); setFocus();}
        });
        add("Center", taAusgabe);
        add("South", paSouth);
        buOK.setLabel("    OK    ");
        buOK.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
            setVisible(false);
            setFocus();
          }
        });
        paSouth.add(buOK);
        setVisible(true);
        taAusgabe.append(text);
        taAusgabe.append("\nBEDIENUG\nTasten " + nameSpieler[0] + ": Hoch(w) Runter(s)\n");
        taAusgabe.append("Tasten " + nameSpieler[1] + ": Hoch(Pfeiltaste hoch) Runter(Pfeiltaste runter)\n");
        taAusgabe.append("Letze Ballgeschwindigkeit (1 = MAX): " + geschwindigkeit);
        
        taAusgabe.append("Version 1.0  vom 02.01.2006\n");
        taAusgabe.append("\nACHTUNG\nNach beenden des Fensters bitte [p] zum weiterspielen\nb.z.w. [n] für ein neues Spiel drücken!!!\n");
      }
    };
  }
  private void paint(){
    System.out.println("Paint");
    spielfeld.clearRect(0, 0, jpaCenter.getWidth(), jpaCenter.getHeight()); // Löschen alter objecte auf den Spielfeld
    spielfeld.drawRect(0, 0, (jpaCenter.getWidth() - 1), (jpaCenter.getHeight() - 1)); // Malen eines randes
    for(int i = 0; i < balken.length; i++){  // Setzen der Balken und bälle
      drawBalken(i);
    }
    drawBall();
  }
  private void setFocus(){
    this.requestFocus();
    this.repaint();
  }
  private void drawBalken(int i){
    spielfeld.drawRect(balken[i].x, balken[i].y, BALKEN_BREITE, BALKEN_HOEHE);
  }
  private void drawBall(){
    spielfeld.drawOval(ball.x, ball.y, BALL_DURCHMESSER, BALL_DURCHMESSER);
  }
  private void clearBalken(int i){
    spielfeld.clearRect(balken[i].x, balken[i].y, (BALKEN_BREITE + 1), (BALKEN_HOEHE + 1));
  }
  private void clearBall(){
    spielfeld.clearRect(ball.x, ball.y, (BALL_DURCHMESSER + 1), (BALL_DURCHMESSER + 1));
  }
  private static void delay(long millis){
    try{Thread.sleep(millis);}catch(InterruptedException e){ }
  }
  private void moveBalken(final int zeichen, final int balkenNummer, final boolean hoch){ // Parameter: gedrucktes zeichen
    new Thread(){         // auf dessen loslassen gewartet wird / zu bewegener Button / richtung in die er zu bewegen ist
      public void run(){
         while(taste[zeichen]){
           while(pause); // Solange das spiel pausiert ist aktion herauszögern
           if((balken[balkenNummer].y + BALKEN_HOEHE)  == (jpaCenter.getHeight() - 2) && !hoch)
             break; // wenn der unter Rand erreicht ist
           if(balken[balkenNummer].y == 1 && hoch)
             break;
           clearBalken(balkenNummer);
           if(hoch) balken[balkenNummer].y --;
           else balken[balkenNummer].y ++;
           drawBalken(balkenNummer);
           delay(2); // bewegungsgeschwindigkeit
         }
      }
    }.start();
  }
}
 
T

Tomate_Salat

Gast
Habe noch nie mit Applets gearbeitet, da klinke ich mich jetzt mal weitestgehends aus.

Ach ja: hast du den Code jetz tumgeschrieben oder ist das dein bisheriger, den das was du hier verwendest sind Swing-Komponenten (JApplet, JPanel, JLabel...)
 
J

Javageschädigt

Gast
Das ist ein neu geschriebener (das hat seehr langee gedauert *erschöpft*) Ausgabetext :)

Das Problem jetzt ist das der Hintergrund in den Vordergrund geht ... :'(
 

Ein Keks

Bekanntes Mitglied
beim zeichnen mit swing gibts eine ganz wichtige regel:
niemals getGraphics() auf eine JComponent anwenden!
statt dessen das Graphics-Objekt benutzen was in der paintComponent(Graphics g) übergeben wird ( und zum neuzeichnen repaint())

habs ma grad auf die schnelle versucht umzubauen (keine garantie auf fehlerfreiheit^^):
Java:
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Container;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.Point;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
 
public class Pong extends JApplet implements KeyListener, Runnable{
  // Anfang Variablen
  private JPanel jpaCenter = new RenderPanel();
  private final int BALKEN_BREITE = 5;
  private final int BALKEN_HOEHE = 40;
  private final int BALL_DURCHMESSER = 10;
  private boolean[] taste = new boolean[256];
  private Point[] balken = new Point[2];
  private int[] lebenSpieler = new int[2];
  private String[] nameSpieler = new String[2];
  private Point ball;
  private int xBewegung, yBewegung;
  private JPanel jpaNorth = new JPanel();
  private JLabel jlbLinks = new JLabel();
  private JLabel jlbMitte = new JLabel();
  private JLabel jlbRechts = new JLabel();
  private boolean spiel = false, pause;
  private int ballKontakteInFolge, geschwindigkeit;
  // Ende Variablen
 
  public void init() {
    System.out.println("Init");
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());
 
    // Anfang Komponenten
    cp.add(jpaCenter, BorderLayout.CENTER);
    cp.add(jpaNorth, BorderLayout.NORTH);
    jpaNorth.add(jlbLinks, BorderLayout.NORTH);
    jlbMitte.setHorizontalAlignment(SwingConstants.CENTER);
    jpaNorth.add(jlbMitte, BorderLayout.NORTH);
    jlbRechts.setText("Bitte clicken sie zum starten hier !   ");
    jlbRechts.setHorizontalAlignment(SwingConstants.RIGHT);
    jpaNorth.add(jlbRechts, BorderLayout.NORTH);
    // Ende Komponenten
    
    addKeyListener(this);
    addMouseListener(new MouseAdapter(){
      public void mouseClicked(MouseEvent e){
        if(jlbRechts.getText().equals("Bitte clicken sie zum starten hier !   "))
          go();
      }
    });
  }
  private void go(){
    System.out.println("Go");
    // setzen der startpositionen der Balken und des balls
    int balkenYPosition = jpaCenter.getHeight() / 2;
    balkenYPosition = balkenYPosition - (BALKEN_HOEHE / 2);
    balken[0] = new Point(1, balkenYPosition);
    balken[1] = new Point((jpaCenter.getWidth() - BALKEN_BREITE - 2), balkenYPosition);
    ball = new Point(100, 100);
 
    for(int i = 0; i < balken.length; i++){  // Setzen Spielernamen und
      lebenSpieler[i] = 15;                  // deren leben
      nameSpieler[i] = "Spieler" + i;
    }
    showLabel();
    
    repaint(); // malen des Spielfeldes
    
    ballKontakteInFolge = 0;
    geschwindigkeit = 5;
    xBewegung = yBewegung = 1;
    pause = false;
    if(!spiel){ // wenn kein Spiel läuft
      spiel = true;
      new Thread(this).start(); // starten des balls
    }
  }
  // Anfang Ereignisprozeduren
  public void keyTyped(KeyEvent e){
    if(e.getKeyChar() == 'n'){
      go();
    }else if(e.getKeyChar() == 'p'){
      if(pause){
        pause = false;
        repaint();
      }
      else pause = true;
 
    }else if(e.getKeyChar() == 'i'){
      pause = true;
      showInfo();
    }
  }
  public void keyPressed(KeyEvent e){
    if(taste[e.getKeyCode()]) return; //wenn das drücken der taste bereits registriert ist dann breche ab
    taste[e.getKeyCode()] = true;
    if(e.getKeyChar() == 'w'){
      moveBalken(e.getKeyCode(), 0, true);
    }else if(e.getKeyChar() == 's'){
      moveBalken(e.getKeyCode(), 0, false);
    }else if(e.getKeyCode() == 38){
      moveBalken(e.getKeyCode(), 1, true);
    }else if(e.getKeyCode() == 40){
      moveBalken(e.getKeyCode(), 1, false);
    }
  }
  public void keyReleased(KeyEvent e){
    taste[e.getKeyCode()] = false;
  }
  public void run(){
    // Bewegen des balls
    System.out.println("Run");
    while(spiel){
      if(ball.y == 1 || (ball.y + BALL_DURCHMESSER) == (jpaCenter.getHeight() - 2)) // Treffen auf oberen oder unteren Rand
        yBewegung *= -1;
      repaint();
      if(ball.x == 1){
        lebenSpieler[0]--;
        ballKontakteInFolge = 0;
        showLabel();
        if(lebenSpieler[0] == 0){
          showInfo("Herzlichen Glückwunsch " + nameSpieler[1] + " Sie haben gewonnen!!!\n" + nameSpieler[0] + " hatte keien chance und hat verloren! LOSER!!!\n");
          spiel = false;
          return;
        }else{
           int x = (jpaCenter.getWidth() / 2) - (BALL_DURCHMESSER / 2);
           int y = (jpaCenter.getHeight() / 2) - (BALL_DURCHMESSER / 2);
           ball.move(x, y);
        }
      }else if(ball.x == (jpaCenter.getWidth() - 2 - BALL_DURCHMESSER)){
        lebenSpieler[1]--;
        ballKontakteInFolge = 0;
        showLabel();
        if(lebenSpieler[1] == 0){
          showInfo("Herzlichen Glückwunsch " + nameSpieler[0] + " Sie haben gewonnen!!!\n" + nameSpieler[1] + " hatte keien chance und hat verloren! LOSER!!!\n");
          spiel = false;
          return;
        }else{
          int x = (jpaCenter.getWidth() / 2) - (BALL_DURCHMESSER / 2);
          int y = (jpaCenter.getHeight() / 2) - (BALL_DURCHMESSER / 2);
          ball.move(x, y);
        }
      }else if((ball.x == (balken[0].x + BALKEN_BREITE)) && ((ball.y + BALL_DURCHMESSER) >= balken[0].y)&& (ball.y <= (balken[0].y + BALKEN_HOEHE))){
        xBewegung *= -1;    // balken 0
        ballKontakteInFolge++;
        repaint();
      }else if(((ball.x + BALL_DURCHMESSER) == balken[1].x) && ((ball.y + BALL_DURCHMESSER) >= balken[1].y)&& (ball.y <= (balken[1].y + BALKEN_HOEHE))) {
        xBewegung *= -1;  // balken 1
        ballKontakteInFolge++;
        repaint();
      }
      ball.x += xBewegung;
      ball.y += yBewegung;
      repaint();
      if(ballKontakteInFolge == 10 && geschwindigkeit > 1){
        ballKontakteInFolge = 0;
        geschwindigkeit--;
      }
      delay(geschwindigkeit);
      while(pause);
    }
  }
  // Ende Ereignisprozeduren
  private void showLabel(){
    jlbLinks.setText(" " + nameSpieler[0] + ": " + lebenSpieler[0]);
    jlbMitte.setText(" Neues Spiel [n]  Pause [p]  Info [i] ");
    jlbRechts.setText(" " + nameSpieler[1] + ": " + lebenSpieler[1]);
  }
  private void showInfo(){
    showInfo("");
  }
  private void showInfo(final String text){
    new Frame("Info"){
      private Button buOK = new Button();
      private TextArea taAusgabe = new TextArea();
      private Panel paSouth = new Panel();
      {
        setSize(400, 400);
        setLocation(10, 10);
        setLayout(new BorderLayout());
        addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent evt) {setVisible(false); setFocus();}
        });
        add("Center", taAusgabe);
        add("South", paSouth);
        buOK.setLabel("    OK    ");
        buOK.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
            setVisible(false);
            setFocus();
          }
        });
        paSouth.add(buOK);
        setVisible(true);
        taAusgabe.append(text);
        taAusgabe.append("\nBEDIENUG\nTasten " + nameSpieler[0] + ": Hoch(w) Runter(s)\n");
        taAusgabe.append("Tasten " + nameSpieler[1] + ": Hoch(Pfeiltaste hoch) Runter(Pfeiltaste runter)\n");
        taAusgabe.append("Letze Ballgeschwindigkeit (1 = MAX): " + geschwindigkeit);
        
        taAusgabe.append("Version 1.0  vom 02.01.2006\n");
        taAusgabe.append("\nACHTUNG\nNach beenden des Fensters bitte [p] zum weiterspielen\nb.z.w. [n] für ein neues Spiel drücken!!!\n");
      }
    };
  }
  private void render(Graphics g){
    System.out.println("Paint");
    g.clearRect(0, 0, jpaCenter.getWidth(), jpaCenter.getHeight()); // Löschen alter objecte auf den Spielfeld
    g.drawRect(0, 0, (jpaCenter.getWidth() - 1), (jpaCenter.getHeight() - 1)); // Malen eines randes
    for(int i = 0; i < balken.length; i++){  // Setzen der Balken und bälle
      drawBalken(g, i);
    }
    drawBall(g);
  }
  private void setFocus(){
    this.requestFocus();
    this.repaint();
  }
  private void drawBalken(Graphics g, int i){
    g.drawRect(balken[i].x, balken[i].y, BALKEN_BREITE, BALKEN_HOEHE);
  }
  private void drawBall(Graphics g){
    g.drawOval(ball.x, ball.y, BALL_DURCHMESSER, BALL_DURCHMESSER);
  }
  private static void delay(long millis){
    try{Thread.sleep(millis);}catch(InterruptedException e){ }
  }
  private void moveBalken(final int zeichen, final int balkenNummer, final boolean hoch){ // Parameter: gedrucktes zeichen
    new Thread(){         // auf dessen loslassen gewartet wird / zu bewegener Button / richtung in die er zu bewegen ist
      public void run(){
         while(taste[zeichen]){
           while(pause); // Solange das spiel pausiert ist aktion herauszögern
           if((balken[balkenNummer].y + BALKEN_HOEHE)  == (jpaCenter.getHeight() - 2) && !hoch)
             break; // wenn der unter Rand erreicht ist
           if(balken[balkenNummer].y == 1 && hoch)
             break;
           repaint();
           if(hoch) balken[balkenNummer].y --;
           else balken[balkenNummer].y ++;
           repaint();
           delay(2); // bewegungsgeschwindigkeit
         }
      }
    }.start();
  }
  
  class RenderPanel extends JPanel{
	  @Override
	  protected void paintComponent(Graphics g){
		  if(spiel)
			  render(g);
	  }
  }
}
 
Zuletzt bearbeitet:
J

Javageschädigt

Gast
So erstmal ein großes Dankeschön an alle die mir hier weitergeholfen haben ... funktioniert alles einwandfrei ... *daumen hoch*

Danke.Danke. Danke

javageschädigt
 

Ähnliche Java Themen


Oben