📄 gamecanvas.java
字号:
*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 + -