gamelet.java

来自「java learn PPT java learn PPT java learn」· Java 代码 · 共 276 行

JAVA
276
字号
     package magic.gamelet;

     import java.applet.*;
     import java.awt.*;
     import java.awt.event.*;
     import java.awt.image.*;
     import java.awt.geom.*;
     import java.util.*;

     import magic.actor2d.*;
     import magic.awtex.*;
     import magic.debug.*;
     import magic.graphics.*;
     import magic.scene.*;

     public abstract class Gamelet extends Applet implements Runnable
     {
          /* 私有属性声明 */

          // 动画线程
          private Thread animation;

          /* 保护属性声明 */

          protected BufferedGraphics offscreenGraphics;
          protected final int BUFFER_STYLE_NONE        = 0;
          protected final int BUFFER_STYLE_DOUBLE      = 1;
          protected final int BUFFER_STYLE_ACCELERATED = 2;
          protected final int BUFFER_STYLE_UNKNOWN     = 3;  // chain flipping, etc
          protected int bufferStyle;

          protected Stack menuStack;

          protected Scene scene;

          protected Color clearColor;
          protected final Color DEFAULT_CLEARCOLOR = Color.BLACK;

          protected int framerate;
          protected double reportedFramerate;
          protected final int DEFAULT_FRAMERATE = 1000/33;	// 33 fps, 或者 30ms/frame

          protected static AudioClip[] audioClips;
          protected static boolean audioEnabled;

          /* 从java.Applet中继承来的方法 */

          public void init()
          {
               Debugger.init(true, Debugger.TYPE_FRAME_OUTPUT, true);

               AnimationStrip.observer = this;

               if(getGraphicsConfiguration().getImageCapabilities().isAccelerated())
               {
                    createBufferStyle(BUFFER_STYLE_ACCELERATED);
               }
               else
               {
                    createBufferStyle(BUFFER_STYLE_DOUBLE);
               }

               menuStack  = new Stack();
               scene      = null;
               clearColor = DEFAULT_CLEARCOLOR;
               animation  = new Thread(this);
               reportedFramerate = 0.0;
               setFramerate(DEFAULT_FRAMERATE);
               audioClips = null;
               audioEnabled = false;
          }   // init

          public void start()
          {
              // 启动动画线程
              if(animation == null)
              {
                   animation = new Thread(this);
              }
              animation.start();
          }

          public void stop()
          {
              animation = null;
          }

          public void update(Graphics g)
          {
               if(Debugger.isDisplayingOutput())
               {
                    return;
               }

               if(scene != null)
               {
                    scene.update();
               }

               paint(g);
          }

          public void paint(Graphics g)
          {
               Graphics2D g2d = null;

               if(bufferStyle != BUFFER_STYLE_NONE && bufferStyle != BUFFER_STYLE_UNKNOWN)
               {
                    if(offscreenGraphics != null)
                    {
                         g2d = (Graphics2D)offscreenGraphics.getValidGraphics();
                         g2d.setBackground(clearColor);
                         g2d.clearRect(0, 0, getSize().width, getSize().height);
                    }
                    else
                    {
                         Debugger.reportWarning("Buffering style is double, but graphics context references null");
                         g2d = (Graphics2D) g;
                    }
               }

               else
               {
                    g2d = (Graphics2D) g;
               }

               prepareGraphics(g2d);

               if(menuStack.size() > 0)
               {
                    if( ((Menu2D)menuStack.peek()).isOverlay())
                    {
                         paintScene(g2d);
                    }

                    ((Menu2D)menuStack.peek()).paint(g2d);
               }
               else
               {
                    paintScene(g2d);
               }

               g.drawImage(offscreenGraphics.getBuffer(), 0, 0, this);

          }    // paint

          /* 从java.lang.Runnable继承来的方法 */

          public void run()
          {
               long lastTime;
               long frameCount = 0;
               long elapsedTime;
               long totalElapsedTime = 0;

               Thread t = Thread.currentThread();
	       while (t == animation)
               {
                    lastTime = System.currentTimeMillis();

                    repaint();

                    elapsedTime = System.currentTimeMillis() - lastTime;

                    try
                    {
                         if(elapsedTime < framerate)
                         {
                              Thread.sleep(framerate - elapsedTime);
                         }
                         else
                         {
                              // 不要让垃圾收集器饿着
                              Thread.sleep(5);
                         }
                    }

                    catch(InterruptedException e)
                    {
                         break;
                    }

                    ++ frameCount;
                    totalElapsedTime += (System.currentTimeMillis() - lastTime);
                    if(totalElapsedTime > 1000)
                    {
                         reportedFramerate = (double) frameCount / (double) totalElapsedTime * 1000.0;
                         frameCount = 0;
                         totalElapsedTime = 0;
                    }
                }

           }   // run

          /* magic.Gamelet的新方法 */

          public boolean isDoubleBuffered()
          {
               return (bufferStyle == BUFFER_STYLE_DOUBLE ||
                       bufferStyle == BUFFER_STYLE_ACCELERATED
                       );
          }

          protected void setFramerate(int fps)
          {
               framerate = fps;
          }

          protected void createBufferStyle(int style)
          {
               bufferStyle = style;

               switch(bufferStyle)
               {
                    case BUFFER_STYLE_NONE:
                         offscreenGraphics = null;
                         return;

                    case BUFFER_STYLE_DOUBLE:
                         offscreenGraphics = new BufferedGraphics(this);
                         return;

                    case BUFFER_STYLE_ACCELERATED:
                         offscreenGraphics = new VolatileGraphics(this);
                         return;

                    case BUFFER_STYLE_UNKNOWN:
                         Debugger.reportWarning("Unknown buffer style (" + style + ").");
                         offscreenGraphics = null;
                         return;
                }
          }

          protected void prepareGraphics(Graphics2D g2d)
          {

          }

          protected void paintScene(Graphics2D g2d)
          {
               if(scene != null)
               {
                    scene.paint(g2d);
               }
          }

          public static void playSound(int index, boolean loop)
          {
               if(!audioEnabled)
               {
                    return;
               }

               if(audioClips != null && index >= 0 && index < audioClips.length && audioClips[index] != null)
               {
                    if(loop)
                    {
                         audioClips[index].loop();
                    }
                    else
                    {
                         audioClips[index].play();
                    }
               }
          }


          public static void stopSound(int index)
          {
               if(audioClips != null && index >= 0 && index < audioClips.length && audioClips[index] != null)
               {
                    audioClips[index].stop();
               }
          }

     }     // Gamelet

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?