General > German corner

FCP Code als applet

(1/4) > >>

mogli:
Hi!

Ich versuche momentan den FPS Code in ein applet umzuwandeln.

Leider allerdings ohne Erfolg. Kann mir vielleicht jemand dabei helfen? Bzw mir ein paar Tips geben?

gruss mogli

EgonOlsen:
Was genau willst du machen? Wenn du die Funktionalität 1-zu-1 übernehmen willst, d.h. aus der Hauptschleife an sonstigem AWT- und Swingkram vorbei zeichnen willst, dann geht das z.B. so, wie in diesem Beispiel:


--- Code: ---import java.applet.*;
import java.awt.*;

import com.threed.jpct.*;

public class ExampleApplet extends Applet implements Runnable {
  private Thread loopThread;
 
  private World world=null;
  private Object3D obj=null;

   private FrameBuffer buffer=null;
   private boolean exit=false;

   public ExampleApplet() {}

   public void init() {
      getAppletContext().showStatus("Initializing...");
      buffer=new FrameBuffer(480, 300, FrameBuffer.SAMPLINGMODE_NORMAL);
      buffer.enableRenderer(IRenderer.RENDERER_SOFTWARE, IRenderer.MODE_OPENGL);

      world=new World();
      world.setAmbientLight(200,200,200);

      obj=Primitives.getCube(3);
      world.addObject(obj);

      world.buildAllObjects();
      world.getCamera().setPosition(new SimpleVector(0,0,-30));

      getAppletContext().showStatus("Done !");
   }

   public void destroy() {
      TextureManager.getInstance().flush();
      Object3D.resetNextID();
      exit=true;
      super.destroy();
   }

   public void paint(Graphics g) {
   }

   public void update(Graphics g) {
   }

   public String getAppletInfo() {
     return ("Example Applet ");
   }
 
   public void run() {
     if (Thread.currentThread() == loopThread) {
       mainLoop();
     }
   }
 
   public void start() {
     if (loopThread==null) {
       loopThread = new Thread(this);
       loopThread.start();
     }
   }

   private void mainLoop() {
      Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
      while (!exit) {
        buffer.clear();
        obj.rotateX(0.01f);
        obj.rotateY(-0.01f);
        world.renderScene(buffer);
        world.draw(buffer);
        buffer.update();
        buffer.display(this.getGraphics());
        Thread.yield();
      }
      loopThread=null;
   }
}

--- End code ---

mogli:
danke, ja werd das mal als basis nehmen und dann mal weiter sehen.

vielen dank schonmal!

mogli:
Mein Applet läuft bereits sehr gut. Vielen Dank noch mal für die Hilfe.

Ich habe nun eine Frage bezüglich eines Ladebalkens.
Ich würde während ich das 3ds-worldfile lade, gerne einen Ladebalken einblenden, der den aktuellen Lade-Status ausgibt.
Habe gelesen, dass man die init-Methode bzw das Laden des worldfiles in eine andere Methode auslagern könnte und diese dann in der funktion paint() aufruft.
Das habe ich auch versucht allerdings, allerdings ohne Erfolg, das Fenster bleibt grau. Das die initialisierungs-Methode in paint() nur einmal aufgerufen wird, habe ich mit einem bool-Wert abgefangen.

Wäre nett, wenn mir jemand ne Hilfe geben könnte.

EgonOlsen:
Pack das Laden in einen eigenen Thread und lass den Hauptthread entweder direkt den Ladebalken zeichnen oder dies über die normalen AWT-Mechanismen in update/paint erledigen, so wie in diesem Beispiel:


--- Code: ---import java.applet.*;
import java.awt.*;

import com.threed.jpct.*;

public class ExampleApplet extends Applet implements Runnable {
  private Thread loopThread;

  private World world=null;
  private Object3D obj=null;

   private FrameBuffer buffer=null;
   private boolean exit=false;
   private boolean loading=true;

   public ExampleApplet() {}

   public void init() {
      getAppletContext().showStatus("Initializing...");
      buffer=new FrameBuffer(480, 300, FrameBuffer.SAMPLINGMODE_NORMAL);
      buffer.enableRenderer(IRenderer.RENDERER_SOFTWARE, IRenderer.MODE_OPENGL);

      world=new World();
      world.setAmbientLight(200,200,200);

      obj=Primitives.getCube(3);
      world.addObject(obj);

      world.buildAllObjects();
      world.getCamera().setPosition(new SimpleVector(0,0,-30));

      getAppletContext().showStatus("Done !");
   }

   public void destroy() {
      TextureManager.getInstance().flush();
      Object3D.resetNextID();
      world.removeAll();
      exit=true;
      super.destroy();
   }

   public void paint(Graphics g) {
   }

   public void update(Graphics g) {
     if (loading) {
       paintLoadingStuff(g);
     }
   }

   public String getAppletInfo() {
     return ("Example Applet ");
   }

   public void run() {
     if (Thread.currentThread() == loopThread) {
       mainLoop();
     }
   }

   public void start() {
     if (loopThread==null) {
       loopThread = new Thread(this);
       loopThread.start();
     }
   }

   private void paintLoadingStuff(Graphics g) {
     // Do some loading bar or whatever here
     g.clearRect(0, 0, getWidth(), getHeight());
     g.drawString( (int) (Math.random() * 100) + "% finished", 10, 30);
   }
   
   private void loadStuff() {
     try {
       // Simulate loading by waiting 5 secs...
       Thread.sleep(5000);
     } catch(Exception e) {
       e.printStackTrace();
     }
     loading=false;
   }
 
   private void mainLoop() {
      Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
     
      new Thread() {
        public void run() {
          loadStuff();
        }
      }.start();
     
      try {
        while (loading) {
           repaint();
           Thread.sleep(50);
        }
      } catch(Exception e) {e.printStackTrace();}
     
      while (!exit) {
        buffer.clear();
        obj.rotateX(0.01f);
        obj.rotateY(-0.01f);
        world.renderScene(buffer);
        world.draw(buffer);
        buffer.update();
        buffer.display(this.getGraphics());
        Thread.yield();
      }
      loopThread=null;
   }
}

--- End code ---

Navigation

[0] Message Index

[#] Next page

Go to full version