ShowGame.java
上传用户:public
上传日期:2010-01-27
资源大小:484k
文件大小:10k
源码类别:

其他游戏

开发平台:

Java

  1. package GameDisplay;
  2. import javax.microedition.lcdui.*;
  3. import javax.microedition.lcdui.game.*;
  4. import Draw.*;
  5. import java.io.*;
  6. import java.util.*;
  7. public class ShowGame
  8.     extends GameCanvas
  9.     implements Runnable,CommandListener{
  10.   private int currentx = 85;
  11.   private int currenty = 50; /////////////////玩家的初始位置坐标
  12.   private int screenw;
  13.   private int screenh; ///////////////////////屏幕宽,高
  14.   private int imgh; ///////////////////////////玩家的宽,高
  15.   private int xback;
  16.   private int yback = 0; ////*******************
  17.   private int SleepTimer = 70; /////////////////初始刷新时间
  18.   private int states = 0; /////////////////////设置变量,用于人物图片动画
  19.   private int direct = 1; /////////////////////设置玩家运动方向
  20.   private int changelife = 0;/////////////////减血量
  21.   private int setColor=30;
  22.   private int vx=4;
  23.   private int vy=10;     //////////////////玩家左右运动速度
  24.   public int mapNum;
  25.   private int mapLength=1200;/////////每关地图大小
  26.   private String str = ""; /////////////////将所在的层数显示在屏幕上
  27.   public String playerName;
  28.   public int vyback =3;   //////////yback的向上速度
  29.   public int floor = 1;   /////////////////////所下的层数
  30.   public boolean alive = false; /////////////////////设置条件判断线程是否进行
  31.   public boolean isPause=false;
  32.   Command pauseCmd;
  33.   Command goOnCmd;
  34.   Command exitCmd;
  35.   Command reStartCmd;
  36.   Random i;
  37.   public Image zhangaiImg; /////////////////////障碍物图片
  38.   private Image personImg; ///////////////////玩家图片
  39.   private Image RunningImg;
  40.   private Image RunningImg1;///////////////左右传输带图片
  41.   private Image pauseImg;  ///////////////暂停图片
  42.   private Image AlertImg;
  43.   private Image overImg;
  44.   Sprite sp;
  45.   LayerManager mL;
  46.   DrawLife life;
  47.   DrawOther drawOther;
  48.   MapBack back;
  49.   FileTool ft;
  50.   BackSprite run_right;
  51.   BackSprite run_left;
  52.   public ShowGame() {
  53.     super(true);
  54.     try {
  55.       jbInit();
  56.     }
  57.     catch (Exception e) {
  58.       e.printStackTrace();
  59.     }
  60.   }
  61.   private void jbInit() throws Exception {
  62.     try {
  63.       personImg = Image.createImage("/res/man.png");
  64.       zhangaiImg = Image.createImage("/res/zhangai.png");
  65.       RunningImg = Image.createImage("/res/right_running.png");
  66.       RunningImg1 = Image.createImage("/res/left_running.png");
  67.       pauseImg = Image.createImage("/res/pause.png");
  68.       overImg=Image.createImage("/res/over.png");
  69.     }
  70.     catch (Exception ex) {
  71.     }
  72.     i=new Random();
  73.     mapNum=1+i.nextInt(2);
  74.     screenw = this.getWidth();
  75.     screenh = this.getHeight();
  76.     imgh = personImg.getHeight();
  77.     pauseCmd  =new Command("暂停",Command.OK,0);
  78.     goOnCmd   =new Command("继续",Command.OK,0);
  79.     exitCmd   =new Command("退出",Command.EXIT,0);
  80.     reStartCmd=new Command("重新开局",Command.OK,0);
  81.     addCommand(pauseCmd);
  82.     addCommand(exitCmd);
  83.     InitBack();
  84.     life = new DrawLife();
  85.     drawOther = new DrawOther();
  86.     run_right = new BackSprite(RunningImg, 54, 10); //运输带图片
  87.     run_left = new BackSprite(RunningImg1, 54, 10); //运输带图片
  88.     sp = new Sprite(personImg, 20, 18); //玩家图片
  89.     run_right.setPosition(40, 685); ////////////////////////////////两种传输带的位置
  90.     run_left.setPosition(45, 285);
  91.     mL = new LayerManager();
  92.     mL.append(sp);
  93.     mL.append(run_left);
  94.     mL.append(run_right);
  95.     mL.append(back);
  96.     setCommandListener(this);
  97.   }
  98.   public void Initgame() { /////////////////////////加开关以控制游戏开始
  99.     this.alive = true;
  100.     Thread t = new Thread(this);
  101.     t.start();
  102.   }
  103.   public void run() {
  104.     Graphics g = this.getGraphics();
  105.     while (alive) {
  106.      g.setColor(0,0,setColor);
  107.      g.fillRect(0, 0, screenw, screenh);
  108.       run_right.Move();
  109.       run_left.Move();
  110.       Input(g);
  111.       mL.paint(g, 0, 0);
  112.       mL.setViewWindow(xback, yback, screenw, screenh);
  113.       drawOther.DrawSelf(g, screenw, screenh);
  114.       life.DrawLife(g, 0, 4, 50, 8, changelife); ///////////////画玩家的生命值
  115.       MoveMap(g); ///////////////////////////////////////地图轮回
  116.       DrawFooler(g);
  117.       hit(); //////////////////////////////////////////////检测与上钉板的碰撞
  118.       DrawPause(g);
  119.       DrawOver(g);
  120.       flushGraphics();
  121.       //System.out.println("yback:::"+yback);
  122.       try {
  123.         Thread.sleep(SleepTimer);
  124.       }
  125.       catch (InterruptedException ex) {
  126.         System.out.println("error");
  127.       }
  128.     }
  129.   }
  130.   private void InitBack() throws Exception {//////读文件加载地图
  131.     ft = new FileTool("/res/zhangai_"+mapNum+".txt");
  132.     int cx = ft.getCellx();
  133.     int cy = ft.getCelly();
  134.     int maps[] = ft.getMaps();
  135.     back = new MapBack(cx, cy, zhangaiImg, 18, 10, maps);
  136.   }
  137. private Font CustomFont() { //定制字体//////////设置为下滑线,大字号
  138.     return Font.getFont(Font.FACE_SYSTEM, Font.STYLE_UNDERLINED,
  139.                         Font.SIZE_LARGE);
  140.   }
  141.   private void DrawFooler(Graphics g){
  142.     g.setColor(237, 255, 0); ////////////////////////////////画层数所用的字体颜色
  143.     g.setFont(CustomFont()); //设置字体为“大”
  144.     str = "第" + str.valueOf(floor) + "层";
  145.     g.drawString(str,screenw,screenh-16, Graphics.TOP | Graphics.RIGHT); //画所在的层
  146. }
  147.   private void Input(Graphics g) { ///////////////////////////////////按键加检测
  148.     int gk = this.getKeyStates(); /////////////////只保留左右判断(4,6)
  149.     int speedx = 0;
  150.     if (!isPause) {
  151.  // +暂停键(5),,暂时没想好,再改
  152. //      if((gk&GameCanvas.FIRE_PRESSED)!=0)
  153. //        DrawPause(g);
  154.       if ( (gk & GameCanvas.LEFT_PRESSED) != 0) {
  155.         speedx = -vx;
  156.         direct = 2;
  157.       }
  158.       if ( (gk & GameCanvas.RIGHT_PRESSED) != 0) {
  159.         speedx = vx;
  160.         direct = 4;
  161.       }
  162.       if (gk == 0)
  163.         direct = 0;
  164.       currentx += speedx;
  165.       sp.setPosition(currentx, currenty);
  166.       if (sp.collidesWith(back, true))
  167.         currentx -= speedx;
  168.       if (currentx < 0)
  169.         currentx = -vx;
  170.       if (currentx > screenw - sp.getWidth())
  171.         currentx = screenw - sp.getWidth() + 4;
  172.       currenty += vy;
  173.       sp.setPosition(currentx, currenty);
  174.       if (sp.collidesWith(back, true)) {
  175.         int x1 = sp.getX() / 18;
  176.         int y1 = (sp.getY() + sp.getHeight()) / 10; /////////得到x,y的数组位置
  177.         int pitx = back.getCell(x1, y1); ////////////////////判断碰撞的TiledLayer的具体编号
  178.         if (direct == 0)
  179.           this.states = 0;
  180.         if (pitx == 2) {
  181.             changelife +=6 ; ///////////////////////////////////生命值减6
  182.         }
  183.         currenty -= vy;
  184.       }
  185.       sp.setPosition(currentx, currenty);
  186.       sp.setFrame(direct +(states++) % 2 ); ////////////////设置相应的按键及运动图片
  187.     }
  188.   }
  189.   public void hit() { ///////////////////////////////只能用上边界来检测,图片检测不会用
  190.      if (currenty - yback <= 20) {
  191.        changelife +=10; ///////////////撞到上钉板,生命值减5,玩家自动向下推动超过一个挡板位置
  192.        currenty += 30;
  193.      }
  194.      if (sp.collidesWith(run_right, true)) {
  195.        currenty -= vy;
  196.        currentx += vx-3;
  197.      }
  198.      if (sp.collidesWith(run_left, true)) {
  199.        currenty -=vy;
  200.        currentx += -vx+3;
  201.      }
  202.      sp.setPosition(currentx, currenty); ////////碰到运输带的位置如果解决(解决了,给初始位置加5就好了)
  203.    }
  204.   private void MoveMap(Graphics g) { //////////////////改变地图位置
  205.     yback +=vyback; ////////////////////////////如果变速的话,一定要注意yback是地图高的整数倍之一
  206.     yback = yback % mapLength; ///////////////////////////////地图的续用
  207.     if (yback % mapLength == 0) {
  208.       currenty = 30; ////////////////////////////////它也要注意,应该是玩家向下运动的速度的整数倍
  209. //      if(setColor<240)
  210. //      setColor+=30;//////////////////////////////////每过一关(五层)改变背景颜色
  211.       if (SleepTimer >= 35)
  212.         SleepTimer -= 5; //////////////////////////////用于每变一关(五层),速度变快
  213.     }
  214.     if (yback % (mapLength/5) == 0)
  215.        floor++; ///////////////////////////////////每过150像素,层数加1
  216.     if(yback % (mapLength/40) == 0&&changelife>=2)//每过30个像素,自动加血
  217.        changelife-=2;
  218.   }
  219.   private void DrawPause(Graphics g) {
  220.     if(isPause)
  221.       g.drawImage(pauseImg,60,80,0);
  222.   }
  223.   public void DrawOver(Graphics g){//////////////////////////////////////失败界面
  224.    if (life.isDead() == false ||
  225.        currenty - yback >= 177 - sp.getHeight() / 2) {
  226. //   四周画直线
  227. //      for(int i=0;i<(screenw-overImg.getWidth())/2;i+=2){
  228. //    g.setColor(255,255,255);
  229. //    g.drawRect(i,i+20,screenw-2*i,screenh-2*i);
  230. //    }
  231.     g.drawImage(overImg,(screenw-overImg.getWidth())/2,
  232.                 (screenh-overImg.getHeight())/2+5,Graphics.LEFT|Graphics.TOP);
  233.       this.removeCommand(pauseCmd);
  234.       alive = false;
  235.      addCommand(reStartCmd);
  236.      }
  237.    }
  238.   public void commandAction(Command c, Displayable d)
  239.    {
  240.      if(c==pauseCmd)
  241.      {
  242.        Control.pause();
  243.        removeCommand(pauseCmd);
  244.       addCommand(goOnCmd);
  245.     }
  246.     else if(c==exitCmd)
  247.     {
  248.       alive=false;
  249.     Control.showNameRecord();
  250.     }
  251.     else if(c==goOnCmd)
  252.     {
  253.       removeCommand(goOnCmd);
  254.       addCommand(pauseCmd);
  255.       Control.goOn();
  256.     }
  257.     else if( c==reStartCmd)
  258.     {
  259.       Control.highrecord.matches("Loser",floor);
  260.       Control.quitApp();
  261.     }
  262.   }
  263.   public void setVx(int vx) {
  264.     this.vx = vx;
  265.   }
  266.   public void setVy(int vy) {
  267.     this.vy = vy;
  268.   }
  269.   public void setVyback(int vyback) {
  270.     this.vyback = vyback;
  271.   }
  272.   public void setIsPause(boolean isPause) {
  273.     this.isPause = isPause;
  274.   }
  275.   public void setPlayerName(String playerName) {
  276.     this.playerName = playerName;
  277.   }
  278. }