你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 图形图象处理与游戏编程
NetBeans 6移动插件轻松开发手机RPG游戏(七)
 
sx=sx+4; //向右移动蜘蛛
            if(sx>=getWidth()-16){sx=sx-4;
            spiderDirection=2; //方向改变为向左}
            sp.setTransform(sp.TRANS_ROT270);
        }
        sp.setPosition(sx, sy);//设置蜘蛛的新位置
        lm.paint(getGraphics(), 0, 0);//重新绘制场景
        flushGraphics(0, 0, getWidth(), getHeight());
        sp.nextFrame();//蜘蛛动画到下一帧
        Thread.sleep(80);//每隔80ms移动一次
    } catch (Exception ex) {ex.printStackTrace();}}}}
上述代码中在移动蜘蛛时如果碰到了场景边界或水池,则蜘蛛自动向反方向移动,读者在实际开发中也可以根据需要采用不同的边界处理策略。
另外,将线程类开发为MyGameCanvas类的成员内部类可以非常方便地访问MyGameCanvas类对象的资源,免去了传递引用的麻烦,简化了开发。
5.4  英雄综合功能线程
完成了前面线程的开发后,下面就需要开发功能最为复杂的英雄综合功能线程了。此线程负责使英雄按照按下键的不同移动、英雄碰到蘑菇吃掉并加分、蘑菇被吃掉后在其他位置随机产生、英雄碰到蜘蛛后游戏结束等功能:
public class HeroThread extends Thread{
  public void run(){
    while(flag){//游戏未结束时不断循环
    int span=8;//每次英雄移动的距离
int xmax=getWidth()-16;//获取英雄最大的X坐标
int ymax=getHeight()-16; //获取英雄最大的Y坐标
    try {Sprite sp=gd.getHero();
      int spx=gd.getHero().getX();//获取英雄当前X坐标
      int spy=gd.getHero().getY();//获取英雄当前Y坐标
      int spxOld=spx; int spyOld=spy;//保存坐标
      int keyState = getKeyStates();//获取按下键的键码
      switch (keyState) {//根据键码的不同执行不同任务
       case MyGameCanvas.LEFT_PRESSED://左方向键
         if(spx-span>=0){spx=spx-span;//英雄左移}
         sp.setFrameSequence(gd.HeroRight);//设置动画序列
         sp.setTransform(Sprite.TRANS_MIRROR);
        break;
        case MyGameCanvas.RIGHT_PRESSED: //右方向键
         if(spx+span<=xmax){spx=spx+span; //英雄右移}
          sp.setFrameSequence(gd.HeroRight); //设置动画序列
          sp.setTransform(Sprite.TRANS_NONE);
        break;
        case MyGameCanvas.DOWN_PRESSED: //下方向键
         if(spy+span<=ymax){spy=spy+span; //英雄下移}
          sp.setFrameSequence(gd.HeroDown); //设置动画序列
        break;
        case MyGameCanvas.UP_PRESSED: //上方向键
         if(spy-span>=0){spy=spy-span; //英雄上移}
          sp.setFrameSequence(gd.HeroUP); //设置动画序列
        break;}
        sp.setPosition(spx,spy);//设置英雄位置
        if(sp.collidesWith(gd.getBasePool(),true)) //若英雄碰到
        {sp.setPosition(spxOld,spyOld); }//水池恢复旧位置
        if(sp.collidesWith(gd.getThings(), true)){//吃蘑菇       
         spx=sp.getX();spy=sp.getY();//获取英雄XY坐标
         int row=spy/16; int col=spx/16;//计算英雄行列
         int t=gd.getThings().getCell(col,row);
         gd.getThings().setCell(col,row,0);//蘑菇消失
         if(t!=0){//若吃到蘑菇则加分
           String sc=(++countThings)*15+""; //总分数字符串
           int len=sc.length(); //获取字符串长度
           for(int i=0;i<len;i++){//循环显示每位数字
            char c=sc.charAt(len-1-i); int py=c-'0';
            gd.getScore().setCell(3-i, 0, py+1);}
           col=(int)new Date().getTime()%14;//随机获取新
           row=(int)new Date().getTime()%19;//蘑菇行列
           int xt=col*16;int yt=row*16;//计算蘑菇XY坐标
         while(((yt<=180&&yt>=100)&&(xt<=185&&xt>=90))
         ||((yt<=228&&yt>=180)&&(xt<=217&&xt>=90)))
      {//若蘑菇在水池中则要重新产生
        col=(int)new Date().getTime()%14;//重新计算蘑菇
        row=(int)new Date().getTime()%19;// XY坐标
        xt=col*16; yt=row*16; //重新计算蘑菇XY坐标
        try{Thread.sleep(1);}catch(Exception e){}}
        gd.getThings().setCell(col,row,69);//设置新蘑菇}}
      if(sp.collidesWith(gd.getSpider(),true)){
        flag=false;//若英雄碰到蜘蛛则游戏结束
//启动游戏结束闪屏线程
  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089