java 吃豆子_Java版吃豆游戏及源码

本文介绍了一个使用Java实现的吃豆人游戏。游戏包括Pacgame类和Timer类,实现了游戏逻辑、帧率控制和事件处理。游戏中包含了多个角色如PacSprite、MonsterSprite等,并涉及双缓冲技术、媒体跟踪和资源加载。游戏包含游戏循环、碰撞检测、分数系统和游戏结束状态。
摘要由CSDN通过智能技术生成

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.p_w_picpath.BufferedImage;

import java.awt.p_w_picpath.VolatileImage;

/**

*

*

* Title: LoonFramework

*

*

* Description:

*

*

* Copyright: Copyright (c) 2008

*

*

* Company: LoonFramework

*

*

* License: [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

*

*

* @author chenpeng

* @email:[email]ceponline@yahoo.com.cn[/email]

* @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;

//构造一个双缓冲的、可变的p_w_picpath

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();

}

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值