这是一个吃豆游戏的Java实现,具体代码较多请下载文件。
下载地址: http://download.csdn.net/source/396925
下载地址: 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:http://www.apache.org/licenses/LICENSE-2.0
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/
class Timer implements Runnable ... {
Pacgameap;
intduration;
privateThreadmyThread;
privatebooleanloopf=true;
privatelongtickCount;
publicTimer(Pacgameap,intduration)...{
this.ap=ap;
this.duration=duration;
}
publicTimer(Pacgameap)...{
this(ap,16);
}
publicvoidon()...{
myThread=newThread(this);
myThread.start();
}
publicvoidoff()...{
loopf=false;
}
publicvoidrun()...{
loopf=true;
tickCount=System.currentTimeMillis();
while(loopf)...{
try...{
Thread.sleep(duration);
}catch(Exceptione)...{
e.printStackTrace();
}
ap.notifyFrame();
}
}
publicintframes()...{
longnowTick=System.currentTimeMillis();
intframe=(int)(nowTick-tickCount)/duration;
if(frame<=0)...{
frame=1;
tickCount=nowTick;
}elseif(frame>5)...{
frame=5;
tickCount=nowTick;
}else...{
tickCount+=frame*duration;
}
returnframe;
}
}
public class Pacgame extends Panel implements Runnable ... {
/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;
privatestaticintWIDTH=256;
privatestaticintHEIGHT=224;
Threadthread;
//构造一个双缓冲的、可变的image
VolatileImageoffImage;
Imagebg,bg0;
CGloaderloader;
MazeManagermzmanager;
MapManageremanager;
SpriteManagerspmanager,chipmanager;
MonsterSpriteredmon,ao,pink,monster;
PacSpritepac;
AttractManageratMng;
Timertimer;
intkey=0;
intscore;
intnumber1;
booleanloadOK=false;
booleanisAttr=false;
publicvoidinit()...{
ClassLoadercl=getClass().getClassLoader();
Toolkittk=Toolkit.getDefaultToolkit();
bg0=tk.createImage(cl.getResource("main.png"));
bg=newBufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB_PRE);
MediaTrackermt=newMediaTracker(this);
mt.addImage(bg0,0);
try...{
mt.waitForID(0);
}catch(Exceptione)...{
e.printStackTrace();
}
loader=newCGloader("pacchr.png",this);
loader.setAlpha(0,8);
mzmanager=newMazeManager();
emanager=newMapManager();
spmanager=newSpriteManager(4);
chipmanager=newSpriteManager(5);
pac=newPacSprite(10,20,loader);
redmon=newRedMonster(10,10,mzmanager,loader);
redmon.setTarget(pac);
spmanager.add(redmon);
ao=newBlueMonster(9,13,mzmanager,loader);
ao.setTarget(pac);
spmanager.add(ao);
pink=newPinkMonster(10,13,mzmanager,loader);
pink.setTarget(pac);
spmanager.add(pink);
monster=newMonster(11,13,mzmanager,loader);
monster.setTarget(pac);
spmanager.add(monster);
for(inti=0;i<5;i++)...{
chipmanager.add(newChipSprite(i*16,0,loader,i*16,130,16,
16));
}
atMng=newAttractManager(loader);
timer=newTimer(this,16);
setBackground(Color.black);
setSize(WIDTH,HEIGHT);
offImage=createVolatileImage(WIDTH,HEIGHT);
}
publicvoidpaint(Graphicsg)...{
if(!loadOK)
return;
do...{
intreturnCode=offImage.validate(getGraphicsConfiguration());
if(returnCode==VolatileImage.IMAGE_INCOMPATIBLE)...{
offImage=createVolatileImage(WIDTH,HEIGHT);
}
GraphicsvolG=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());
}
publicvoidupdate(Graphicsg)...{
paint(g);
}
publicvoidstart()...{
System.gc();
if(thread==null)...{
thread=newThread(this);
thread.start();
}
}
@SuppressWarnings("deprecation")
publicvoidstop()...{
if(thread!=null)...{
thread.stop();
thread=null;
}
}
publicvoidrun()...{
while(true)...{
//MAINLOOP
score=0;
number1=3;
intstage=1;
esaInit();
loadOK=true;
while(number1>0)...{
while(gameMain(stage)==2)...{
if(stage==2)
gameTheater();
stage++;
number1++;//1:DEAD2:CLEAR
esaInit();
}
}
//GAMEOVER
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;
}
}
publicvoidesaInit()...{
Graphicsg=bg.getGraphics();
g.drawImage(bg0,0,0,null);
g.dispose();
emanager.init(bg);
}
publicintgameMain(intstage)...{
atMng.init(bg,score,number1);
spmanager.init();
pac.init();
//游戏状态1:DEAD2:CLEAR
intgamestat=0;
intrenzoku=0;
booleanispower=false;
booleaniseyesnd=false;
Spritechip;
isAttr=true;
intwait;
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;
inttime=0;
timer.on();
intframe=1;
while(gamestat==0)...{
for(intl=0;l<frame;l++)...{
intscore0=score;
if(time==60*55)...{
spmanager.setNawabari(false);
}elseif(time==60*50)...{
spmanager.setNawabari(true);
}elseif(time==60*30)...{
spmanager.setNawabari(false);
}elseif(time==60*25)...{
spmanager.setNawabari(true);
}elseif(time==60*5)...{
spmanager.setNawabari(false);
}
spmanager.run();
MonsterSpritehitmon=spmanager.isMonsterHit(pac);
if(hitmon!=null)...{
intstate=hitmon.getState();
if(state==0)
gamestat=1;
if(state==1)...{
renzoku++;
score=score+(1<<renzoku)*100;
chip=chipmanager.getSprite(renzoku);
intx=hitmon.getX();
inty=hitmon.getY();
chip.setXY(x,y);
chip.setShow(true);
hitmon.setShow(false);
pac.setShow(false);
try...{
Thread.sleep(50);
}catch(Exceptione)...{
}
repaint();
for(inti=0;i<50;i++)...{
try...{
Thread.sleep(10);
}catch(Exceptione)...{
}
}
chip.setShow(false);
hitmon.setShow(true);
pac.setShow(true);
hitmon.activity();
iseyesnd=true;
if(ispower)...{
if(iseyesnd)
try...{
Thread.sleep(10);
}catch(Exceptione)...{
}
}
}
}
pac.setKey(key);
intesa=pac.run(mzmanager,emanager);
if(esa>0)...{
intremain=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;
}//FPSLOOPEND
repaint();
frame=waitFrame();
System.gc();
}
timer.off();
try...{
Thread.sleep(2000);
}catch(Exceptione)...{
}
returngamestat;
}
publicvoidgameTheater()...{
Graphicsg=bg.getGraphics();
g.setColor(Color.black);
g.fillRect(0,0,WIDTH,HEIGHT);
g.dispose();
intpacx=WIDTH;
intp;
intindex=288;
spmanager.setShow(false);
pac.init();
pac.setShow(true);
redmon.init();
redmon.setShow(true);
timer.on();
intframe=1;
inti=0;
while(i<380)...{
for(intj=0;j<frame;j++)...{
p=2;
switch((i>>2)%4)...{
case1:
p+=4;
break;
case3:
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(intj=0;j<frame;j++)...{
p=0;
switch((i>>2)%4)...{
case1:
p+=4;
break;
case3:
p=8;
break;
}
pac.setP(p);
pac.setXY(pacx++,100);
redmon.setXY(index++,100);
i++;
if(i>=360)
break;
}
repaint();
frame=waitFrame();
}
timer.off();
}
publicvoidsleep(inttm)...{
try...{
Thread.sleep(tm);
}catch(Exceptione)...{
e.printStackTrace();
}
}
publicbooleanhandleEvent(Evente)...{
switch(e.id)...{
caseEvent.KEY_PRESS:
caseEvent.KEY_ACTION:
switch(e.key)...{
caseEvent.RIGHT:
key=1;
break;
caseEvent.DOWN:
key=2;
break;
caseEvent.LEFT:
key=4;
break;
caseEvent.UP:
key=8;
break;
}
returntrue;
caseEvent.KEY_RELEASE:
caseEvent.KEY_ACTION_RELEASE:
default:
}
returnfalse;
}
/***//**
*fps计算
*
*@return
*/
privatesynchronizedintwaitFrame()...{
try...{
wait();
}catch(InterruptedExceptione)...{
}
//返回fps
returntimer.frames();
}
publicsynchronizedfinalvoidnotifyFrame()...{
notifyAll();
}
publicstaticvoidmain(String[]args)...{
finalPacgameap=newPacgame();
ap.setSize(WIDTH,HEIGHT);
Framefrm=newFrame("Java吃豆游戏");
frm.addWindowListener(newWindowAdapter()...{
publicvoidwindowClosing(WindowEvente)...{
ap.stop();
System.exit(0);
}
});
frm.addNotify();
Insetsinset=frm.getInsets();
intw0=inset.left+inset.right;
inth0=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();
}
}
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:http://www.apache.org/licenses/LICENSE-2.0
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/
class Timer implements Runnable ... {
Pacgameap;
intduration;
privateThreadmyThread;
privatebooleanloopf=true;
privatelongtickCount;
publicTimer(Pacgameap,intduration)...{
this.ap=ap;
this.duration=duration;
}
publicTimer(Pacgameap)...{
this(ap,16);
}
publicvoidon()...{
myThread=newThread(this);
myThread.start();
}
publicvoidoff()...{
loopf=false;
}
publicvoidrun()...{
loopf=true;
tickCount=System.currentTimeMillis();
while(loopf)...{
try...{
Thread.sleep(duration);
}catch(Exceptione)...{
e.printStackTrace();
}
ap.notifyFrame();
}
}
publicintframes()...{
longnowTick=System.currentTimeMillis();
intframe=(int)(nowTick-tickCount)/duration;
if(frame<=0)...{
frame=1;
tickCount=nowTick;
}elseif(frame>5)...{
frame=5;
tickCount=nowTick;
}else...{
tickCount+=frame*duration;
}
returnframe;
}
}
public class Pacgame extends Panel implements Runnable ... {
/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;
privatestaticintWIDTH=256;
privatestaticintHEIGHT=224;
Threadthread;
//构造一个双缓冲的、可变的image
VolatileImageoffImage;
Imagebg,bg0;
CGloaderloader;
MazeManagermzmanager;
MapManageremanager;
SpriteManagerspmanager,chipmanager;
MonsterSpriteredmon,ao,pink,monster;
PacSpritepac;
AttractManageratMng;
Timertimer;
intkey=0;
intscore;
intnumber1;
booleanloadOK=false;
booleanisAttr=false;
publicvoidinit()...{
ClassLoadercl=getClass().getClassLoader();
Toolkittk=Toolkit.getDefaultToolkit();
bg0=tk.createImage(cl.getResource("main.png"));
bg=newBufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB_PRE);
MediaTrackermt=newMediaTracker(this);
mt.addImage(bg0,0);
try...{
mt.waitForID(0);
}catch(Exceptione)...{
e.printStackTrace();
}
loader=newCGloader("pacchr.png",this);
loader.setAlpha(0,8);
mzmanager=newMazeManager();
emanager=newMapManager();
spmanager=newSpriteManager(4);
chipmanager=newSpriteManager(5);
pac=newPacSprite(10,20,loader);
redmon=newRedMonster(10,10,mzmanager,loader);
redmon.setTarget(pac);
spmanager.add(redmon);
ao=newBlueMonster(9,13,mzmanager,loader);
ao.setTarget(pac);
spmanager.add(ao);
pink=newPinkMonster(10,13,mzmanager,loader);
pink.setTarget(pac);
spmanager.add(pink);
monster=newMonster(11,13,mzmanager,loader);
monster.setTarget(pac);
spmanager.add(monster);
for(inti=0;i<5;i++)...{
chipmanager.add(newChipSprite(i*16,0,loader,i*16,130,16,
16));
}
atMng=newAttractManager(loader);
timer=newTimer(this,16);
setBackground(Color.black);
setSize(WIDTH,HEIGHT);
offImage=createVolatileImage(WIDTH,HEIGHT);
}
publicvoidpaint(Graphicsg)...{
if(!loadOK)
return;
do...{
intreturnCode=offImage.validate(getGraphicsConfiguration());
if(returnCode==VolatileImage.IMAGE_INCOMPATIBLE)...{
offImage=createVolatileImage(WIDTH,HEIGHT);
}
GraphicsvolG=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());
}
publicvoidupdate(Graphicsg)...{
paint(g);
}
publicvoidstart()...{
System.gc();
if(thread==null)...{
thread=newThread(this);
thread.start();
}
}
@SuppressWarnings("deprecation")
publicvoidstop()...{
if(thread!=null)...{
thread.stop();
thread=null;
}
}
publicvoidrun()...{
while(true)...{
//MAINLOOP
score=0;
number1=3;
intstage=1;
esaInit();
loadOK=true;
while(number1>0)...{
while(gameMain(stage)==2)...{
if(stage==2)
gameTheater();
stage++;
number1++;//1:DEAD2:CLEAR
esaInit();
}
}
//GAMEOVER
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;
}
}
publicvoidesaInit()...{
Graphicsg=bg.getGraphics();
g.drawImage(bg0,0,0,null);
g.dispose();
emanager.init(bg);
}
publicintgameMain(intstage)...{
atMng.init(bg,score,number1);
spmanager.init();
pac.init();
//游戏状态1:DEAD2:CLEAR
intgamestat=0;
intrenzoku=0;
booleanispower=false;
booleaniseyesnd=false;
Spritechip;
isAttr=true;
intwait;
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;
inttime=0;
timer.on();
intframe=1;
while(gamestat==0)...{
for(intl=0;l<frame;l++)...{
intscore0=score;
if(time==60*55)...{
spmanager.setNawabari(false);
}elseif(time==60*50)...{
spmanager.setNawabari(true);
}elseif(time==60*30)...{
spmanager.setNawabari(false);
}elseif(time==60*25)...{
spmanager.setNawabari(true);
}elseif(time==60*5)...{
spmanager.setNawabari(false);
}
spmanager.run();
MonsterSpritehitmon=spmanager.isMonsterHit(pac);
if(hitmon!=null)...{
intstate=hitmon.getState();
if(state==0)
gamestat=1;
if(state==1)...{
renzoku++;
score=score+(1<<renzoku)*100;
chip=chipmanager.getSprite(renzoku);
intx=hitmon.getX();
inty=hitmon.getY();
chip.setXY(x,y);
chip.setShow(true);
hitmon.setShow(false);
pac.setShow(false);
try...{
Thread.sleep(50);
}catch(Exceptione)...{
}
repaint();
for(inti=0;i<50;i++)...{
try...{
Thread.sleep(10);
}catch(Exceptione)...{
}
}
chip.setShow(false);
hitmon.setShow(true);
pac.setShow(true);
hitmon.activity();
iseyesnd=true;
if(ispower)...{
if(iseyesnd)
try...{
Thread.sleep(10);
}catch(Exceptione)...{
}
}
}
}
pac.setKey(key);
intesa=pac.run(mzmanager,emanager);
if(esa>0)...{
intremain=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;
}//FPSLOOPEND
repaint();
frame=waitFrame();
System.gc();
}
timer.off();
try...{
Thread.sleep(2000);
}catch(Exceptione)...{
}
returngamestat;
}
publicvoidgameTheater()...{
Graphicsg=bg.getGraphics();
g.setColor(Color.black);
g.fillRect(0,0,WIDTH,HEIGHT);
g.dispose();
intpacx=WIDTH;
intp;
intindex=288;
spmanager.setShow(false);
pac.init();
pac.setShow(true);
redmon.init();
redmon.setShow(true);
timer.on();
intframe=1;
inti=0;
while(i<380)...{
for(intj=0;j<frame;j++)...{
p=2;
switch((i>>2)%4)...{
case1:
p+=4;
break;
case3:
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(intj=0;j<frame;j++)...{
p=0;
switch((i>>2)%4)...{
case1:
p+=4;
break;
case3:
p=8;
break;
}
pac.setP(p);
pac.setXY(pacx++,100);
redmon.setXY(index++,100);
i++;
if(i>=360)
break;
}
repaint();
frame=waitFrame();
}
timer.off();
}
publicvoidsleep(inttm)...{
try...{
Thread.sleep(tm);
}catch(Exceptione)...{
e.printStackTrace();
}
}
publicbooleanhandleEvent(Evente)...{
switch(e.id)...{
caseEvent.KEY_PRESS:
caseEvent.KEY_ACTION:
switch(e.key)...{
caseEvent.RIGHT:
key=1;
break;
caseEvent.DOWN:
key=2;
break;
caseEvent.LEFT:
key=4;
break;
caseEvent.UP:
key=8;
break;
}
returntrue;
caseEvent.KEY_RELEASE:
caseEvent.KEY_ACTION_RELEASE:
default:
}
returnfalse;
}
/***//**
*fps计算
*
*@return
*/
privatesynchronizedintwaitFrame()...{
try...{
wait();
}catch(InterruptedExceptione)...{
}
//返回fps
returntimer.frames();
}
publicsynchronizedfinalvoidnotifyFrame()...{
notifyAll();
}
publicstaticvoidmain(String[]args)...{
finalPacgameap=newPacgame();
ap.setSize(WIDTH,HEIGHT);
Framefrm=newFrame("Java吃豆游戏");
frm.addWindowListener(newWindowAdapter()...{
publicvoidwindowClosing(WindowEvente)...{
ap.stop();
System.exit(0);
}
});
frm.addNotify();
Insetsinset=frm.getInsets();
intw0=inset.left+inset.right;
inth0=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();
}
}