Seltsamer eingeschränkter Darstellungsbereich

Robokopp

Bekanntes Mitglied
Hallo,

ich habe einen Beweglichen und skalierbaren Ball programmiert. jedoch kann ich ihn nur ungefähr bis zur Hälfte des Fensters bewegen, danach verschwindet er hinter einer unsichtbaren Kannte und an dieser Kannte bleiben sichtbare Reste des Balls hängen.

verwendet habe ich die ganz normale paint(Graphics g) Methode.

Kann mir jemand helfen?

Java:
import java.awt.Color;
import java.awt.Dimension;
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.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GamePanel extends JPanel implements Runnable, KeyListener, ActionListener{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * @param args
	 */
	JFrame frame;
	private boolean up;
	private boolean down;
	private boolean left;
	private boolean right;
	private boolean showfps=false;
	private boolean gameStarted;
	private boolean makesmaller;
	private int y=0;
	private int x=0;
	private int xStretch=20;
	private int yStretch=20;
	long delta 	= 0;
	long last 	= 0;
	long fps 	= 0;
	private boolean makebigger;
	private boolean printcoordinates;
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new GamePanel(800,500);
	}
	public  GamePanel(int x, int y){
		frame = new JFrame("Ball");
		frame.setLocation(100, 100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setPreferredSize(new Dimension(x,y));
		frame.addKeyListener(this);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
	
		Thread th = new Thread(this);
		th.start();
	}
	@Override
	public void run() {
		while(frame.isVisible()){
			checkKeys();		
			computeDelta();
			repaint();
			try {
				Thread.sleep(15);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	
	public int getY() {
		return y;
	}
	public int getX() {
		return x;
	}
	private void computeDelta() {

		delta = System.nanoTime() - last;
		last = System.nanoTime();
		fps = ((long) 1e9)/delta;
		
	}
	private void checkKeys() {
		if(up){
			y=y-4;
		}	
		if(down){
			y=y+4;
		}
		if(right){
			x=x+4;	
		}
		if(left){
			x=x-4;
		}
		if(makesmaller){
			xStretch=xStretch-5;
			yStretch=yStretch-5;
		}
		if(makebigger){
			xStretch=xStretch+5;
			yStretch=yStretch+5;
		}
	}
	
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		if(printcoordinates){
		System.out.println("X: "+this.getX()+" Y: "+this.getY());
		}
		g.setColor(Color.red);
		
		if(showfps){
		g.drawString("FPS: " + Long.toString(fps), 20, 10);
		}
		if(gameStarted){
			
		g.drawString("Game Started",70, 10);
		g.setColor(Color.black);
		g.fillOval(x, y, xStretch, yStretch);
		super.repaint();
		}
		
		}
	@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_UP){
			 up = true;
		}
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = true;
		}
		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left = true;
		}
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = true;
		}	
		
		if(e.getKeyCode()==KeyEvent.VK_F){
			if(showfps){
			 showfps = false;
			}
			else{
				showfps=true;
			}
			System.out.println(showfps);
		}
		if(e.getKeyCode()==KeyEvent.VK_ENTER){
			if(gameStarted){
			gameStarted=false;
		
			}
			else{
				gameStarted=true;
				
				
			}
		}
		if(e.getKeyCode()==KeyEvent.VK_MINUS){
			makesmaller=true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_PLUS){
			makebigger=true;
		}
		if(e.getKeyCode()==KeyEvent.VK_C){
			if(printcoordinates){
			printcoordinates=false;}
			else{
				printcoordinates=true;
			}
		}
	}
	@Override
	public void keyReleased(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up = false;
		}
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = false;
		}
		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left = false;
		}
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = false;
		}
		if(e.getKeyCode()==KeyEvent.VK_MINUS){
			makesmaller=false;
		}
		if(e.getKeyCode()==KeyEvent.VK_PLUS){
			makebigger=false;
		}
		
	}
	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
	}
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    18,9 KB · Aufrufe: 38

Marco13

Top Contributor
Wichtig: getX / getY sind Methoden, die es in JPanel (bzw. Component) schon gibt - du hast die überschrieben, das bringt Swing durcheinander!

Ansonsten: Nicht paint überschreiben sondern paintComponent. Nicht in der paint/paintComponent "repaint" aufrufen. Räum' das ganze ein bißchen auf und Teile es in Klassen auf, ein bißchen strukturierter, nicht alles in eine Gott-Klasse klatschen (dann passiert sowas wie das mit dem getX/getY auch nicht so leicht ;) )
 

Robokopp

Bekanntes Mitglied
Wichtig: getX / getY sind Methoden, die es in JPanel (bzw. Component) schon gibt - du hast die überschrieben, das bringt Swing durcheinander!

Ansonsten: Nicht paint überschreiben sondern paintComponent. Nicht in der paint/paintComponent "repaint" aufrufen. Räum' das ganze ein bißchen auf und Teile es in Klassen auf, ein bißchen strukturierter, nicht alles in eine Gott-Klasse klatschen (dann passiert sowas wie das mit dem getX/getY auch nicht so leicht ;) )

Tatsache du Genie :) ich hätte die Variablen statt x und y xPos und yPos nennen sollen wie ich es sonst auch immer mache, dann wäre das nie passiert^^

Ja klar mach ich alles noch wenn ich weiß was ich überhaupt machen will :D

Vielen Dank
 

Marco13

Top Contributor
Bei Ellipse2D (Java Platform SE 6) könnte man "Contains" noch sinnvoll verwenden. (Ob man wirklich erben sollte, sei mal dahingestellt: Wenn man davon ausgeht, dass der Ball rund ist (und ein Spiel neunzig Minu... ) reichen eigentlich Position (als Point2D) und Radius...)
 

Neue Themen


Oben