# Tastenkürzel



## gote (17. Apr 2006)

Hallo,
ich weiß nicht ob das schonmal vorkam, aber in er Suche habe ich nichts gefunden. Ich will ein primitives 2D Spiel machen, was mit einem JWindow den ganzen Bildschirm einnimmt. Man soll mit den Pfeiltasten den x und y wert eines Spieler Objects Steuern können. Aber ich habe keinen Peil wie ich das machen soll, bitte helft mir!!!


----------



## André Uhres (17. Apr 2006)

http://www.java-forum.org/de/viewtopic.php?p=163978#163978


----------



## gote (17. Apr 2006)

jaja, aber ich will ja keine Competente damit belegen. Kannst du mir das vielleicht an einem einfachen Beispiel zeigen - und vor allem in einem JWindow was den ganzen bildschirm ausfüllt.


----------



## Illuvatar (17. Apr 2006)

Ein JWindow, das den ganzen Bildschirm ausfüllt:

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

public class WindowExample extends JWindow
{
   public WindowExample()
   {
     getContentPane().setBackground(Color.BLACK);
     GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
     gd.setFullScreenWindow(this);
   }
   public static void main (String... args)
   {
     new WindowExample();
   }
}
```

Den Rest musst du aber schon alleine machen, jetzt hast du eigentlich für alle Einzelteile ein Beispiel.


----------



## gote (17. Apr 2006)

Also das mit dem Window geht aber das andere nicht. Hier mein Code wie ich versucht hab das zusammenzuschnippeln:



```
import javax.swing.*;

public class Test extends JFrame {
	
	JButton btn;
	
	btn.getInputMap().put(KeyStroke.getKeyStroke("F2"),
    "doSomething");
    btn.getActionMap().put("doSomething",
    anAction);

	
	public static void main(String[] args) {
	}
}
```


Aber der gibt jedemenge Errors aus, mehr nicht.


----------



## André Uhres (18. Apr 2006)

```
//package schnipsel2;
/*
 * ActionTest.java
 */
import java.awt.event.*;
import java.util.*;
import java.util.Arrays;
import javax.swing.*;
import java.awt.*;
public class ActionTest extends JFrame {
    public ActionTest() {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(screenSize);
        setUndecorated(true);
        label1.setPreferredSize(new Dimension(screenSize.width, 25));
        label1.setHorizontalAlignment(JLabel.CENTER);
        mainPanel.add(label1);
        mainPanel.add(label2);
        add(mainPanel);
        setAction("exit", KeyEvent.VK_F2, InputEvent.SHIFT_MASK);
        setAction("right", KeyEvent.VK_RIGHT, 0);
        setAction("left", KeyEvent.VK_LEFT, 0);
        setAction("up", KeyEvent.VK_UP, 0);
        setAction("down", KeyEvent.VK_DOWN, 0);
    }
    private void setAction(final String action, final int key, final int modifier){
        Action a = new AbstractAction(){
            public void actionPerformed(ActionEvent e) {
                doAction(action);
            }
        };
        mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                KeyStroke.getKeyStroke(key, modifier), action);
        mainPanel.getActionMap().put(action, a);
    }
    private void doAction(final String action){
        if(action.equals("exit")){
            System.exit(0);
        }else{
            label2.setText(action);
        }
    }
    private JPanel mainPanel = new JPanel();
    private JLabel label1 = new JLabel("Press arrow keys, Shift+F2 = exit");
    private JLabel label2 = new JLabel();
    public static void main(String[] args) {new ActionTest().setVisible(true);}
}
```


----------



## gote (18. Apr 2006)

Danke, das geht jetzt. Aber im JWindow geht das nicht    Außerdem flackern die Grafiken immer. Vielleicht kann man das hintergrundbild speziell als hintergrun setzen, ich hab das mit drawImage() gemacht. Außerdem kann ich immer nur einen Typ bewegen, kann man das mit Threads lösen? Hier der Code:



```
package SpielPaket;

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


public class HauptClass extends JFrame {
	
	private JPanel mainPanel;
	private Spieler sp1 = new Spieler();
	private Spieler sp2 = new Spieler();
	public Image knabe, knabe2, hintergrund;
	
	public HauptClass() {
		
		mainPanel = new JPanel();
		
		
        setAction("oben",KeyEvent.VK_UP,0);
        setAction("rechts",KeyEvent.VK_RIGHT,0);
        setAction("links",KeyEvent.VK_LEFT,0);
        setAction("unten",KeyEvent.VK_DOWN,0);
        
        setAction("oben2",KeyEvent.VK_W,0);
        setAction("rechts2",KeyEvent.VK_D,0);
        setAction("links2",KeyEvent.VK_A,0);
        setAction("unten2",KeyEvent.VK_S,0);
        
        setAction("exit", KeyEvent.VK_F2, InputEvent.SHIFT_MASK);
        
        
        setLayout(new BorderLayout());
        
        
        add(mainPanel,"Center");
        
        
        getContentPane().setBackground(Color.BLACK); 
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
        gd.setFullScreenWindow(this); 
        
        setVisible(true);
		
	}
	
    private void setAction(final String action, final int key, final int modifier){ 
        Action a = new AbstractAction(){ 
            public void actionPerformed(ActionEvent e) { 
                doAction(action); 
            } 
        }; 
        mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( 
                KeyStroke.getKeyStroke(key, modifier), action); 
        mainPanel.getActionMap().put(action, a); 
    } 
    private void doAction(final String action){ 
    	
    	if(action.equals("oben")) {
    		sp1.y--;
    		System.out.println(sp1.y);
    		repaint();
    	}
    	
    	else if(action.equals("rechts")) {
    		sp1.x++;
    		System.out.println(sp1.x);
    		repaint();
    	}
    	
    	else if(action.equals("links")) {
    		sp1.x--;
    		System.out.println(sp1.x);
    		repaint();
    	}
    	
    	else if(action.equals("unten")) {
    		sp1.y++;
    		System.out.println(sp1.y);
    		repaint();
    	}
    	
    	else if(action.equals("oben2")) {
    		sp2.y--;
    		System.out.println(sp2.y);
    		repaint();
    	}
    	
    	else if(action.equals("rechts2")) {
    		sp2.x++;
    		System.out.println(sp2.x);
    		repaint();
    	}
    	
    	else if(action.equals("links2")) {
    		sp2.x--;
    		System.out.println(sp2.x);
    		repaint();
    	}
    	
    	else if(action.equals("unten2")) {
    		sp2.y++;
    		System.out.println(sp2.y);
    		repaint();
    	}
    	
    	else if(action.equals("exit")) {
    		System.exit(0);
    	}
    	
    	else {
    		System.exit(0);
    	}
    	
    	
    }

	public static void main(String[] args) {
		
		HauptClass frame = new HauptClass();
		
	}
	
	
	public void paint(Graphics g) {
		
	    //load image 
        String path = "knabe.jpg"; 
        String path2 = "knabe2.jpg";
        String path3 = "welt1.jpg";
        knabe2 = Toolkit.getDefaultToolkit().getImage(path2);
        knabe = Toolkit.getDefaultToolkit().getImage(path);
        hintergrund = Toolkit.getDefaultToolkit().getImage(path3);
        
        int x1 = sp1.getX();
        int y1 = sp1.getY() + 500;
        int x2 = sp2.getX() + 1200;
        int y2 = sp2.getY() + 500;
        
        
        g.drawImage(hintergrund,0,0,1280,1024,this);
        g.drawImage(knabe,x1,y1,this);
        g.drawImage(knabe2,x2,y2,this);

		
	}
}
```



und von der Spieler Klasse:



```
package SpielPaket;

public class Spieler { 
	   public int x, y; 

	   public int getY() { 
	      return y; 
	   } 
	    
	   public int getX() { 
	      return x; 
	   } 
	    
	   public void setY(int y) { 
	      this.y = y; 
	   } 
	    
	   public void setX(int x) { 
	      this.x = x; 
	   } 
	}
```


----------



## Illuvatar (18. Apr 2006)

1. Ich würde die Bildschirmauflösung nicht immer fest reincodieren, sondern Toolkit#getScreenSize() nehmen 
2. Das mit dem Hintergrundbild ist schon gut so
3. Lade die Bilder auf keinen Fall in der paint-Methode, sondern im Konstruktor (dann werden sie nur einmal und nicht jedesmal neu geladen)
4. Ka, warums mit JWindow net geht. Nimm am besten JFrame und sag setUndecorated (true)
5. Zum Flackern, such mal im Forum nach "Double Buffering"


----------



## gote (18. Apr 2006)

wenn ich das in den konstruktor reinlade, dann wechselt er die bilder nicht wenn ich nach links oder rechts gehe.


----------



## gote (18. Apr 2006)

Mit dem DoppelBuffering sieht das jetzt so aus:


```
package SpielPaket;

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


public class HauptClass extends JFrame {
	
	private JPanel mainPanel;
	private Spieler sp1 = new Spieler();
	private Spieler sp2 = new Spieler();
	public Image knabe, knabe2, hintergrund;
    //load image 
    String path2 ="Das Baby mit nur einer Augenbraue3.JPG"; 
    String path = "Pornstar w.3.JPG";
    String path3 = "welt1.jpg";
	KI typ;
    Image hilfsbild;
    Graphics hgr, g;
	
	
	public HauptClass() {
		
		setUndecorated (true);
		
		
		mainPanel = new JPanel();
		
		typ = new KI(500,500);
		
        sp1.x = 10;
        sp1.y = 706;
        sp2.x = 1100;
        sp2.y = 680;
		
        setAction("oben",KeyEvent.VK_UP,0);
        setAction("rechts",KeyEvent.VK_RIGHT,0);
        setAction("links",KeyEvent.VK_LEFT,0);
        setAction("unten",KeyEvent.VK_DOWN,0);
        
        setAction("oben2",KeyEvent.VK_W,0);
        setAction("rechts2",KeyEvent.VK_D,0);
        setAction("links2",KeyEvent.VK_A,0);
        setAction("unten2",KeyEvent.VK_S,0);
        
        setAction("exit", KeyEvent.VK_F2, InputEvent.SHIFT_MASK);
        
        
        setLayout(new BorderLayout());
        
        
        add(mainPanel,"Center");
        
        
        getContentPane().setBackground(Color.BLACK); 
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
        gd.setFullScreenWindow(this); 
        
        setVisible(true);
		
	}
	
