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 + -
显示快捷键?