⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 character.java

📁 很不错的泡泡堂手机游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * 创建日期 2007-3-17
 * @author caipiz
 */
package com.cpiz.poptang;

import java.io.IOException;
import java.util.Random;

import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;


public class Character extends Sprite
{
    Map map = Game.map;
    int width;
    int height;
    int type = Character.HERO;
    int status = Character.BORN;
    int speed = 3;// 行动速度
    int bombsNum = 100;// 可用的泡泡数目
    int power = 3;// 泡泡能量
    int x = 0, y = 0;// 精灵坐标位置,以左上角为基准
    int oldX = 0, oldY = 0;// 精灵上一次位置
    int dir = FACE_SOUTH;// 上一次精灵方向
    boolean isAlive = true;// 是否活着
    boolean isEnabled = true;// 是否有效
    Random rand = null;

    /**
     * 角色年龄,角色大于一定年龄后,停止出生动作
     */
    int age = 0;
    
    /**
     * 已停止时间,该时间超过一定后人物进入休息状态,做出休息动作
     */
    int stayTime = 0;
    
    /**
     * 已死亡时间
     */
    int deadTime = 0;
    
    /**
     * 构造器
     * @param spriteImage 精灵Image
     * @param row 精灵出生时所在行
     * @param col 精灵出生时所在列
     */
    private Character(int type, Image spriteImage, int row, int col)
    {
        super(spriteImage, PopTang.HERO_WIDTH, PopTang.HERO_HEIGHT);
        setCell(row, col);
        rand = new Random();
        this.type = type;
    }
    
    /**
     * 创建精灵
     * @param characterType 精灵类型
     * @param row 精灵出生时所在行
     * @param col 精灵出生时所在列
     * @return 精灵对象
     */
    public static Character createCharacter(int characterType, int row, int col)
    {
        Image imgCharacter = null;
        try
        {
            switch(characterType)
            {
            case Character.HERO:
                imgCharacter = Image.createImage(PopTang.IMAGE_SRC_HERO);
                break;
            case Character.ENEMY:
                imgCharacter = Image.createImage(PopTang.IMAGE_SRC_ENEMY);
                break;
            default:
                break;
            }
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
        return new Character(characterType, imgCharacter, row, col);
    }
    
    /**
     * 设置精灵的坐标位置
     * @param row 行索引,从0开始
     * @param col 列索引,从0开始
     */
    private void setCell(int row, int col)
    {
        x = col * PopTang.CELL_WIDTH;
        y = (row + 1) * PopTang.CELL_HEIGHT - getHeight();
        setPosition(x, y);
    }
    
    /**
     * 获得角色所在格的行索引
     * @return 角色所在行
     */
    public int getRow()
    {
        return getRow(getBottomY(y) - PopTang.CELL_HEIGHT / 2);
    }
    
    /**
     * 获得角色所在格的列索引
     * @return 角色所在行
     */
    public int getCol()
    {
        return getCol(x + PopTang.CELL_WIDTH / 2);
    }
    
    /**
     * 获得精灵实际Y坐标值(用于碰撞检测)
     * @param y 精灵顶部坐标Y值
     * @return 实际顶部Y坐标
     */
    private int getRefY(int y)
    {
        return getBottomY(y) + 1 - PopTang.CELL_HEIGHT;
    }
    
    /**
     * 获得精灵底部Y坐标值(用于碰撞检测)
     * @param y 精灵左上角坐标Y值
     * @return 底部Y坐标
     */
    private int getBottomY(int y)
    {
        return y + getHeight() - 1;
    }
    
    /**
     * 获得精灵右边缘X坐标值(用于碰撞检测)
     * @param x 精灵左上角坐标Y值
     * @return 右边缘Y坐标
     */
    private int getRightX(int x)
    {
        return x + getWidth() - 1;
    }
    
    /**
     * 获得Y坐标所在行
     * @param y Y轴坐标值
     * @return 像素所在行
     */
    private int getRow(int y)
    {
        return y / PopTang.CELL_HEIGHT;
    }
    
    /**
     * 获得X坐标所在列
     * @param x X轴坐标值
     * @return 像素所在行
     */
    private int getCol(int x)
    {
        return x / PopTang.CELL_WIDTH;
    }
    
    /**
     * 人工智能动作
     */
    private void aiAction()
    {
        oldX = x;
        oldY = y;
        
        walk(dir);
        
        if ((x == oldX && y == oldY) || age % (rand.nextInt(50) + 1) == 0)
        {
            int oldDir = dir;
            do
            {
                dir = rand.nextInt(4) + 2;
            }
            while(dir == oldDir);
            //walk(oldDir);
        }
    }
    
    /**
     * 拾获道具
     * @param tool 道具
     */
    private void pickUpTool(int tool)
    {
        switch(tool)
        {
        case Map.TOOL_BOMB:
            bombsNum++;
            break;
        case Map.TOOL_POWER:
            power++;
            break;
        case Map.TOOL_SPEED:
            speed++;
            break;
        case Map.TOOL_GOLD_COIN:
            Game.score += PopTang.GOLD_COIN_SCORE;
            break;
        default:
            break;
        }
    }
    
    /**
     * 更新精灵状态<br>
     * 检测是否被炸死,道具拾获
     */
    public void update()
    {
        if(type == Character.ENEMY)
        {
            aiAction();
        }
        
        int col = getCol();
        int row = getRow();
        
        if (age < 10000)
        {
            age++;
        }
        else
        {
            age = 100;
        }
        
        if (isAlive)
        {
            // 拾获道具
            int tool = map.getBombsAndToolsLayer().getCell(col, row);  
            if (tool >= Map.TOOL_BOMB)
            {
                pickUpTool(tool);
                map.getBombsAndToolsLayer().setCell(col, row, 0);
            }
            
            // 检测所在单元格是否致命
            if(map.hasFeature(row, col, Map.DEADLY))
            {
                isAlive = false;
                return;
            }
            
            // 由出生状态转静止状态
            if(status == Character.BORN && age > PopTang.BORN_TIME)
            {
                status = Character.FACE_SOUTH;
                setFrame(Character.FACE_SOUTH * 5);
                return;
            }
            
            // 出生状态
            if (status == Character.BORN)
            {

⌨️ 快捷键说明

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