    private void setAction(final String action, final int key, final int modifier){ 
        Action a = new AbstractAction(){ 
            public void actionPerformed(ActionEvent e) { 
                doAction(action); 
            } 
        }; 
        mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( 
                KeyStroke.getKeyStroke(key, modifier), action); 
        mainPanel.getActionMap().put(action, a); 
    } 
    private void doAction(final String action){ 
    	
    	if(action.equals("oben")) {
    		sp1.y -= 2;
    		repaint();
    	}
    	
    	else if(action.equals("rechts")) {
    		if(sp1.x != 1194) {
    		sp1.x += 2; 
    		path = "Pornstar w.3.JPG";
    		repaint();
    		}
    	}
    	
    	else if(action.equals("links")) {
    		if(sp1.x != 2) {
    		sp1.x -= 2;
    		path = "Pornstar w.4.JPG";
    		repaint();
    		}
    	}
    	
    	else if(action.equals("unten")) {
    		sp1.y += 2;
    		repaint();
    	}
    	
    	else if(action.equals("oben2")) {
    		sp2.y -= 2;
    		repaint();
    	}
    	
    	else if(action.equals("rechts2")) {
    		if(sp2.x != 1104) {
    		sp2.x += 2;
    		path2 = "Das Baby mit nur einer Augenbraue4.JPG";
    		repaint();
    		}
    	}
    	
    	else if(action.equals("links2")) {
    		if(sp2.x != 2) {
    		sp2.x -= 2;
    		path2 = "Das Baby mit nur einer Augenbraue3.JPG"; 
    		repaint();
    		}
    	}
    	
    	else if(action.equals("unten2")) {
    		sp2.y += 2;
    		repaint();
    	}
    	
    	else if(action.equals("exit")) {
    		System.exit(0);
    	}
    	
    	else {
    		System.exit(0);
    	}
    	
    	
    }

	public static void main(String[] args) {
		
		HauptClass frame = new HauptClass();
		
		
		
	}
	
	
	public void male() {
		
        knabe2 = Toolkit.getDefaultToolkit().getImage(path2);
        knabe = Toolkit.getDefaultToolkit().getImage(path);
        hintergrund = Toolkit.getDefaultToolkit().getImage(path3);
        
        
        int x1 = sp1.getX();
        int y1 = sp1.getY();
        int x2 = sp2.getX();
        int y2 = sp2.getY();
        
        
        g.drawImage(hintergrund,0,0,1280,1024,this);
        g.drawImage(knabe,x1,y1,this);
        g.drawImage(knabe2,x2,y2,this);
        
        g.drawImage(typ.bild,typ.x,typ.y,this);
        
        
        g.drawImage(hilfsbild,0,0,this);
		
	}
	
	
	public void paint(Graphics g) {
		
        knabe2 = Toolkit.getDefaultToolkit().getImage(path2);
        knabe = Toolkit.getDefaultToolkit().getImage(path);
        hintergrund = Toolkit.getDefaultToolkit().getImage(path3);
        
        
        int x1 = sp1.getX();
        int y1 = sp1.getY();
        int x2 = sp2.getX();
        int y2 = sp2.getY();
        
        
        g.drawImage(hintergrund,0,0,1280,1024,this);
        g.drawImage(knabe,x1,y1,this);
        g.drawImage(knabe2,x2,y2,this);
        
        g.drawImage(typ.bild,typ.x,typ.y,this);
		
	}
}
```


----------



## André Uhres (19. Apr 2006)

Um die beiden Figuren gleichzeitig zu bewegen könnte man für jede Aktion einen Thread starten 
der die Aktion so lange wiederholt bis sie durch eine neue Aktion unterbrochen wird. Etwa so:
"links" tippen: Figur läuft nach links.
"rechts" tippen: Figur läuft nach rechts.
"rechts" nochmal tippen: Figur stoppt.


----------



## gote (20. Apr 2006)

aber das finde ich persöhnlich schlcht. ich will das so haben, das wenn man einmal rechts tippt er auch einmal rechts läuft


----------



## André Uhres (20. Apr 2006)

gote hat gesagt.:
			
		

> aber das finde ich persöhnlich schlcht. ..


Naja, dann eben nicht.


----------

