Avatar billede p4trick Nybegynder
22. januar 2013 - 17:59 Der er 3 kommentarer og
1 løsning

Kludring ved jbInit() (KeyEvent)

Jeg prøvet lige p.t. at lave nogen diverse programmer. Jeg ville lave et 'spil' mere en spiller styret karater, der skulle kunne bevæge sig. Jeg har bare et lille problem - Mine KeyEvents virker ikke. Jeg har den forstilling om, at jeg skal bruge jbInit(), men jeg er ikke sikker på om det er nødvendigt? Er det kun når det er programmet der autogenere koder man bruger det eller hvad?

Min følgende kode Player:

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;

public class Player extends Frame {
   
    private int x = 1, y = 1;
    private String navn;
   
    public Player(String navn) {
        this.navn = navn;
        requestFocus();
        try {
            System.out.println("try { kaldt.");
            jbInit();
        } catch(Exception e) {
            System.out.println("Fejl i jbInit().");
            e.printStackTrace();
        }
       
        System.out.println("Player "+navn+" kaldt");
    }
   
    public void sætPosition(int x, int y) {
        this.x = x;
        this.y = y;
        System.out.println("Position "+x+" sat, Position "+y+" sat");
    }
   
    public int getPosition(String xory) {
        if(xory == "x") {
            return x;
        } else if(xory == "y") {
            return y;
        } else return 0;
    }
   
    private void jbInit() throws Exception {
        System.out.println("jbInit() kaldt.");
        addKeyListener(new java.awt.event.KeyListener() {
            public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_UP) { sætPosition(getPosition("x")+10, getPosition("y")); System.out.println("OP"); }
            else if(e.getKeyCode() == KeyEvent.VK_DOWN) { sætPosition(getPosition("x")-10, getPosition("y")); System.out.println("NED"); }
            else if(e.getKeyCode() == KeyEvent.VK_RIGHT) { sætPosition(getPosition("x"), getPosition("y")+10); System.out.println("HØJRE"); }
            else if(e.getKeyCode() == KeyEvent.VK_LEFT) { sætPosition(getPosition("x"), getPosition("y")-10); System.out.println("VENSTRE"); }
            else sætPosition(getPosition("x"), getPosition("y")); System.out.println("Test"); System.out.println();
            repaint();
              System.out.println("KeyListener kaldt.");
            }

            @Override
            public void keyReleased(KeyEvent e) {}
            public void keyTyped(KeyEvent e) { System.out.println(e);}
            });
       
    }

    public void paint(Graphics g) {
        g.fillArc(getPosition("x"), getPosition("y"), 50, 50, 0, 360);
        g.drawString(navn, getPosition("x"), getPosition("y")+60);
        System.out.println("Arc med position "+x+", "+y+" sat.");
    }

}

og min main funktion, Klient:

import java.awt.Frame;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Klient extends JPanel implements Runnable {
   
    public static void main(String[] arg) {
        JFrame k = new JFrame ("KeyEvents");
        k.add(new Klient());
        k.setSize(700,600);
        k.setVisible(true);
        }
   
    Player p = new Player("Patrick");
   
    public Klient()  {

    }

    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        //g.fillArc(100, 100, 50, 50, 0, 360);
        for(int i= 0; i<1000; i++) {
            //try { Thread.sleep(40); } catch(Exception e) { }
            p.paint(g);       
        }

        }

    @Override
    public void run() {
    }
}


Den tegner g.dravArc(), og output er:
" try { kaldt.
jbInit() kaldt.
Player Patrick kaldt
Arc med position 1, 1 sat."

, men reagere ikke på mine keys.

Nogen forslag til hvordan jeg kan optimere koden, og eller hvad jeg har gjort galt?

På forhånd, mange tak.

Patrick.
Avatar billede p4trick Nybegynder
22. januar 2013 - 19:30 #1
Jeg har så lavet nogen ændringer.
Jeg lavede min KeyListener i main funktionen, hvilket gjorde at den virkede.

Jeg har så det problem, at mine tegninger ikke vil virke.

Jeg har indført nogen forandringer, og lavet den runnable, så den vil opdatere oftere ( 1 sekundt pr. repaint() ). Men min paint() funktion bliver slet ikke kaldet - jeg er ikke sikker på hvordan jeg skal få den kaldt indeni Klient.java, eftersom det er et void, så burde den vel at tegne den? Jeg har implementeret noget Thread, eftersom jeg havde i tanker at lave et lille spil med noget AI.

Jeg har prøvet at kommentere koden så meget jeg kan, håber ikke jeg har kludret for meget i det, jeg er stadig en meget ny koder.

Player.java:
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;

public class Player extends Component implements Runnable {
   
    private int x = 1, y = 1;
    private int pw, ph;
    private String navn;
   
    public Dimension getPrefferedSize() { return new Dimension(50, 50); }    // For at kunne finde massefyldet, så laves en getPrefferedSize()
    // getPrefferedSize().height og getPrefferedSize.width - Hvis den bliver brugt meget vil der blive lavet en
    // Dimension d = getSize() som kan bruges med getSize().height og .width
    private boolean ready = false;
   
   
    private synchronized void getReady() {            /* For at være sikker på, at alt er intakt når der er AI - f.eks. Zombier med AI.*/
        System.out.println("Gør klar.");
        Thread t = new Thread(this);
        t.setDaemon(true);
        t.start(); // Starter tråden.
        ready = true;
        System.out.println("Gjort klar.");
    }
   
    public Player(String navn) {
        this.navn = navn;
       
        System.out.println("Player "+navn+" kaldt");
    }
   
    public void sætPosition(int x, int y) {
        this.x = x;
        this.y = y;
        System.out.println("Position "+x+" sat, Position "+y+" sat");
    }
   
