当前位置: 首页 >> 程序设计 >> 游戏开发 >> 疯狂拼图完整源代码
 

疯狂拼图完整源代码

作者:      来源:http://blog.csdn.net/norains     发表时间:2007-02-11     浏览次数:      字号:    

        CrazyPuzzle的完整源代码,整个架构已经基本打好,但因为某些原因,部分功能尚未实现,在此一并贴出来.如果各位朋友有兴趣,可自行完善相应功能.

//------------------------------
//MyGameCanvas.java
//------------------------------

package src;

import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;//西门子C65不支持,故无法以此方法播放声音,在此不插入
import java.util.*;
import java.io.*;

public class MyGameCanvas extends GameCanvas implements CommandListener 
{

    
/** 代表标题显示状态的常量 */
    
private static final short    STAGE_TITLE            = 0;
    
/** 代表关卡开始显示状态的常量 */
    
private static final short    STAGE_START            = 1;
    
/** 代表关卡显示状态的常量 */
    
private static final short    STAGE_PLAYING        = 2;
    
/** 代表游戏中显示完整图案的常量 */
    
private static final short    STAGE_PLAYING_SEE_PERFECT_PIC        = 3;
    
/** 代表关卡结束显示状态的常数 */
    
private static final short    STAGE_OVER            = 5;
    
/** 代表过关显示状态的常量 */
    
private static final short    STAGE_CLEAR            = 7;
    
/** 代表全关卡过关显示状态的常量 */
    
private static final short    ALL_STAGE_CLEAR        = 9;
    
/** 代表游戏结束的常量 */
    
private static final short    GAME_END        = 10;
    
/** 最大关卡数 */
    
private static final short    MAX_STAGE            = 5;
    
/** 正常模式常量 */
    
public static final short    MODE_NORMAL            = 1;
    
/** 极限模式常量 */
    
public static final short    MODE_UTMOST            = 2;
    
    
/** 储存现在之显示状态的变量 */
    
private short                gameState;
    
    
/** 储存游戏模式的变量 */
    
private short                gameMode;
    
    
/** 储存目前的关卡 */    
    
private short                 stageNum;    
    
    
/** 储存已过关的关卡 */    
    
private short                 stagePassedNum;    
    
    
/** 储存剩余的时间 */    
    
private long                 lastTime;
    
    
/** 储存损耗的时间,普通模式用到 */    
    
private long                 usedTime;
    
    
/** 储存单关通过的最短时间 */    
    
private long                 quicklyPassOneStageTime;
    
    
/** 游戏过程暂停状态所用的标志 */
    
private boolean                isGamePaused;
    
    
/** 储存显示的对象 */
    
private Display             display;
    
    
/** 储存音乐的对象 */
    
private Player              player;//西门子C65不支持
    
    
/** 储存主类的对象,方便进行退出之类的操作 */
    
private CrazyPuzzleMIDlet    mainMIDlet;
    
    
/**层管理*/
    
private LayerManager lm;
    
    
/**背景*/
    
private TiledLayer puzzlePic;
    
    
/**建一个画图对象*/
    
private Graphics g;
    
    
/**时间倒计时,类为继承*/
    
private TimeCounterTask timeCounter;
    
    
/** 储存各关卡谜题资讯的变量 */
    
private static final short[][] PUZZLE_MAP    = new short[][] {
        
{    //关卡1的谜题
             1,  5,  913,
             
2,  61014,
             
3,  71115,
             
4,  812,  0
        }
,
        
{    //关卡2的谜题
             4,  3,  2,  1,
             
8,  7,  6,  5,
            
121110,  9,
            
151314,  0
        }
,
        
{    //关卡3的谜题
            12,  8,  4,  1,
            
15,  9,  5,  2,
            
1310,  6,  3,
            
1411,  7,  0
        }
,
        
{    //关卡4的谜题
            14151213,
             
8,  91011,
             
4,  5,  6,  7,
             
1,  2,  3,  0
        }
,
        
{    //关卡5的谜题
            14121513,
            
1110,  9,  8,
             
7,  6,  5,  4,
             
3,  2,  1,  0
        }

    }
;
    
    
//norains:*构造函数*
    public MyGameCanvas(Display disp,CrazyPuzzleMIDlet m,short mode)
    
{
        
super(false);
        
this.display=disp;
        
this.mainMIDlet=m;
        
this.gameMode=mode;
        stageNum
=1;
        stagePassedNum
=0;
        lastTime
=0;
        usedTime
=0;
        quicklyPassOneStageTime
=0;
        isGamePaused
=false;
        g
=this.getGraphics();
        gameState
=STAGE_TITLE;
        
this.setFullScreenMode(true);//全屏幕
        
//增加命令
        
//this.addCommand(new Command("重新开始",Command.OK,1));
        this.addCommand(new Command("取消",Command.BACK,1));
        
this.addCommand(new Command("返回列表",Command.BACK,1));
        
this.addCommand(new Command("退出游戏",Command.EXIT,1));
        
this.setCommandListener(this);
        render();
    }

    
    
public void commandAction(Command command, Displayable arg1)
    
{
        
// TODO Auto-generated method stub
        String cmd=command.getLabel();
        
if(cmd.equals("重新开始"))
        
{
            
//不知为何,下面这段代码无法正常关闭音乐流,无论在模拟器还是在实体机上
            
//造成的后果是两首音乐一起播放,以致于系统变慢,无法正常游戏
            
//估计产生原因是上一首歌还没退出来,下一首就播放了
            
//关闭本节声音播放,以方便下一关播放新音乐
            gameState=STAGE_TITLE;
            
try
            
{
                player.stop();
            }

            
catch(Exception exp)
            
{}
                
    

            render();
            
        }

        
else if(cmd.equals("返回列表"))
        
{
            
if(player!=null)
            
{
                
//关闭本节声音播放
                try
                
{
                    player.stop();
                }

                
catch(Exception exp)
                
{}
            
            }

            ListChoiceScreen lcs 
=new ListChoiceScreen(display,mainMIDlet);
            display.setCurrent(lcs);
        }

        
else if(cmd.equals("退出游戏"))
        
{
            mainMIDlet.notifyDestroyed();
        }

        
else if(cmd.equals("取消"))
        
{
            
//什么都不做,返回原画面
        }

    }

    
    
//*主要是用来绘图
    public void render()
    
{
        
switch(gameState)
        
{
            
case STAGE_TITLE:
                doTitlePaint();
                
break;
            
case STAGE_START:
                doStartPaint();
                
break;
            
case STAGE_PLAYING:
                doPlayingPaint();
                
break;
            
case STAGE_PLAYING_SEE_PERFECT_PIC:
                doPlayingSeePerfectPicPaint();
                
break;
            
case STAGE_OVER:
                doStageOverPaint();
                
break;
            
case STAGE_CLEAR:
                doStageClearPaint();
                
break;
            
case ALL_STAGE_CLEAR:
                doStageAllClearPaint();
                
break;
            
case GAME_END:
                doGameEndPaint();
                
break;
        }


    }
    
    
    
//*画出关卡画面*
    private void doTitlePaint()
    
{
        
int dispWidth=this.getWidth();
        
int dispHeight=this.getHeight();
        g.setColor(
255,255,255);
        g.fillRect(
0,0,getWidth(),getHeight());
        Image img1
=creatImage("/res/ready.png");
        g.drawImage(img1,(dispWidth
-img1.getWidth())/2,(dispHeight-img1.getHeight())/2-4,0);
        Image img2
=creatImage("/res/num"+stageNum+".png");
        g.drawImage(img2,(dispWidth
-img2.getWidth())/2,(dispHeight-img1.getHeight())/2+img1.getHeight()-1,0);
        
this.flushGraphics();    
    }

    
    
//*关卡开始前
    boolean firstStart=true;//是否首次运行标志
    short musicNum=1;//因为音乐不够,以此变量做两首歌更换标志
    private void doStartPaint()
    
{    
        
//*关卡初始化
        lm=<