How to : Update?

Status
Nicht offen für weitere Antworten.

Developer_X

Top Contributor
Hi, ich bin grad am programmieren eines Ping Pong spiels, ich weiß aber leider nicht wie ich das mit dem update hinbekommen soll, ich las im internet mehrere artikel, versuchte das ganze einzubauen, hat nie geklappt, kann mir einer von euch helfen?
Java:
package Pong;

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

@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	//Ping Pong Attribute
		  int player_points = 0;
		  int ki_points     = 0;
		  
		  int player_height = d.height/2;
		  int ball_height   = d.height/2;
		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
	}

	public void paint(final Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,d.width,d.height);
		
		g.setColor(Color.green);
		g.setFont(new Font("Times New Roman",3,40));
		g.drawString("Player : "+player_points,d.width/5,d.height-20);
		g.drawString("KI     : "+ki_points,    d.width/2,d.height-20);

		g.fillRect(d.width/5,player_height,20,d.height/5);
		
		g.fillRect(d.width-d.width/5,ball_height,20,d.height/5);
	}

	public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);
	}

	
	public void run() 
	{		
		repaint();
	}
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			player_height++;
		}
		if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			player_height--;
		}
	}
	public void keyReleased(KeyEvent arg0) 
	{		
	}
	public void keyTyped(KeyEvent arg0)
	{		
	}
}
Danke für jede Antwort
Developer_X
 

Landei

Top Contributor
Versuch mal am Ende von keyPressed()
Code:
invalidate();
repaint();
 

Painii

Bekanntes Mitglied
Falls das ganze mal als Thread läuft kannst du ja auch run() benutzen:

Java:
public void run(){
 while(spielt){
  invalidate();
  repaint();
 }
}
Wenn du nur im KeyListener repaint() machst dann verändert sich ja nix wenn man keine Taste drückt.
 

diggaa1984

Top Contributor
DevX warum fixt du nicht erstma dein 4Gewinnt .. den Bug den ich gemeldet hab und den sparrow bestätigen konnte ist ein Fehler in der Spiellogik und hat nix mit der KI zu tun, daher ist das Programm ja noch unfertig.

ich kanns nur nochmal sagen: Konzentrier dich auf einige wenige aktuelle Programme, und nicht 10 auf einmal!! Erst richtig zu Ende bringen dann was neues anfangen :)
 

Developer_X

Top Contributor
DevX warum fixt du nicht erstma dein 4Gewinnt .. den Bug den ich gemeldet hab und den sparrow bestätigen konnte ist ein Fehler in der Spiellogik und hat nix mit der KI zu tun, daher ist das Programm ja noch unfertig.

ich kanns nur nochmal sagen: Konzentrier dich auf einige wenige aktuelle Programme, und nicht 10 auf einmal!! Erst richtig zu Ende bringen dann was neues anfangen :)

also, ich hab das jetzt gelöst, den BUg, hab ich wohl vergessen zu sagen, der erkennt jetzt wirklich rechtzeitig, wenn jemand gewonnen hat.
Wirklich, schaus dir mal an, ich hoffe du hast den link noch
 

Developer_X

Top Contributor
ich habe noch ein problem in der methode "run()" warum passiert nichts?
Java:
package Pong;

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

@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	//Ping Pong Attribute
		  int player_points = 0;
		  int player_height = d.height/3;

		  int ki_points     = 0;
		  
		  int ball_radius   = 20;	  
		  int ball_x        = d.height/3;
		  int ball_y        = d.height/3;
	  
		  int max_y  = 50;
		  int max_x  = 50;

		  int move = 5;
		  int count_move = 0;
		  
		  boolean left = false;
		  boolean righ = true;
		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
	}

	public void paint(final Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,d.width,d.height);
		
		//Draw Information
		g.setColor(Color.green);
		g.setFont(new Font("Times New Roman",3,40));
		g.drawString("Player : "+player_points,d.width/5,d.height-d.height/45);
		g.drawString("KI     : "+ki_points,    d.width/2,d.height-d.height/45);

		//Draw Arena
		g.drawRect(d.width/5-d.width/36,(int) (d.height/22.5),d.width/3+d.width/3,d.height/3+d.height/3+max_y+d.height/18);
		
		//Draw Enemys
		g.fillRect(d.width/5,player_height,d.width/72,d.height/5);
		g.fillRect(d.width-d.width/5,ball_y,d.width/72,d.height/5);
		
		//Draw Ball
		g.setColor(Color.white);
		g.fillOval(ball_x,ball_y,ball_radius,ball_radius);
	}

	public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);
	}

	
	public void run() 
	{	
		if(left)
		{
			ball_x++;
			if(ball_x>=d.width-d.width/5)
			{
				righ = true;
				left = false;
			}
		}
		else
		{
			ball_x--;
			if(ball_x<=d.width/5)
			{
				left = true;
				righ = false;
			}
		}
		try
		{
			Thread.sleep(500);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		invalidate();
		repaint();	
	}
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			if(count_move>=-max_y)
			{
				player_height=player_height-move;
				count_move--;
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			if(count_move<=max_y)
			{
				player_height=player_height+move;
				count_move++;
			}
		}
		invalidate();
		repaint();
	}
	public void keyReleased(KeyEvent arg0) 
	{		
	}
	public void keyTyped(KeyEvent arg0)
	{		
	}
}
 

