Hallo zusammen!
Ich möchte über eine Webseite ein Java PingPong spiel steuern, das auf einen anderen Computer ausgeführt wird. Das PingPong spiel wird ursprünglich mit Tasteneingabe gesteuert, ich möchte nun einen der beiden spieler (player 2) nun per Servlet steuern. Die Kommunikation zwischen Webseite (bzw Servlet) und PingPong habe ich schon erfolgreich mit RMI realisiert, darum dachte ich das Thema passt eher hier rein. Aber nun mein Problem: Ich bekomm die richtigen Daten zugeschickt kann aber mit ihnen nicht weiterarbeiten.
PingPong.java --> RMI Server, initalisiert das Spiel
PanelPelota.java
sayHello wird erfolgreich aufgerufen und gibt auch erfolgreich die Daten an setDirection weiter.
Ich möchte den Wert der public variablen player2FlagArr und player2FlagAba ändern, jedoch wird diese Änderung nicht "gespeichert", weil ja eigentlich durch die run Methode nachgesehen wird welche wert diese Variablen haben.
Ich glaube es liegt an irgend einen (warschenlich sehr beschämenden) Denkfehler von mir, nur nach ein paar Tagen daran herumbasteln bin ich nicht weiter gekommen. Ich bin gerade ziehmlich ratlos wo der Fehler liegen könnt und wäre für jeden Tip dankbar.
Viele Grüße, Ermelyn
(Das urspüngliche PingPong Spiel hab ich aus dem Inet, dachte da werd ich schneller fertig, mein ziel is die Steuerung das Spiel über eine Webseite, das Spiel selbst is ned so wichtig. Game - A simple Pong ist die Quelle für das Spiel falls es jemanden interessiert)
Ich möchte über eine Webseite ein Java PingPong spiel steuern, das auf einen anderen Computer ausgeführt wird. Das PingPong spiel wird ursprünglich mit Tasteneingabe gesteuert, ich möchte nun einen der beiden spieler (player 2) nun per Servlet steuern. Die Kommunikation zwischen Webseite (bzw Servlet) und PingPong habe ich schon erfolgreich mit RMI realisiert, darum dachte ich das Thema passt eher hier rein. Aber nun mein Problem: Ich bekomm die richtigen Daten zugeschickt kann aber mit ihnen nicht weiterarbeiten.
PingPong.java --> RMI Server, initalisiert das Spiel
Java:
package PingPong;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RMISecurityManager;
//import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PingPong extends JFrame implements Hello {
private static final long serialVersionUID = 1L;
/**
* for the PingPong Game
*/
private JPanel jContentPane = null;
private PanelPelota panel = null; // This is the panel of the game class
private PanelPelota getPanel() {
if (panel == null) {
panel = new PanelPelota(); // The panel is created
}
return panel;
}
public int directionPlayerB=0;
/**
* This is the default constructor
*/
public PingPong() {
super();
initialize();
// Listeners for the keyboard
this.addKeyListener(new KeyAdapter() {
//Method for the key pressed
public void keyPressed(KeyEvent evt) {
formKeyPressed(evt);
}
// Method for the key released
public void keyReleased(KeyEvent evt) {
formKeyReleased(evt);
}
}
);// Ende Keyboard Listener
}
//Here i'm stating the method that will send the key pressed to the game class
private void formKeyPressed(KeyEvent evt){
panel.keyPressed(evt);
}
// Here i'm stating the method that will send the key released to the game class
private void formKeyReleased(KeyEvent evt){ panel.keyReleased(evt);}
//Fenstergroesze usw um andere Positionen zu bestimmen
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
private int windowX= (int) (dim.getWidth());
private int windowY= (int) (dim.getHeight());
/**
* This method initializes the window
*/
private void initialize() {
this.setResizable(false);
this.setSize(windowX/2, windowY/2);
this.setLocation(windowX/4,windowY/4);
this.setContentPane(getJContentPane());
this.setTitle("Ping Pong");
}
/**
* This method initializes jContentPane
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getPanel(), BorderLayout.CENTER);
}
return jContentPane;
}
/**
* Servlet ruft über RMI diese Methode auf und übergibt die daten per Parameter
*
* @param int action - von 0-2
* @return String rueckgabeWert - gibt Text an servlet zurück
*/
public String sayHello(int action) {
String rueckgabeWert=null;
switch (action){
case 0:
rueckgabeWert="no direction";
directionPlayerB=0;
break;
case 1:
rueckgabeWert="up";
directionPlayerB=1;
break;
case 2:
rueckgabeWert="down";
directionPlayerB=2;
break;
default:
rueckgabeWert="keine vorhandene Aktion ausgewählt";
}
System.out.println("say Hello meldet sich.");
panel.setDirection(action);
return rueckgabeWert;
}
public static void main(String args[])throws RemoteException {
/*Servers IP --> fuer RMI*/
System.out.println("IP Adresse vom Server eingeben und Enter drucken.");
String currentIP = "";
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(input);
try {currentIP = reader.readLine();}
catch (IOException e1) {e1.printStackTrace();}
/* Security Manager --> fuer RMI */
if (System.getSecurityManager() == null) {
System.setSecurityManager (new RMISecurityManager());
}
/*RMI*/
try {
PingPong obj = new PingPong();
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
LocateRegistry.createRegistry(1099);
Registry registry = LocateRegistry.getRegistry(currentIP);
registry.rebind("Hello", stub);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
/* PingPong starten */
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
PingPong thisClass = new PingPong();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
}
);
}
}
PanelPelota.java
Java:
package PingPong;
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class PanelPelota extends JPanel implements Runnable {
private static final long serialVersionUID = 1L;
/* (Start-) Positions */
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
private int windowX= (int) (dim.getWidth());
private int windowY= (int) (dim.getHeight());
private int ballPositionX = 10;
private int ballPositionY = 100;
//Ship A (the left one)-> Player A
private int shipAX=10;
private int shipAY=windowY/4;
//Ship B (the right one)-> Player B
private int shipBX=(windowX/2)-30;
private int shipBY=shipAY;
Thread hilo;
int derecha=5; // to the right
int izquierda= -5; //to the left
int arriba=5; // upward
int abajo= -5; // down
int ancho, alto; // Width and height of the ball
// Scores
int contPlay1=0, contPlay2=0;
boolean player1FlagArr,player1FlagAba, player2FlagArr, player2FlagAba;
boolean juego, gameOver;
public PanelPelota(){
juego=true;
hilo=new Thread(this);
hilo.start();
}
// Draw ball and ships
public void paintComponent(Graphics gc){
setOpaque(false);
super.paintComponent(gc);
// Draw ball
gc.setColor(Color.black);
gc.fillOval(ballPositionX, ballPositionY, 8,8);
// Draw ships
gc.fillRect(shipAX, shipAY, 10, 25);
gc.fillRect(shipBX, shipBY, 10, 25);
//Draw scores
gc.drawString("Spieler 1: "+contPlay1, 25, 10);
gc.drawString("Spieler 2: "+contPlay2, 150, 10);
if(gameOver)
gc.drawString("Game Over", 100, 125);
}
// Positions on X and Y for the ball
public void dibujarPelota (int nx, int ny)
{
ballPositionX= nx;
ballPositionY= ny;
this.ancho=this.getWidth();
this.alto=this.getHeight();
repaint();
}
// Here we receive from the game container class the key pressed
public void keyPressed(KeyEvent evt){
switch(evt.getKeyCode()) {
// Move ship 1
case KeyEvent.VK_W :
player1FlagArr = true;
break;
case KeyEvent.VK_S :
player1FlagAba = true;
break;
// Move ship 2
case KeyEvent.VK_UP:
player2FlagArr=true;
break;
case KeyEvent.VK_DOWN:
player2FlagAba=true;
break;
}
}
// Here we receive from the game container class the key released
public void keyReleased(KeyEvent evt) {
switch(evt.getKeyCode()){
// Mover Nave1
case KeyEvent.VK_W :
player1FlagArr = false;
break;
case KeyEvent.VK_S :
player1FlagAba = false;
break;
// Mover nave 2
case KeyEvent.VK_UP:
player2FlagArr=false;
break;
case KeyEvent.VK_DOWN:
player2FlagAba=false;
break;
}
}
public void setDirection(int direct){
//direction=direct;
switch (direct){
case 0: //no direction
player2FlagArr=false;
player2FlagAba = false;
break;
case 1: //up
player2FlagAba = true;
break;
case 2://down
player2FlagArr=true;
break;
}
}
/**
*
* @param debugAusgabe
*/
public void debugSelf(String debugAusgabe){
System.out.println(debugAusgabe);
}
// Move player 1
public void moverPlayer1()
{
if (player1FlagArr == true && shipAY >= 0)
shipAY += abajo;
if (player1FlagAba == true && shipAY <= (this.getHeight()-25))
shipAY += arriba;
dibujarPlayer1(shipAX, shipAY);
}
// Move player 2
public void moverPlayer2(){
if (player2FlagArr == true && shipBY >= 0){
shipBY += abajo;
}
if (player2FlagAba == true && shipBY <= (this.getHeight()-25)){
shipBY += arriba;
}
dibujarPlayer2(shipBX, shipBY);
}
// Position on Y for the player 1
public void dibujarPlayer1(int x, int y){
this.shipAX=x;
this.shipAY=y;
repaint();
}
// Position on Y for the player 2
public void dibujarPlayer2(int x, int y){
this.shipBX=x;
this.shipBY=y;
repaint();
}
public void run() {
boolean izqDer=false;
boolean arrAba=false;
while(true){
if(juego){
// The ball move from left to right
if (izqDer){
// a la derecha
ballPositionX += derecha;
if (ballPositionX >= (ancho - 8))
izqDer= false;
} else {
// a la izquierda
ballPositionX += izquierda;
if ( ballPositionX <= 0)
izqDer = true;
}
// The ball moves from up to down
if (arrAba){
// hacia arriba
ballPositionY += arriba;
if (ballPositionY >= (alto - 8))
arrAba= false;
} else{
// hacia abajo
ballPositionY += abajo;
if ( ballPositionY <= 0)
arrAba = true;
}
dibujarPelota(ballPositionX, ballPositionY);
// Delay
try { Thread.sleep(50);}
catch(InterruptedException ex){ }
// Move player 1
moverPlayer1();
// Move player 2
moverPlayer2();
//debugSelf("megTest ="+Boolean.toString(megTest));
// The score of the player 1 increase
if (ballPositionX >= (ancho - 8))
contPlay1++;
// The score of the player 2 increase
if ( ballPositionX == 0)
contPlay2++;
// Game over. Here you can change 6 to any value
// When the score reach to the value, the game will end
if(contPlay1==6 || contPlay2==6){
juego=false;
gameOver=true;
}
// The ball stroke with the player 1
if(ballPositionX==shipAX+10 && ballPositionY>=shipAY && ballPositionY<=(shipAY+25))
izqDer=true;
// The ball stroke with the player 2
if(ballPositionX==(shipBX-5) && ballPositionY>=shipBY && ballPositionY<=(shipBY+25))
izqDer=false;
}
}
}
}
sayHello wird erfolgreich aufgerufen und gibt auch erfolgreich die Daten an setDirection weiter.
Ich möchte den Wert der public variablen player2FlagArr und player2FlagAba ändern, jedoch wird diese Änderung nicht "gespeichert", weil ja eigentlich durch die run Methode nachgesehen wird welche wert diese Variablen haben.
Ich glaube es liegt an irgend einen (warschenlich sehr beschämenden) Denkfehler von mir, nur nach ein paar Tagen daran herumbasteln bin ich nicht weiter gekommen. Ich bin gerade ziehmlich ratlos wo der Fehler liegen könnt und wäre für jeden Tip dankbar.
Viele Grüße, Ermelyn
(Das urspüngliche PingPong Spiel hab ich aus dem Inet, dachte da werd ich schneller fertig, mein ziel is die Steuerung das Spiel über eine Webseite, das Spiel selbst is ned so wichtig. Game - A simple Pong ist die Quelle für das Spiel falls es jemanden interessiert)