monster.java

来自「学习j2me写的,虽然在碰撞上处理的不好!但其中的技巧还是可以学习的1」· Java 代码 · 共 337 行

JAVA
337
字号
package Creature;
/*
 * Monster.java
 *
 * Created on 2005年11月19日, 上午9:09
 */

import java.lang.Math;
import java.util.Random;
import Snowball.*;
import javax.microedition.lcdui.game.Sprite;

/*
 *
 * @author 诺飞
 */
public class Monster extends Creature
{
    //引用对象
    private Ball ball;//子弹对象
    private Hero hero;//英雄对象
    
    //添加被冻结参数
    private int FreezeStartFrame;//开始冻结帧
    private int FreezeMiddleFrame;//冻结中间帧
    private int FreezeEndFrame;//冻封帧
    
    private int JumpDistance; //跳跃距离长度      
    public int HitNum;     //冻结次数
    private int Number;    //计时器
    public int TickCount;    //计时器
          
    public boolean FreezeState; //冻结状态
    public boolean RollState;  //滚动状态
             
    /** Creates a new instance of Monster */
    public Monster(int x, int y, int WalkDir, Sprite ImageL, Sprite ImageR,int WalkInterval,int JumpInterval,Hero hero ,Ball ball)
    {
        super(x, y, WalkDir, ImageL, ImageR);
        //设置参数
        this.x = x;
        this.y = y;
        this.WalkDir = WalkDir;
        this.hero = hero;
        this.ball = ball;
        
        //怪物参数
        StandFrame = 0;
        WalkFrameStart = 1;
        WalkFrameRate = 2;
        WalkFrameScale = 4;
        JumpUpFrame = 3;
        JumpDownFrame = 4;
        this.WalkInterval = WalkInterval;
        this.JumpInterval = JumpInterval;
        FeetStartL = 6;
        FeetEndL = 20;
        FeetStartR = 14;
        FeetEndR = 28;
        
        //添加冻结帧
        FreezeStartFrame = 5;
        FreezeMiddleFrame = 6;
        FreezeEndFrame = 7;
        
        //添加攻击
        AttackState = 0;
        AttackFrame = 0;
        
        //初始化成员变量
        JumpDistance = 18;
        
        //帧的宽,高
        this.frameWidth = 20;
        this.frameHeight = 30;    
        
        //状态
        State = true;        //状态
        DrawState = true;    //绘画状态
        MoveState = true;    //移动状态
        FreezeState = false; //冻实状态
        RollState = false;   //滚动状态
                
        //冻结次数
        HitNum = 0;
        Number = 0;
        
        //飞翔
        FlyVx = 10;
        FlyVy = 155;
                  
    }

    public void Process(int TickCount){      
        if(State){//怪物存活
            if( MoveState ){//怪物可以移动
                ActionProc();                    
                HitProc();
                super.Process(TickCount);  
            }
            else{ //怪物不能移动
                if( FreezeState ){//怪物被冻实成为雪球                   
                    SnowBallPro(TickCount);//处理雪球滚动变化
                    HitProc();//碰撞检测
                    FreezeFrame();//帧变化
                }           
                else{//怪物被冻但没有成为雪球
                   HitProc();//碰撞检测
                   FreezeFrame();//帧变化               
                }
                //融化
                if( Number > 150 ){//时间大于150,解冻 
                    ThawPro();//解冻
                    Number = 0;//计时器清零
                }  
            }
        }        
             
        Number++;//计数器
    }
    //动作处理
    private void ActionProc()
    {
        int NextX = 0; //下一步应该走到的x坐标
        int Rnd; //随机数
        
        //计算下一步走路到的x坐标
        switch(this.WalkDir)
        {
            case 0:
                NextX = x - this.WalkInterval;
                break;
            case 1:
                NextX = x + this.WalkInterval;
                break;
        }
        //怪物非跳跃状态下运动状态模拟
        if(this.JumpState == 0)
        {
             //走到屏幕边缘后反方向行走
            if(NextX != this.gm.CalcX(NextX, this.FeetStart, this.FeetEnd))
            {
                this.WalkDir = (this.WalkDir == 0) ? 1 : 0;
            }
            //随机运动模拟
            Rnd = Math.abs(this.rnd.nextInt() % 4);
            if(Rnd < 1) //跳跃
            {
                if(this.gm.CalcJump(x, this.FeetStart, this.FeetEnd, this.y, this.JumpDistance, this.WalkDir))
                {
                    this.Jump();
                }
            }
            else if(Rnd < 3) //是否掉落
            {
                //走到阶梯边缘判断
                if(this.gm.CalcY(NextX, FeetStart, FeetEnd, y, y) == 0)
                {
                    //反方向行走
                    this.WalkDir = (this.WalkDir == 0) ? 1 : 0;
                }
            }
        }
        //朝原来方向行走
        switch(this.WalkDir)
        {
            case 0:
                this.Walk(1);
                break;
            case 1:
                this.Walk(2);
                break;
        }
    }  
    
