⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamecanvas.java

📁 泡泡是一个j2me环境下开发的小游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	 *2是刷新屏幕:先控制动画,再repaint();
	 *3是逻辑检测:及时判断逻辑关系
	 **==============================**/
    protected void playGame(){
       	li.loadGameImg();  //游戏图片
       	gl=new GameLogic();  //游戏逻辑
    	scWidth=getWidth();
        scHeight=getHeight();
    	roleW=li.roleF[0].getWidth();
    	roleH=li.roleF[0].getHeight();
    	role=new Role(roleW,roleH,scWidth,scHeight);  //小人
    	endY=-li.ppImg[1].getHeight();
    	doTimer();  //线程
    }
    /*======执行线程======*/
    protected void doTimer(){
    	gameTimer=new Timer();
    	scFresh=new SCFresh();  //刷屏
    	gameTimer.schedule(scFresh,0,80);
    }

	/**==============================**
	 **            新的一关
	 **==============================**/
	private void newLevel(){
		/*======新关初始化======*/
		if(gameState==NEW_LEVEL){
			if(waitTime<12)   //关卡画面显示时间80*15ms
				waitTime++;
			else              //到时间则进入游戏画面
				initLevel();  //初始化
		}
		/*======关数检测======*/
		if (gameState == GAME) {
			if (gl.getLevel() - level > 0) {  //关数变化
				gameState=NEW_LEVEL;
				waitTime = 0;
				repaint();
			}
		}
	}
	
	/* ======初始化====== */
	private void initLevel(){
		ppNum = 0; //泡泡数
		waitTime = 0;
		sendCount = 0;  //发射系数
		clearPPArray(); //清空
		gameState = GAME;
		level = gl.getLevel(); //关数
		timeSlot = gl.getTimeSlot()/80; //泡泡发射间隔
	}
	/* ======清空泡泡数组====== */
	private void clearPPArray(){
		for(int i=0;i<pp.length;i++){
			pp[i]=null;
		}
	}

	/**==============================**
	 **            游戏结束
	 **==============================**/
	private void gameOver(){
		if(gl.lifes==0){
			gameTimer.cancel();
			gameState=GAME_OVER;
	    	repaint();
	    	//等待1.5秒钟
	    	long beginTime=System.currentTimeMillis();
	    	long endTime;
	    	do {
	            endTime=System.currentTimeMillis();
			} while (endTime-beginTime<1500);
	    	finalScore=gl.scores;  //最后得分
	    	doScore();  //开始排名
		}
	}
	
	/**==============================**
	 **            记录仓库
	 **==============================**/
	private void doScore(){
		gameState=SHOW_SCORE; //状态
    	menuLength=1;         //菜单长度,getMenu()为SHOW_SCORE
		sd=new ScoreData(finalScore);    //new记录仓库
        boolean biger=sd.compareScore(); //对比
        if(biger || sd.endId<6){
        	inputName();  //输入名字
        }else{
        	showScore();  //显示排名
        }
	}
	
	/**==============================**
	 **          填写姓名
	 **==============================**/
    protected void inputName(){  //Form
    	f.setCommandListener(this);
    	delForm();  //清除
    	f.removeCommand(menuBack);
    	f.addCommand(menuOk);
    	f.append(tf);
		f.append("你的得分: "+finalScore+" 上榜了!");
    	display.setCurrent(f);
    }

    /**======显示排名======**/
    private void showScore(){  //Canvas
    	gameState=SHOW_SCORE;
        this.setCommandListener(this);
        setCommand(menuBack);
        display.setCurrent(this);
		repaint();
    }
    
	/**==============================**
	 **           TimerTask
	 **==============================**/
	/*======刷屏======*/
	class SCFresh extends TimerTask {
		public void run(){
			if(gameState!=PAUSE){
			    newLevel();  //是否新关卡
	            gameOver();  //是否结束
			}
			if(gameState==GAME){
				if((sendCount++)%timeSlot==0)
					newPaoPao();  //发射泡泡
				role.roleAnimat(li.roleF.length);  //小人动画
				role.roleGo();  //小人行走
				hitting();      //碰撞
				delPP();        //删除
				gl.blueEffectEnd(); //结束兰色影响-2倍加分
				repaint();
			}
		}
	}

	/**==============================**
	 **           一个新泡泡
	 **==============================**/
	private void newPaoPao(){  //泡泡数组
    	int ppW=li.ppImg[1].getWidth();
    	int ppH=li.ppImg[1].getHeight();
		pp[ppNum++]=new PaoPao(role.roleX,ppW,ppH,scWidth,scHeight,gl.getLevel());
	}
	
	/**==============================**
	 **           碰撞检测
	 **==============================**/
	private void hitting(){
		for (int i = 0; i < ppNum+1; i++){
			if (pp[i] != null && role.roleAlive){
				/*------出界------*/
				if (pp[i].ppY < endY){
					gl.addScores(); //加分
					pp[i].ppAlive = false;
					break;
				/*------碰撞------*/
				}else{ //调用gl.hitTest的方法,获得碰撞确认hited和泡泡类型
					gl.hitTest(role.roleX, role.roleY, pp[i].ppX, pp[i].ppY, pp[i].ppImgNum);
					if (gl.hited){  //碰撞为真
						role.roleAlive = false;
						pp[i].ppAlive = false;
						break;
					}
				}
			}
	    }
	}
	/*======删除泡泡======*/
	private void delPP(){
		for (int i=0; i < ppNum+1; i++){
			if(pp[i]!=null && !pp[i].ppAlive){
		        for (int j = i; j < ppNum+1; j++)  //截取当前到末尾
			        pp[j] = pp[j + 1];  //向前复制
			    ppNum--;  //计数减一
			}
		}
	}

	/**==============================**
	 **           按键控制(Key)
	 **==============================**/
	protected void keyPressed(int keyCode) {  //按下
	    if (gameState == GAME) {
			//控制小人
			if (getGameAction(keyCode) == Canvas.LEFT) {
				role.roleState = role.LEFT;
				role.stand = false;
			}
			if (getGameAction(keyCode) == Canvas.RIGHT) {
				role.roleState = role.RIGHT;
				role.stand = false;
			}
		}
        //控制光标
    	if (keyCode == KEY_NUM8 || keyCode == -2)  //按下键,-2是下选择键
    	{
    	    if (indexMenuNum < menuLength-1)  //大于3则为1
    	    	indexMenuNum++;
    		else indexMenuNum=0;   //到底则为0
        	repaint();
    	}

    	if (keyCode == KEY_NUM2 || keyCode == -1)  //按上键,-1是上选择键
    	{
    		if (indexMenuNum > 0)  //小于1则为3
    			indexMenuNum--;
    		else indexMenuNum=menuLength-1;  //到顶则为最后
        	repaint();
    	}
	}
	protected void keyReleased(int keyCode) {  //松开
	    if (gameState == GAME) {
			if (getGameAction(keyCode) == Canvas.LEFT) {
				role.roleState = role.FRONT;
				role.stand = true;
			}
			if (getGameAction(keyCode) == Canvas.RIGHT) {
				role.roleState = role.FRONT;
				role.stand = true;
			}
		}
	}
	
	/**==============================** 
	 **          实现命令监听 
	 **==============================**/
    public void commandAction(Command c, Displayable s)
	{
    	if (c == menuOk)
		{
    		if (getMenu()==RESUME_GAME){ //回到游戏
    			resumeGame();
    		}
			if (getMenu()==GAME){  //新游戏
				if(gameState==PAUSE){
					gameTimer.cancel();
				}
				newGame();
			}
			if (getMenu()==HELP){ //帮助
				helpPage();
			}
			if (getMenu()==ABOUT){ //关于
				aboutPage();
			}
			if (getMenu()==EXIT){  //退出
				exit(mid);
			}
			if (getMenu()==SHOW_SCORE){  //记录
		        sd.writeToDate(tf.getString());  //将记录写入仓库
				showScore();  //
			}
		}
		if (c == menuBack)
		{
			if(getMenu()==SHOW_SCORE){  //显示排名时
				backIndex();
			}else{  //其他(帮助、关于)
				backPage();
			}
		}
		if (c == menuPause)  //暂停状态
		{
			gameState=PAUSE;
			repaint();
		}
	}

    /**======回到游戏======**/
    private void resumeGame(){
		gameState=GAME;
		setCommand(menuPause);
		repaint();
    }
    /**======新游戏======**/
    private void newGame(){
		gameState=NEW_LEVEL;
		setCommand(menuPause);
		playGame();
		repaint();
    }
    /**======退出======**/
    private void exit(MIDlet midlet){
		midlet.notifyDestroyed();
    }
    /**======回首页======**/
    private void backIndex(){
		gameState=INDEX;  //显示首页
		repaint();
    }
    /**======返回======**/
    private void backPage(){
		this.setCommandListener(this);
		setCommand(menuOk);
		display.setCurrent(this);
		repaint();
    }
	
	/**==============================**
	 **          清空Form
	 **==============================**/
	private void delForm(){
		for(int i=0;i<f.size();i++){
			f.delete(i);
		}
		for(int i=0;i<f.size();i++){
			f.delete(i);
		}
	}
    
	/**==============================**
	 **          设置命令
	 **==============================**/
    private void setCommand(Command c){
        this.removeCommand(menuPause);
        this.removeCommand(menuBack);
        this.removeCommand(menuOk);
        this.addCommand(c);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -