`
xpenxpen
  • 浏览: 703529 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Escape the men's room(Java版密室逃脱)

阅读更多
1.概述
老外用Java做的2D密室逃脱游戏。个人认为挺不错的。
来源http://meatfighter.com/escape/index.html
效果如图


2.源码赏析

还是一如既往,定义了一个IMode,这样不同模式可以切换,避免一堆if else,而且扩展也容易。
游戏主要核心就是Main以及GameMode这两个类。其他都是场景。当然里面有很多小游戏,如fifteen,汉诺塔,记忆题。
Main是游戏的一个框架。
  public void run() {

    Images.inventoryTile.getWidth(); // load images
    addMouseListener();

    BufferedImage image = new BufferedImage(CANVAS_WIDTH, CANVAS_HEIGHT,
        BufferedImage.TYPE_INT_RGB);
    Graphics2D g = (Graphics2D)image.getGraphics();
    Graphics2D g2 = null;
    int frameSkips = 0;

    long nextFrameStartTime = System.nanoTime();
    while(alive) {

      //1.跳帧,防止电脑太慢
      do {
        nextFrameStartTime += 16666667;
        frameSkips++;

        //2.更新模型
        mode.update();

      } while(nextFrameStartTime < System.nanoTime()
          && frameSkips < MAX_FRAME_SKIPS);

      if (frameSkips >= MAX_FRAME_SKIPS) {
        nextFrameStartTime = System.nanoTime();
      }
      frameSkips = 0;

      //3.如果targetMode存在,则进入该模式,并进入下一次循环(continue)
      if (targetMode != null) {
        mode = targetMode;
        mode.enter();
        targetMode = null;
        nextFrameStartTime = System.nanoTime();
        continue;
      }

      //4.渲染(在内存中画)(double buffer)
      mode.render(g);

      //5.一次性画到屏幕上
      // show the hidden buffer
      if (g2 == null) {
        g2 = (Graphics2D)getGraphics();
        requestFocus();
      } else {
        g2.drawImage(image, 0, 0, null);
      }

      //6.睡一会儿,节省cpu
      // burn off extra cycles
      while(nextFrameStartTime - System.nanoTime() > 0) {
        Thread.yield();
      }

      // do not eat up CPU if user leaves browser
      if (sleeping) {
        synchronized(this) {
          while (sleeping && alive) {
            try {
              wait();
            } catch(Throwable t) {
            }
          }
        }
        nextFrameStartTime = System.nanoTime();
      }
    }
  }


GameMode稍微复杂一点,处理了鼠标点击,鼠标拖放核心功能。
具体不多说了,附件可下载我加了中文注释的源码包,在JDK7上可以运行。

如果觉得难度太高的话,可以修改Main.DEBUG=true,可打开调试模式,降低游戏难度,一方面也方便大家学习源码。
  • 大小: 80.9 KB
  • 大小: 10.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics