2012-04-05 8 views
-2

// Hier ist mein Code:Ich brauche eine Methode von einer anderen Klasse nennen

Main Class: 

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferInt; 
import java.awt.image.BufferStrategy; 
import javax.swing.JFrame; 
public class Display extends Canvas implements Runnable{ 
    Toolkit toolkit = Toolkit.getDefaultToolkit(); 
    Dimension dim = toolkit.getScreenSize(); 
    public static int WIDTH; 
    public static int HEIGHT; 
    public static final String title = "First Person Game"; 
    public static Thread thread; 
    public static Screen screen; 
    public static BufferedImage img; 
    public static boolean running = false; 
    public static int[] pixels; 
    public static Render render; 
    public Display(){ 
     WIDTH = dim.width; 
     HEIGHT = dim.height; 
     screen = new Screen(WIDTH, HEIGHT); 
     img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
     pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData(); 
    } 
    private void start(){ 
     if(running){ 
      return; 
     }else{ 
      running = true; 
      thread = new Thread(this); 
      thread.start(); 
     } 
    } 
    private void stop(){ 
     if(!running){ 
      return; 
     }else{ 
      running = false; 
      try{ 
       thread.join(); 
      }catch(Exception x){ 
       System.exit(0); 
      } 
     } 
    } 
    public void run(){ 
     while(running){ 
      render(); 
     } 
    } 
    public void render(){ 
     BufferStrategy bs = this.getBufferStrategy(); 
     if(bs == null){ 
      createBufferStrategy(3); 
      return; 
     } 
     screen.render(); 
     for(int i = 0; i < WIDTH * HEIGHT; i++){ 
      pixels[i] = screen.pixels[i]; 
     } 
     Graphics g = bs.getDrawGraphics(); 
     g.drawImage(img, 0, 0, WIDTH, HEIGHT, null); 
     g.dispose(); 
     bs.show(); 
    } 
    public static void main(String args[]){ 
     JFrame frame = new JFrame(); 
     BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); 
     Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(cursorImg, new Point(0, 0), "blank cursor"); 
     frame.getContentPane().setCursor(blankCursor); 
     Display game = new Display(); 
     frame.setUndecorated(true); 
     frame.add(game); 
     frame.setTitle(title); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(WIDTH, HEIGHT); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 
     frame.setVisible(true); 
     fps f = new fps(); 
     game.start(); 
    } 
} 



The class I need to call: 

public class fps{ 
    public void fps(){ 
     System.out.println("Test 1 successful."); 
     int frames = 0; 
     double unprocessedSeconds = 0; 
     long previousTime = System.nanoTime(); 
     double secondsPerTick = 1/60.0; 
     int tickCount = 0; 
     boolean ticked = false; 
     Display c = new Display(); 
     System.out.println("Test 2 successful."); 
     c.render(); 
     long currentTime = System.nanoTime(); 
     long passedTime = currentTime - previousTime; 
     previousTime = currentTime; 
     unprocessedSeconds += passedTime/1000000000.0; 
     while(unprocessedSeconds > secondsPerTick){ 
      System.out.println("Test 3 successful."); 
      tick(); 
      unprocessedSeconds -= secondsPerTick; 
      ticked = true; 
      tickCount++; 
      if(tickCount % 60 == 0){ 
       System.out.println(frames + " fps"); 
       previousTime += 1000; 
       frames = 0; 
      } 
     } 
     if(ticked){ 
      c.render(); 
      frames++; 
     } 
     c.render(); 
     frames++; 
    } 
    public void tick(){} 
} 