Developer_X

Top Contributor
ich habe hier mal was aus meinen alten Zeiten:
Java:
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		  Thread thread;

		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
		
	thread = new Thread (this);
		thread.start();
	}
So klappts aber leider auch nicht.
 

Developer_X

Top Contributor
10.2.2 Thread mit Runnable starten
Nun reicht es nicht aus, einfach die run()-Methode einer Klasse direkt aufzurufen. Würden wir dies tun, dann wäre nichts nebenläufig, sondern wir würden einfach eine Methode sequenziell ausführen. Damit der Programmcode parallel zur Applikation läuft, müssen wir ein Thread-Objekt mit dem Runnable verbinden und dann den Thread explizit starten. Dazu übergeben wir dem Konstruktor der Klasse Thread eine Referenz auf das Runnable-Objekt und rufen start() auf. Nachdem start() für den Thread eine Ablaufumgebung geschaffen hat, ruft es intern selbstständig die Methode run() genau einmal auf. Läuft der Thread schon, so löst ein zweiter Aufruf der start()-Methode eine IllegalThreadStateException aus.

Listing 10.3 com/tutego/insel/thread/FirstThread.java, main()

Thread t1 = new Thread( new DateCommand() ); t1.start(); Thread t2 = new Thread( new CounterCommand() ); t2.start();

Ich hab das mal so umgeändert, aber nichts passiert, warum?
Java:
	public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);

		Thread t = new Thread(p); 
		t.start();
	}
 

sparrow

Top Contributor
Ich werde mal so frei sein und die Antwort nicht einfach sagen.

Wir machen stattdessen mal Fehleranalyse: Was genau geht denn nicht? Woran hängt es?
Wie wäre es mal mit einer Ausgabe um zu schauen ob dein Programm eine bestimmte Stelle im Code überhaupt erreicht? Wie willst du sonst jemals auf Fehlersuche gehen und Fehler selbst finden?
 

Developer_X

Top Contributor
das Problem ist, dass alles funktioniert, nur nicht in der main ab den worten:
Thread t = new Thread(p);
t.start();

Problem:
Thread wird nciht gestartet#
 

sparrow

Top Contributor
das Problem ist, dass alles funktioniert, nur nicht in der main ab den worten:
Thread t = new Thread(p);
t.start();

Problem:
Thread wird nciht gestartet#

Bist du dir da sicher oder glaubst du das nur?
Bist du dir ganz sicher, dass der Code deines Threads nicht ausgeführt wird?
Woran machst du das fest? Vielleicht aktualisiert sich nur die Bildschirmausgabe nicht? Oder deine Bedingungen sind versehentlich so gesetzt, dass nicht neu gezeichnet wird?
 

sparrow

Top Contributor
oh, danke, das wars, danke euch allen!

Ich wollte darauf hinaus, dass du nicht einmal geprüft hast ob dir run-Methode überhaupt ausgeführt wird.
Wurde sie nämlich: genau 1 Mal.

Ein einfaches System.out.println("run Methode startet") am Beginn der Methode hätte dir das gezeigt.
An markanten Stellen im Programm einfach eine Nachricht auszugeben hilft beim Debuggen unheimlich.
 

Developer_X

Top Contributor
Ich wollte darauf hinaus, dass du nicht einmal geprüft hast ob dir run-Methode überhaupt ausgeführt wird.
Wurde sie nämlich: genau 1 Mal.

Ein einfaches System.out.println("run Methode startet") am Beginn der Methode hätte dir das gezeigt.
An markanten Stellen im Programm einfach eine Nachricht auszugeben hilft beim Debuggen unheimlich.

du hast recht,

@ALL: willst du uns nicht mal die Code umsetztung zeigen?

Naja, ist noch nicht ganz perfekt:
Was es schon kann:
  • es kann von den wänden abprallen

ProbleM:
Er erkennt noch nciht so richtig, wann einer gewonnen hat,
die methode lost, habe ich mal rausgenommen, aber später baue ich sie wo ein.
Bisjetzt solltet ihr einen KI sehen der mit sich selbstspielt, auch wenn ihr gar ncihts.

