# Java - Bewegung



## Sinan (25. Nov 2007)

Hi Freunde,

ich hab da so ein kleines Problemchen..
Ich muss ein Java Spiel schreiben komme aber mit der Steuerung über die Pfeiltasten nicht klar.
in der methode werden die Codes der gedrückten Tasten ausgewertet und sollen eigentlich an die methode void paintMe(Graphics g){ weiter gegeben werden, damit sich ein Objekt bewegt, funzt aber leider nicht...
Hoffentlich kann mir einer da weiterhelfrn 


Die Datei, in der das JPanel erzeugt wird :


```
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JPanel;
import tkoca001.KeyBoard;

public class ZeigBild extends JPanel{

	//int a=KeyBoard.f;
    int n=ZufallsZahl.zufaelligeZahl(1100);
    
    Image img2;
    
    List<Herz> herzen=new LinkedList<Herz>();
    KeyBoard frogs = new KeyBoard(550,570,0,1);
    
    private void Zeichne() {
    	for (int i=0;i<1;i++){
    		int bb=ZufallsZahl.zufaelligeZahl(1200);
    		int tt=ZufallsZahl.zufaelligeZahl(7);
    		
    	herzen.add(new Herz( bb, 0, 0 ,tt+1));//oben-unten
    	}	
	}
    
    ZeigBild(){
    	 
    img2=		Toolkit.getDefaultToolkit().createImage(
    		    this.getClass()
    	        .getClassLoader().getResource("wiese.jpg")	    );
	
	MediaTracker mt=new MediaTracker(this);
	mt.addImage(img2,0);
	
	Timer t2 = new Timer (4200,new ActionListener()
	{
		public void actionPerformed(ActionEvent e)
		{
	Zeichne();
		}
	
	 });
	t2.start();
	
	try{
		mt.waitForAll();
		}catch (InterruptedException e){
			e.printStackTrace();
		}
	
		Timer t = new Timer (5,new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				for (Herz herz:herzen){
					herz.x=herz.x+herz.dX;
					herz.y=herz.y+herz.dY;
				}
			   repaint();
			}
		 });
		t.start();		
	
    }
    
	@Override 
    public void paintComponent(java.awt.Graphics g){
	super.paintComponent(g);
	
	//zeichne wiese
	g.drawImage(img2,0,0,this);

	//zeichne frosch
	frogs.paintMe(g);

	for (Herz herz:herzen){
		herz.paintMe(g);
	}
  }
	
	
	
    //Fenstergröße
    @Override
    public java.awt.Dimension getPreferredSize(){
	return new java.awt.Dimension(1200,700);
    }
 
   public static void main(String [] args){
	   KeyBoard frame = new KeyBoard("KeyBoard");
       frame.addComponentsToPane();
       frame.add(new ZeigBild());
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.pack();
       frame.setVisible(true);
  }
}
```



Die Datei in der Das Objekt erzeugt wird und die Tastatur ausgelesen wird, wo auch die Bewegung stattfinden sollte :

```
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.*;
import javax.swing.*;



@SuppressWarnings("serial")
public class KeyBoard extends JFrame
        implements KeyListener,
        ActionListener
{
	int m=550;
	int keyCode;
	Image img2;
	public int x, y, b, h, dX, dY;
	
	public KeyBoard(int x, int y,int dX, int dY)
	
	{
		this.x=x;
		this.y=y;
		this.dX=dX;
		this.dY=dY;

		img2=new ImageIcon(this.getClass().getClassLoader().getResource("frog.gif")).getImage();
		this.b=img2.getWidth(this);
		this.h=img2.getHeight(this);
	}

	

	void addComponentsToPane() {
      addKeyListener(this);
    }
    
    public KeyBoard(String name) {
        super(name);
    }
    
    public void keyTyped(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}
   
    public void keyPressed(KeyEvent e) {
    	
        keyCode = e.getKeyCode();
        bewegung(keyCode);
    }
    
    
    public int bewegung(int keycode){
        	
        	int dx=0;
        	if(keyCode == 39 && m<1200){
        		dx=m+5;
        	}else
        	if(keyCode == 39 && m==1200){
        		dx=m;
        	}else
            if(keyCode == 37 && m>0){
            		dx=m-5;
            }
            else{
            	dx=m;
            }
        	this.m =dx;
        	System.out.println(m);
        	return m;
        }

    void paintMe(Graphics g){
    	g.drawImage(img2,m,y,this);
    	System.out.println(m);
    	//repaint();
    }
   
   
    /** Handle the button click. */
    public void actionPerformed(ActionEvent e) {
       requestFocusInWindow();
    }
    
    
}
```


Danke im Voraus..


----------



## SlaterB (26. Nov 2007)

poste ein ordentliches Beispielprogramm ohne untestbare Bestandteile wie 'Herz', MediaTracker usw,
dann ist das in Nullkommanix gefunden

male stattdessen einfache Kreise


----------



## Quaxli (26. Nov 2007)

Mein Spiele-Tutorial


----------



## Guest (26. Nov 2007)

Quaxli,

danke für das Tutorial aber das bringt mich nicht weiter leider..
ich müsste mein Projekt ganz neu aufsetzen und mein prof hat es schon gesehen


----------



## Quaxli (26. Nov 2007)

Das heißt, Dein Prof hat auch keine Ahnung? 

Spaß beiseite. Das ist schon wilder Code, denn Du da zeigst.  ???:L 
Die Zeile 

 dx=m+5; 

ist mir nicht ganz klar. Es soll wohl eine Bewegung sein, auch wenn ich nicht so recht erkenne, wie die verarbeitet wird. 


> public int bewegung(int keycode){
> 
> int dx=0;
> if(keyCode == 39 && m<1200){
> ...



Die Rechtsbewegung fragst Du 2x ab (keyCode == 39). Und du veränderst dort nichts. Du übergibst beim ersten Mal immer dx = m+5; Das ist mit den Einstellungen immer 555 - jedes Mal.
Außerdem sind die KeyCodes statisch ich würde als nicht auf 39 abfragen, sondern 



> keyCode == KeyEvent.VK_RIGHT


----------

