老外用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,可打开调试模式,降低游戏难度,一方面也方便大家学习源码。