    /*
     *
     *   添加方法
     *
     */   
    //处理雪球动作过程
    private void SnowBallPro(int TickCount){ 
        //雪球被推动               
        if(collidesWith(hero,false)){//雪球与英雄碰撞                     
            if( !ball.State ){//没有发射子弹                     
                if(0==hero.WalkDir){
                    Walk(1);
                }
                else if(1==hero.WalkDir){
                    Walk(2);
                }
                else{
                    Walk(0);
                }                           
                super.Process(TickCount);//推动雪球动作                      
            }
            else if( !RollState ){//发射子弹
                RollState = true;//滚动状态为真   
                this.WalkDir = hero.WalkDir;
                hero.Scores += 200;
                hero.TempScores += 200; 
            }                   
        }
               
        //雪球自动滚动               
        if(RollState){
            //hero.x = x;
            //hero.y = y;
            //雪球滚动 
            WalkInterval = 18;//速率为18帧            
            super.Process(TickCount);//雪球自动滚动
            RollProc(); 
        }
    }
    
     //雪球滚动动作处理
    private void RollProc()
    {
        int NextX = 0; //下一步应该走到的x坐标
        int Rnd; //随机数
        
        //计算下一步走路到的x坐标
        switch(this.WalkDir)
        {
            case 0:
                NextX = x - this.SnowVx;
                break;
            case 1:
                NextX = x + this.SnowVx;
                break;
        }                
        //走到屏幕边缘后反方向行走
        if(NextX != this.gm.CalcX(NextX, this.FeetStart, this.FeetEnd))
        {
            this.WalkDir = (this.WalkDir == 0) ? 1 : 0;
        }         
       
        //朝原来方向行走
        switch(this.WalkDir)
        {
            case 0:
                this.Walk(1);
                break;
            case 1:
                this.Walk(2);
                break;
        }       
    }  
    
    //处理融化过程
    private void ThawPro(){ 
        if( !RollState ){
            if(0 == HitNum){//怪物移动
                MoveState = true;
            }
            HitNum--;
            if(HitNum < 0){
                HitNum = 0;
            }     
        }
    }
    
    //碰撞检测处理
    private void HitProc(){          
        //怪物与子弹碰撞且子弹状态时真
        if(collidesWith(ball,false) && ball.State){  
            //怪物状态改变 
            MoveState = false;            
            //冻结状态改变
            if( ball.State ){
                HitNum++;//雪球帧的变化
                if(HitNum >= 3){
                    HitNum = 3;
                }
            }            
            //子弹状态改变
            ball.State = false;
            ball.DrawState = false;                                             
        }
    
       //怪物与英雄碰撞且怪物没有变成雪球
        if(collidesWith(hero,false) && !FreezeState ){
            //英雄状态改变
            hero.State = false;
            hero.DrawState = false;
            
            //子弹状态改变
            ball.State = false;
            ball.DrawState = false;
            
            //游戏参数变化
            if(0 == hero.LifeNum){//游戏结束
               hero.GameOver = true;
            }
            else{//英雄复活
               hero.LifeNum--;
               hero.State = false;
               hero.HeroRelive = true;
            }            
         }                     
    }  
    
    //处理冻结帧的变化
    private void FreezeFrame(){ 
        if(HitNum == 3){//冻结次数大于等于3   雪球
            Action = FreezeEndFrame;  
            FreezeState = true;
        }
        else  if(HitNum == 2){//中间状态
            Action = FreezeMiddleFrame;
            FreezeState = false;
        }
        else if(HitNum == 1){//起始状态
            Action = FreezeStartFrame;
            FreezeState = false;
        }
    }
    
       
    //怪物被撞飞行
    public void FlyPro(){
        int Tempy = y;
        y = y - FlyVy;
        FlyVy = FlyVy - 37;
        if(y > Tempy){
            y = Tempy;
        }
    }
    
    //游戏结束
    public void GameOver(){
        State  = false;
        DrawState = false;
    }
    
}

⌨️ 快捷键说明

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