    public int getPosition(String xory) {
        if(xory == "x") {
            System.out.println("Gammel Position x:"+x);
            return x;       
        } else if(xory == "y") {
            System.out.println("Gammel Position y:"+y);
            return y;
        } else System.out.println("Returner 0"); return 0;
    }
   
      public void run() {
          System.out.println("Kører run()");
            try {
                System.out.println("Imens vi er klar.");
              while (true) {
                  System.out.println("Venter 1 sekund.");
                Thread.sleep(1000);    // Laver en opdateringsfunktion, hvis der er flere klienter, så det ikke bare er raw input.
                repaint();     
                System.out.println("repaint();");
              }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Fejl!");
            }
          }

    public void paint(Graphics g) {
       
        if(!ready) System.out.println("Var ikke klar - gør klar."); getReady();
        g.fillRect(getPosition("x"), getPosition("y"), getPrefferedSize().height, getPrefferedSize().width);    // Spiller brikken - en rect [].
        g.drawString(navn, getPosition("x"), getPosition("y")+60); /* Tekst der er nendeunder, der repræsentere spillerens navn - Bliver fjernet senere.*/
        System.out.println("Arc med position "+x+", "+y+" sat.");
        System.out.println("getPrefferedSize(): Højde:"+getPrefferedSize().height+". Bredde:"+getPrefferedSize().width);
    }
}

////////********///////////////////
Klient.java:

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Klient extends Frame {   
       
    Player p = new Player("Patrick");
   
    public Klient()  {
        try {
            System.out.println("try { kaldt.");
            jbInit();
        } catch(Exception e) {
            System.out.println("Fejl i jbInit().");
            e.printStackTrace();
        }
    }
   
    private void jbInit() throws Exception {
        System.out.println("jbInit() kaldt.");
        addKeyListener(new java.awt.event.KeyListener() {
            public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_UP) { p.sætPosition(p.getPosition("x")+10, p.getPosition("y")); System.out.println("OP"); }
            else if(e.getKeyCode() == KeyEvent.VK_DOWN) { p.sætPosition(p.getPosition("x")-10, p.getPosition("y")); System.out.println("NED"); }
            else if(e.getKeyCode() == KeyEvent.VK_RIGHT) { p.sætPosition(p.getPosition("x"), p.getPosition("y")+10); System.out.println("HØJRE"); }
            else if(e.getKeyCode() == KeyEvent.VK_LEFT) { p.sætPosition(p.getPosition("x"), p.getPosition("y")-10); System.out.println("VENSTRE"); }
            //else p.sætPosition(p.getPosition("x"), p.getPosition("y")); System.out.println("Test"); System.out.println();
              System.out.println("KeyListener kaldt.");
              repaint();
            }

            @Override
            public void keyReleased(KeyEvent e) {}
            public void keyTyped(KeyEvent e) { System.out.println(e);}
            });
       
    }

   
    public static void main(String[] arg) {
        Klient k = new Klient();
        k.setSize(400,400);
        k.setVisible(true);
        }
}


///////*************///

Input: Højre, Venstre, Op, Ned.
Output:
Player Patrick kaldt
try { kaldt.
jbInit() kaldt.
Gammel Position x:1
Gammel Position y:1
Position 1 sat, Position 11 sat
HØJRE
KeyListener kaldt.
Gammel Position x:1
Gammel Position y:11
Position 1 sat, Position 1 sat
VENSTRE
KeyListener kaldt.
Gammel Position x:1
Gammel Position y:1
Position 11 sat, Position 1 sat
OP
KeyListener kaldt.
Gammel Position x:11
Gammel Position y:1
Position 1 sat, Position 1 sat
NED
KeyListener kaldt.

///////*********///

Dette er ikke et skole projekt eller lign., det er et fritids projekt jeg leger med, men eftersom jeg ikke har skarpe øjne mht. Java koding, endnu, så ville jeg være rigtig taknemmlig hvis der var en der kunne prikke til mig, og give et hint med hvad der var forkert.
Har på fornemelsen det måske er min nye måde at kalde grafik vinduet på? (Ikke mere "JFrame" siden den lavede mærkelige ting med mit vindue).

Håber ikke det gør noget at jeg rettede mit spørgsmål - stadig 200 point på højkant
Avatar billede p4trick Nybegynder
22. januar 2013 - 20:07 #2
Et output mere for at vise, at KeyEvent virker:

Input: Højre, højre, højre, højre
Output:
Player Patrick kaldt
try { kaldt.
jbInit() kaldt.
Gammel Position x:1
Gammel Position y:1
Position 1 sat, Position 11 sat
HØJRE
KeyListener kaldt.
Gammel Position x:1
Gammel Position y:11
Position 1 sat, Position 21 sat
HØJRE
KeyListener kaldt.
Gammel Position x:1
Gammel Position y:21
Position 1 sat, Position 31 sat
HØJRE
KeyListener kaldt.
Gammel Position x:1
Gammel Position y:31
Position 1 sat, Position 41 sat
HØJRE
KeyListener kaldt.
Avatar billede p4trick Nybegynder
22. januar 2013 - 21:14 #3
Hold da op jeg får snakket med mig selv!

Kan det havet noget med at gøre at jeg ikke har kaldt på paint(getGraphics);? Jeg har prøvet at kalde den, men jeg kan ikke helt finde ud af hvor jeg skal kalde den fra.
Avatar billede p4trick Nybegynder
23. januar 2013 - 08:35 #4
Ved et hurtigere kig, så ser jeg, at det er lavet helt forkert. Jeg undskylder spild af pladsen på forummet. Lukker tråden før andre bliver forvirret.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester