kostenloser Webspace werbefrei: lima-city


Auf Keyinputs reagieren

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    g****e

    Heyhoo

    Soviel vorweg: Ich bin kein Javapro! Ich bin ein Blutiger Anfänger in Java, hab aber PHP und C++ Kenntnisse.
    Unzwar möchte ich mich mit einfachen 2D Animationen in Java beschäftigen, und habe dafür Canvas gewählt. Soweit so gut, ich habe nun also eine Klasse von Canvas abgeleitet, die über eine BufferStrategy ein BufferedImage immer wieder malt, das ganze in einem Seperaten Thread. Das ganze ist im Moment über 2 Datein geregelt, welche ich am Ende nochmal posten werde.

    Ich möchte dem ganzen jetzt 2 "Features"/Funktionen hinzufügen, unzwar:
    - Auf knopfdruck bleibt alles stehen / anderen Knopf startet alles wieder
    - dritten knopf gedrückt halten -> stopt das ganze

    Nur finde ich leider keine Hilfreichen Tuts oder so, die mir helfen die Tastenanschläge zu identifizieren, bzw die Tastatur abzufragen, ob da was gedrückt wurde.
    Darum frage ich hier mal die Pros: Wie könnte ich das realisieren? Wie macht man sowas?

    Liebe Grüße

    Hier der Code:
    package canvastestapp;
    
    import java.awt.Dimension;
    import javax.swing.JFrame;
    
    public class CanvasTestApp {
        public static void main(String[] args) {
            JFrame F = new JFrame("TESTFRAME");
            F.setPreferredSize(new Dimension(300,300));
            F.setMinimumSize(new Dimension(300,300));
            F.setMaximumSize(new Dimension(300,300));
            F.setResizable(false);
            F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            F.setVisible(true);
            
            MyCanvas MC = new MyCanvas();
            MC.start();
            F.add(MC);
        }
    }


    package canvastestapp;
    
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.image.BufferStrategy;
    import java.awt.image.BufferedImage;
    
    public class MyCanvas extends Canvas implements Runnable {
        
        private BufferedImage image = new BufferedImage(300,300,BufferedImage.TYPE_INT_RGB);
        private boolean running = false;
        private int line = 0;
        private Color color = Color.WHITE;
        
        
        @Override public void run() {
            running = true;
            while(running) {
                this.render();
                //System.out.println("render"+this.line);
            }
        }
        
        public void render() {
            BufferStrategy bs = getBufferStrategy();
            if (bs == null) {
                createBufferStrategy(3);
                return;
            }
            Graphics g = image.getGraphics();
            g.setColor(this.color);
            g.drawRect(0, 0, line, line);
            if (line == 300) {
                if (this.color == Color.BLACK) {
                    this.color = Color.WHITE;
                } else {
                    this.color = Color.BLACK;
                }
                this.line = 0;
            }
            this.line++;
            g.dispose();
            try {
                Thread.sleep(10);
            } catch(Exception e) {
                e.printStackTrace();
            }
            
            g = bs.getDrawGraphics();
            g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
            g.dispose();
            bs.show();
        }
        
        public void start() {
            new Thread(this).start();
        }
        
        public void stop() {
            this.running = false;
        }
    }
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Du baust dir einen KeyListener.
    Den KeyListener kannst du bei jedem Component registrieren, er empfängt dann nur von diesem Component die Tastenevents.
    import java.awt.event.*;
    class KeyboardHandler extends KeyAdapter {
    	boolean[] keysDown = new boolean[256];
    	public void keyPressed(KeyEvent e) {
    		int code = e.getKeyCode();
    		keysDown[code] = true;
    		// was tun wenn die Taste gedrückt worden ist
    	}
    	public void keyReleased(KeyEvent e) {
    		int code = e.getKeyCode();
    		keysDown[code] = false;
    		// was tun wenn die Taste wieder losgelassen worden ist
    	}
    
    	public boolean isKeyPressed(int code) {
    		return keysDown[code];
    	}
    }
    Dadurch das die Klasse von KeyAdapter abgeleitet ist müssen nicht alle Funktionen des KeyListeners implementiert werden (in dem Fall ist das keyTyped).
    Diesen KeyboardHandler kannst du jetzt so benutzen (innerhalb von deinem MyCanvas-Konstruktor):
    KeyboardHandler kb = new KeyboardHandler();
    addKeyListener(kb);
    Danach werden bei Tastenevents die Funktionen im KeyboardHandler aufgerufen.
    Für den dritten Knopf gillt folgendes: Da alles in Java Event-basiert ist hast du keine Möglichkeit zu prüfen ob gerade jetzt eine Taste gedrückt worden ist. Deshalb hab ich die Funktion isKeyPressed geschrieben mit der du das prüfen kannst. Dies setzt aber voraus dass das Objekt KeyboardHandler globas ist (und nicht nur im Konstruktor vorkommt).
  4. Autor dieses Themas

    g****e

    Das ist ja garnicht so schwer, wie es in vielen Tutorials erklärt wird.

    KeyAdapter hat den Vorteil, dass ich nicht alles einbauen muss, das ist gut zu wissen! Und mit einem addKeyListener() kann ich dann dem Objekt (in meinem Falle dem Frame) die KeyboardHandler zuweise, und dann wird es schön registriert :)
    Danke, nun kann ich das tatsächlich super verwerten.
    Echt großen Dank!

    Liebe Grüße
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!