/* Ich weiß nicht, wie dies zu tun, ich habe alle möglichen Dinge versucht. Ich muss grundsätzlich * sicherstellen, dass fps während der Anzeige in die Konsole druckt. Ich kann nicht so scheinen. Ich habe es in method run() versucht, aber es würde es einfach nicht nennen.

+0

http://docs.oracle.com/javase/tutorial/java/index.html – mre

+0

Was Fehler hast du Ivan gesehen? – Gray

+0

Es wurden keine Fehler gemeldet. Es ist nur so, dass der zweite Code nicht funktioniert. Nichts wird auf der Konsole ausgedruckt. –

Antwort

0

Ich glaube, Sie müssen eine Instanz der FPS-Klasse in Ihrer Hauptklasse erstellen und rufen Sie dann die Methode durch.

Zumindest ist dies in C#, die ich weiß, ist sehr ähnlich zu Java.

Wenn dies nicht hilft, dann glaube ich, es ist ein Threading-Problem, und Sie müssen sicherstellen, dass Sie die Threads ordnungsgemäß behandeln. (Ich kann nicht mit diesem Problem helfen, ich bin immer noch grün, Java-Threading.)

-1

Nun, Sie können eine von zwei Dingen tun. Sie können entweder ein fps Objekt deklarieren:

fps myfps = new fps(); 
myfps.fps(); 

oder Sie können es alle statisch machen:

public static void fps(){ 
    ... 
} 
public static void tick(){} 

//elsewhere 
fps.fps() 
+0

Ihr erster Ansatz ist richtig. Du bist 2. Code ist absolut falsch. Sie können keine Methode mit demselben Namen wie die Klasse mit statischen und leeren Stichwörtern zur gleichen Zeit deklarieren. Dein Code wird nicht kompiliert. – mtk

+1

@mtk - yeah ... du bist in der Tat nicht korrekt. Wenn Sie mich nicht missverstehen und denken, dass ich irgendwie versuche, zwei Methoden mit demselben Namen zu deklarieren (was einen Kompilierungsfehler verursachen würde), stellt Java die Namespace-Interaktion nicht wirklich in Frage. Mindestens Java 6 wird nicht für i386 auf einer Debian-Linux-Plattform kompiliert. Ernst. Versuch es. – FrankieTheKneeMan

+0

Ich wollte sagen, dass es keine Methode mit Name als Klassenname geben kann. Nur der Konstruktor hat denselben Namen wie die Klasse. Sie können für einen Konstruktor weder static noch void deklarieren.Ich versuchte und bekam einen Kompilierungsfehler für 'Klasse fps { öffentliches statisches void fps() { } }'. Dies habe ich aus Ihrem zweiten Ansatz, d. H. 'Fps.fps()', interpretiert. Ich habe den Fehler in Ihrem zweiten Code und nicht in Ihrem Ansatz kommentiert. :) – mtk

0

Es ist ein wenig seltsam, ein Verfahren mit dem gleichen Namen wie die Klasse zu haben. Soll es ein Konstrukteur sein, so?

public class fps{ 
    //Note that the void is removed here 
    public fps(){ 
     System.out.println("Test 1 successful."); 
     int frames = 0; 
     double unprocessedSeconds = 0; 
     long previousTime = System.nanoTime(); 
     double secondsPerTick = 1/60.0; 
     int tickCount = 0; 
     boolean ticked = false; 
     Display c = new Display(); 
     System.out.println("Test 2 successful."); 
     c.render(); 
     long currentTime = System.nanoTime(); 
     long passedTime = currentTime - previousTime; 
     previousTime = currentTime; 
     unprocessedSeconds += passedTime/1000000000.0; 
     while(unprocessedSeconds > secondsPerTick){ 
      System.out.println("Test 3 successful."); 
      tick(); 
      unprocessedSeconds -= secondsPerTick; 
      ticked = true; 
      tickCount++; 
      if(tickCount % 60 == 0){ 
       System.out.println(frames + " fps"); 
       previousTime += 1000; 
       frames = 0; 
      } 
     } 
     if(ticked){ 
      c.render(); 
      frames++; 
     } 
     c.render(); 
     frames++; 
    } 
    public void tick(){} 
} 

Ich würde auch vorschlagen, dass alle, dass Code nicht wirklich geeignet für einen Konstruktor und sollte auf seine eigene Methode bewegt werden. Dann, wie von anderen erwähnt, können Sie Ihre Methode nach zuerst erstellen ein fps-Objekt aufrufen.

+0

Das ist, was ich bekomme, wenn ich die feste Version ausführe. C: \ Benutzer \ Ivan> Java Anzeige Test 1 erfolgreich. Test 2 erfolgreich. Ausnahme im Thread "Haupt" java.lang.IllegalStateException: Komponente muss ein gültiger Peer Ich würde mehr Details enthalten, aber ich habe keine Zeichen hier. –

+0

Meiner Meinung nach ist das ein völlig anderes Thema, und Sie würden besser dazu dienen, es mit einer neuen Frage anzugehen. Der Titel dieser Frage "Ich muss eine Methode aus einer anderen Klasse aufrufen" zusammen mit den Tags dieser Frage gilt nicht wirklich für das neue Problem. Ich weiß nicht sofort, was diese Ausnahme bedeutet, aber ich würde mir vorstellen, dass sie mit Ihrem Aufruf c.render() zusammenhängt. – user506069

0

Es gibt einen Fehler im Code:

private void start(){ 
    if(running){ 
     return; 
    }else{ 
     running = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 
} 

Threads gestartet werden, indem der Start-Methode aufrufen. Was Sie getan haben, ist die start() -Methode zu ändern. Sie sollten die run-Methode anstelle der start-Methode verwenden, da Thread.start() dazu gedacht ist, einen Thread zu starten, während run() den Ausführungscode enthält.

Wie aus der JavaDoc des Java-API, http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#start%28%29

public void Start()

Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread. 
Verwandte Themen