Was ich aber gut finde, und deshalb auch tat, damit ihr, wenn ihr mein Spiel änder wollt, gar keine Arbeit habt, hatte ich mir gedacht, alles, alle variablen gebe ich oben als Attribute an, dort könnt ihr alles einstellen.

So jetzt genug, hier der Code, nicht vergessen, noch nicht fertig:
Java:
package Pong;

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

@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	//Ping Pong Attribute
		  int player_points = 0;
		  int player_height = d.height/3;

		  int ki_points     = 0;
		  
		  int ball_radius   = 20;	  
		  int ball_x        = d.height/2;
		  int ball_y        = d.height/2;
	  
		  int max_y  = 25;
		  int max_x  = 50;

		  int move = 10;
		  int count_move = 0;
		  
		  boolean left = false;
		  boolean righ = true;
		  boolean up = false;
		  boolean down = true;
		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
	}

	public void paint(final Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,d.width,d.height);
		
		//Draw Information
		g.setColor(Color.green);
		g.setFont(new Font("Times New Roman",3,40));
		g.drawString("Player : "+player_points,d.width/5,d.height-d.height/45);
		g.drawString("KI     : "+ki_points,    d.width/2,d.height-d.height/45);

		//Draw Arena
		g.drawRect(d.width/5-d.width/36,(int) (d.height/22.5),d.width/3+d.width/3,d.height/3+d.height/3+max_y+d.height/18);
		
		//Draw Enemys
		g.fillRect(d.width/5,player_height,d.width/72,d.height/5);
		g.fillRect(d.width-d.width/5,ball_y-50,d.width/72,d.height/5);
		
		//Draw Ball
		g.setColor(Color.white);
		g.fillOval(ball_x,ball_y,ball_radius,ball_radius);
	}

	public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);

		Thread t = new Thread(p); 
		t.start();
	}

	@Override
	public void run() 
	{	
		try 
		{
			Thread.sleep(2000);
		}
		catch (InterruptedException e1) 
		{
			e1.printStackTrace();
		}
		while(true)
		{		
		if(left)
		{
			ball_x=ball_x+(move/2);
			if((ball_x>=d.width-d.width/5-20))
			{				
				righ = true;
				left = false;
			}
		}
		if(righ)
		{
			ball_x=ball_x-(move/2);
			if(ball_x<=d.width/5+20)
			{				
				left = true;
				righ = false;		
			}
		}
		
		if(up)
		{
			ball_y=ball_y-(move/2);
			if(ball_y<=(int) (d.height/22.5))
			{
				up = false;
				down = true;
			}
		}
		if(down)
		{
			ball_y=ball_y+(move/2);
			if(ball_y>=(int) (d.height/22.5)+(d.height/3+d.height/3+max_y+d.height/18))
			{
				down = false;
				up = true;
			}
		}
		try
		{
			Thread.sleep(10);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		invalidate();
		repaint();	
		
		lost();
		}
	}
	
	public void lost()
	{
		ki_points++;
		Toolkit.getDefaultToolkit().beep();
	}
	
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			if(count_move>=-max_y)
			{
				player_height=player_height-move;
				count_move--;
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			if(count_move<=max_y)
			{
				player_height=player_height+move;
				count_move++;
			}
		}
		invalidate();
		repaint();
	}
	public void keyReleased(KeyEvent arg0) 
	{		
	}
	public void keyTyped(KeyEvent arg0)
	{		
	}
}
 

Landei

Top Contributor
Links/rechts und unten/oben repräsentiert man jeweils am besten mit einer Variablen xRichtung bzw. yRichtung, die -1 oder 1 ist.

Dann kann man eine Bewegung ganz einfach ohne Fallunterscheidung mit
neueXPosition = alteXPosition + schrittweite * xRichtung;
berechnen und das Abprallen ist einfach
if (abprallenInXRichtungFestgestellt()) xRichtung = -xRichtung;

Viel bequemer, als mit booleschen Variablem herumzuhantieren.
 

Developer_X

Top Contributor
Links/rechts und unten/oben repräsentiert man jeweils am besten mit einer Variablen xRichtung bzw. yRichtung, die -1 oder 1 ist.

Dann kann man eine Bewegung ganz einfach ohne Fallunterscheidung mit
neueXPosition = alteXPosition + schrittweite * xRichtung;
berechnen und das Abprallen ist einfach
if (abprallenInXRichtungFestgestellt()) xRichtung = -xRichtung;

Viel bequemer, als mit booleschen Variablem herumzuhantieren.

ich finde es nun mal so bequemer, ich melde mich wenn ich weiter gekommen bin.

Developer_X
 

Developer_X

Top Contributor
also so weit ist es schon mal:
Java:
package Pong;

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

@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	//Ping Pong Attribute
		  int player_points = 0;
		  int player_height = d.height/3;
		  int ki_height     = d.height/3;

		  int ki_points     = 0;
		  
		  int ball_radius   = 20;	  
		  int ball_x        = d.height/2;
		  int ball_y        = d.height/2;
	  
		  int max_y  = 25;
		  int max_x  = 50;

		  int move = 20;
		  int count_move = 0;
		  
		  boolean left = false;
		  boolean righ = true;
		  boolean up = false;
		  boolean down = true;
		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
	}

	public void paint(final Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,d.width,d.height);
		
		//Draw Information
		g.setColor(Color.green);
		g.setFont(new Font("Times New Roman",3,40));
		g.drawString("Player : "+player_points,d.width/5,d.height-d.height/45);
		g.drawString("KI     : "+ki_points,    d.width/2,d.height-d.height/45);

		//Draw Arena
		g.drawRect(d.width/5-d.width/36,(int) (d.height/22.5),d.width/3+d.width/3,d.height/3+d.height/3+max_y+d.height/18);
		
		//Draw Enemys
		g.fillRect(d.width/5,player_height,d.width/72,d.height/5);
		g.drawLine(0,player_height,d.width,player_height);
		g.drawLine(0,player_height+d.height/5,d.width,player_height+d.height/5);

		g.fillRect(d.width-d.width/5,ki_height-50,d.width/72,d.height/5);
		g.drawLine(0,ki_height-50,d.width,ki_height-50);
		g.drawLine(0,ki_height-50+d.height/5,d.width,ki_height-50+d.height/5);

		//Draw Ball
		g.setColor(Color.white);
		g.fillOval(ball_x,ball_y,ball_radius,ball_radius);
		
		g.drawLine(ball_x-ball_radius/2,0,ball_x-ball_radius/2,d.height);
		g.drawLine(ball_x+ball_radius,0,ball_x+ball_radius,d.height);
		g.drawLine(0,ball_y-ball_radius/2,d.width,ball_y-ball_radius/2);
		g.drawLine(0,ball_y+ball_radius,d.width,ball_y+ball_radius);
	}

	public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);

		Thread t = new Thread(p); 
		t.start();
	}

	@Override
	public void run() 
	{	
		try 
		{
			Thread.sleep(2000);
		}
		catch (InterruptedException e1) 
		{
			e1.printStackTrace();
		}
		while(true)
		{		
		if(left)
		{
			ball_x=ball_x+(move)/3;
			if((ball_x>=d.width-d.width/5-20))
			{				
				righ = true;
				left = false;
			}
			
			if((ball_x>=d.width-d.width/5-20)&&(ball_y<=player_height-d.width/5||ball_y>=player_height+d.width/5))
			{
				Player_lost();
			}

		}
		if(righ)
		{
			ball_x=ball_x-(move)/3;
			if(ball_x<=d.width/5+20)
			{				
				left = true;
				righ = false;		
			}
			if((ball_x>=d.width-d.width/5-20)&&(ball_y<=ki_height-d.width/5||ball_y>=ki_height+d.width/5))
			{
				KI_lost();
			}
		}
		
		if(up)
		{
			ball_y=ball_y-(move)/3;
			if(ball_y<=(int) (d.height/22.5))
			{
				up = false;
				down = true;
			}
		}
		if(down)
		{
			ball_y=ball_y+(move)/3;
			if(ball_y>=(int) (d.height/22.5)+(d.height/3+d.height/3+max_y+d.height/18))
			{
				down = false;
				up = true;
			}
		}
		try
		{
			Thread.sleep(10);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		invalidate();
		repaint();	
		Move_KI();
		}
	}
	
	public void Player_lost()
	{
		ki_points++;
		Toolkit.getDefaultToolkit().beep();
	}
	public void KI_lost()
	{
		player_points++;
		Toolkit.getDefaultToolkit().beep();
	}
	
	public void Move_KI()
	{
		if(ball_y<=ki_height)
		{
			ki_height = ki_height-move/8;
		}
		else if(ball_y>=ki_height)
		{
			ki_height = ki_height+move/8;
		}
	}
	
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			if(count_move>=-max_y)
			{
				player_height=player_height-move;
				count_move--;
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			if(count_move<=max_y)
			{
				player_height=player_height+move;
				count_move++;
			}
		}
		invalidate();
		repaint();
	}
	public void keyReleased(KeyEvent arg0) 
	{		
	}
	public void keyTyped(KeyEvent arg0)
	{		
	}
}
Wir ihr sicher bemerkt, zieht er euch die Punkte nicht rechtzeitig ab,
außerdem wenn ihr einmal die Punkte abgezogen bekommt, dann ewig,

bitte kann mir einer helfen?
PS:
Ich will keine Lösung nur einen Tipp

ich bin so traurig dass ich nicht mal das hinbekomme, ich habe mir meine größte Mühe gegeben, warum klappt das immer noch nicht?
:(
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben