这是一个吃豆游戏的Java实现,具体代码较多请下载文件。
下载地址:http://download.csdn.net/source/396925
package org.loon.test;import java.awt.Color;import java.awt.Event;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.Insets;import java.awt.MediaTracker;import java.awt.Panel;import java.awt.Toolkit;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.image.BufferedImage;import java.awt.image.VolatileImage;/** * * <p>* Title: LoonFramework* </p>* <p>* Description:* </p>* <p>* Copyright: Copyright (c) 2008* </p>* <p>* Company: LoonFramework* </p>* <p>* License: [url]http://www.apache.org/licenses/LICENSE-2.0 [/url]* </p>* * @author chenpeng* @email:ceponline@yahoo.com.cn* @version 0.1*/class Timer implements Runnable { Pacgame ap; int duration; private Thread myThread; private boolean loopf = true; private long tickCount; public Timer(Pacgame ap, int duration) { this.ap = ap; this.duration = duration; } public Timer(Pacgame ap) { this(ap, 16); } public void on() { myThread = new Thread(this); myThread.start(); } public void off() { loopf = false; } public void run() { loopf = true; tickCount = System.currentTimeMillis(); while (loopf) { try { Thread.sleep(duration); } catch (Exception e) { e.printStackTrace(); } ap.notifyFrame (); } } public int frames() { long nowTick = System.currentTimeMillis(); int frame = (int) (nowTick - tickCount) / duration; if (frame <= 0) { frame = 1; tickCount = nowTick; } else if (frame > 5) { frame = 5; tickCount = nowTick; } else { tickCount += frame * duration; } return frame; }}public class Pacgame extends Panel implements Runnable { /** *//** * */ private static final long serialVersionUID = 1L; private static int WIDTH = 256; private static int HEIGHT = 224; Thread thread; //构造一个双缓冲的、可变的image VolatileImage offImage; Image bg, bg0; CGloader loader; MazeManager mzmanager; MapManager emanager; SpriteManager spmanager, chipmanager; MonsterSprite redmon, ao, pink, monster; PacSprite pac; AttractManager atMng; Timer timer; int key = 0; int score; int number1; boolean loadOK = false; boolean isAttr = false; public void init() { ClassLoader cl = getClass().getClassLoader(); Toolkit tk = Toolkit.getDefaultToolkit(); bg0 = tk.createImage(cl.getResource("main.png")); bg = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB_PRE); MediaTracker mt = new MediaTracker(this); mt.addImage(bg0, 0); try { mt.waitForID(0); } catch (Exception e) { e.printStackTrace(); } loader = new CGloader("pacchr.png", this); loader.setAlpha(0, 8); mzmanager = new MazeManager(); emanager = new MapManager(); spmanager = new SpriteManager(4); chipmanager = new SpriteManager(5); pac = new PacSprite(10, 20, loader); redmon = new RedMonster(10, 10, mzmanager, loader); redmon.setTarget(pac); spmanager.add(redmon); ao = new BlueMonster(9, 13, mzmanager, loader); ao.setTarget(pac); spmanager.add(ao); pink = new PinkMonster(10, 13, mzmanager, loader); pink.setTarget(pac); spmanager.add(pink); monster = new Monster(11, 13, mzmanager, loader); monster.setTarget(pac); spmanager.add(monster); for (int i = 0; i < 5; i++) { chipmanager.add(new ChipSprite(i * 16, 0, loader, i * 16, 130, 16, 16)); } atMng = new AttractManager(loader); timer = new Timer(this, 16); setBackground(Color.black); setSize(WIDTH, HEIGHT); offImage = createVolatileImage(WIDTH, HEIGHT); } public void paint(Graphics g) { if (! loadOK) return; do { int returnCode = offImage.validate(getGraphicsConfiguration()); if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE){ offImage = createVolatileImage(WIDTH, HEIGHT); } Graphics volG = offImage.getGraphics(); volG.drawImage (bg, 0, 0, this); spmanager.draw(volG, this); pac.draw(volG, this); chipmanager.draw(volG, this); if (isAttr) atMng.draw(volG, this); volG.dispose(); g.drawImage (offImage, 0, 0, this); } while (offImage.contentsLost()); } public void update(Graphics g) { paint(g); } public void start() { System.gc(); if (thread == null) { thread = new Thread(this); thread.start(); } } @SuppressWarnings ("deprecation") public void stop() { if (thread != null) { thread.stop(); thread = null; } } public void run() { while (true) { // MAIN LOOP score = 0; number1 = 3; int stage = 1; esaInit(); loadOK = true; while (number1 > 0) { while (gameMain(stage) == 2) { if (stage == 2) gameTheater(); stage++; number1++;// 1:DEAD 2:CLEAR esaInit(); } } // GAME OVER isAttr = true; spmanager.setShow(false); pac.setShow (false); atMng.player = true; atMng.ready = false; atMng.gameover = true; repaint(); timer.on(); key = 0; while (true) { if (key > 0) break; waitFrame(); } timer.off(); atMng.player = false; atMng.gameover = false; } } public void esaInit() { Graphics g = bg.getGraphics(); g.drawImage(bg0, 0, 0, null); g.dispose(); emanager.init(bg); } public int gameMain(int stage) { atMng.init(bg, score, number1); spmanager.init(); pac.init(); // 游戏状态 1:DEAD 2:CLEAR int gamestat = 0; int renzoku = 0; boolean ispower = false; boolean iseyesnd = false; Sprite chip; isAttr = true; int wait; if ((score == 0) && (number1 == 3)) { wait = 2000; } else { wait = 1000; } spmanager.setShow(false); pac.setShow(false); atMng.player = true; atMng.ready = true; repaint(); sleep(wait); atMng.setBattle(-- number1); spmanager.setShow(true); pac.setShow (true); atMng.player = false; atMng.ready = true; repaint(); sleep(wait); isAttr = false; int time = 0; timer.on(); int frame = 1; while (gamestat == 0) { for (int l = 0; l < frame; l++) { int score0 = score; if (time == 60 * 55) { spmanager.setNawabari(false); } else if (time == 60 * 50) { spmanager.setNawabari(true); } else if (time == 60 * 30) { spmanager.setNawabari(false); } else if (time == 60 * 25) { spmanager.setNawabari(true); } else if (time == 60 * 5) { spmanager.setNawabari(false); } spmanager.run(); MonsterSprite hitmon = spmanager.isMonsterHit(pac); if (hitmon != null) { int state = hitmon.getState(); if (state == 0) gamestat = 1; if (state == 1) { renzoku++; score = score + (1 << renzoku) * 100; chip = chipmanager.getSprite(renzoku); int x = hitmon.getX(); int y = hitmon.getY(); chip.setXY(x, y); chip.setShow(true); hitmon.setShow(false); pac.setShow(false); try { Thread.sleep(50); } catch (Exception e) { } repaint(); for (int i = 0; i < 50; i++) { try { Thread.sleep(10); } catch (Exception e) { } } chip.setShow(false); hitmon.setShow (true); pac.setShow(true); hitmon.activity(); iseyesnd = true; if (ispower) { if (iseyesnd) try { Thread.sleep(10); } catch (Exception e) { } } } } pac.setKey(key); int esa = pac.run(mzmanager, emanager); if (esa > 0) { int remain = emanager.getRemain(); score += 10; if (remain <= 0) gamestat = 2; } if (esa == 2) { redmon.state(); ao.state(); pink.state(); monster.state(); pac.powerup(); renzoku = 0; score += 40; ispower = true; } if (ispower) { if (!pac.isPower() || ((redmon.getState() != 1) && (ao.getState() != 1) && (pink.getState() != 1) && (monster .getState() != 1))) { ispower = false; } } if (iseyesnd) { if ((redmon.getState() != 2) && (ao.getState() != 2) && (pink.getState() != 2) && (monster.getState() != 2)) { iseyesnd = false; } } if (score != score0) { atMng.setScore(score); } time++; score0 = score; if (gamestat > 0) break; } // FPS LOOP END repaint(); frame = waitFrame(); System.gc(); } timer.off(); try { Thread.sleep (2000); } catch (Exception e) { } return gamestat; } public void gameTheater() { Graphics g = bg.getGraphics(); g.setColor(Color.black); g.fillRect(0, 0, WIDTH, HEIGHT); g.dispose(); int pacx = WIDTH; int p; int index = 288; spmanager.setShow(false); pac.init(); pac.setShow (true); redmon.init(); redmon.setShow(true); timer.on(); int frame = 1; int i = 0; while (i < 380) { for (int j = 0; j < frame; j++) { p = 2; switch ((i >> 2) % 4) { case 1: p += 4; break; case 3: p = 8; break; } pac.setP(p); pac.setXY(pacx--, 100); redmon.setXY(index--, 100); i++; if (i >= 360) break; } repaint(); frame = waitFrame(); } pacx = -32; redmon.state(); index = 0; i = 0; while (i < 380) { for (int j = 0; j < frame; j++) { p = 0; switch ((i >> 2) % 4) { case 1: p += 4; break; case 3: p = 8; break; } pac.setP(p); pac.setXY(pacx++, 100); redmon.setXY(index++, 100); i++; if (i >= 360) break; } repaint(); frame = waitFrame(); } timer.off(); } public void sleep(int tm) { try { Thread.sleep(tm); } catch (Exception e) { e.printStackTrace(); } } public boolean handleEvent(Event e) { switch (e.id) { case Event.KEY_PRESS: case Event.KEY_ACTION: switch (e.key) { case Event.RIGHT: key = 1; break; case Event.DOWN: key = 2; break; case Event.LEFT: key = 4; break; case Event.UP: key = 8; break; } return true; case Event.KEY_RELEASE: case Event.KEY_ACTION_RELEASE: default: } return false; } /** *//** * fps计算 * * @return */ private synchronized int waitFrame() { try { wait(); } catch (InterruptedException e) { } // 返回fps return timer.frames(); } public synchronized final void notifyFrame() { notifyAll(); } public static void main(String[] args) { final Pacgame ap = new Pacgame(); ap.setSize(WIDTH, HEIGHT); Frame frm = new Frame("Java吃豆游戏"); frm.addWindowListener(new WindowAdapter () { public void windowClosing(WindowEvent e) { ap.stop(); System.exit(0); } }); frm.addNotify(); Insets inset = frm.getInsets(); int w0 = inset.left + inset.right; int h0 = inset.top + inset.bottom; frm.add(ap); frm.setSize(ap.getWidth() + w0, ap.getHeight() + h0); frm.setResizable(false); frm.setLocationRelativeTo(null); frm.setVisible(true); ap.requestFocus(); ap.init (); ap.start(); }}
本文出自 “Java究竟怎么玩” 博客,请务必保留此出处 http://cping1982.blog.51cto.com/601635/116833
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, new
, import
, true
, false
, public
, java源码color
, ,PAC
Java小游戏源码
吃豆人java源代码、安卓吃豆人游戏源码、unity3d吃豆人源代码、吃豆人 c语言源代码、吃豆人源码,以便于您获取更多的相关知识。
时间: 2024-12-28 11:39:18