Tastenkürzel

Status
Nicht offen für weitere Antworten.

gote

Mitglied
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!!!
 

gote

Mitglied
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

Top Contributor
Ein JWindow, das den ganzen Bildschirm ausfüllt:
Code:
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

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


Code:
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

Top Contributor
Code:
//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

Mitglied
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:


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:


Code:
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

Top Contributor
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

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

gote

Mitglied
Mit dem DoppelBuffering sieht das jetzt so aus:

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;
    //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

Top Contributor
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

Mitglied
aber das finde ich persöhnlich schlcht. ich will das so haben, das wenn man einmal rechts tippt er auch einmal rechts läuft
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben