📄 mscreen.java~5~
字号:
movis_defin[i][MOVI_DEFIN_LINKY] = in.read();
movis_defin[i][MOVI_DEFIN_FRAMW] = movis_image[i].getWidth() / movis_defin[i][MOVI_DEFIN_FRAME];
movis_defin[i][MOVI_DEFIN_FRAMH] = movis_image[i].getHeight();
}
}catch(Exception e){}
}
private final void movi_load(InputStream in) throws IOException {
for (int i = in.read() - 1; i >= 0; i--)
movi_create(in.read(), readByte(in) * 8, readByte(in) * 8, 0, 0, 0, 0, -1, MOVI_DEATH_EVER);
}
private final void movi_create(int movi_index, int pos_x, int pos_y, int spd_x,
int spd_y, int accelx, int accely, int direct, int death){
int[] movi = new int[MOVI_COUNT];
movi[MOVI_DEFID] = movi_index;
movi[MOVI_POS_X] = pos_x;
movi[MOVI_POS_Y] = pos_y;
movi[MOVI_FRAML] = movis_defin[movi_index][MOVI_DEFIN_LINKX];
movi[MOVI_FRAMT] = movis_defin[movi_index][MOVI_DEFIN_LINKY];
movi[MOVI_FRAMR] = movis_defin[movi_index][MOVI_DEFIN_FRAMW] - movis_defin[movi_index][MOVI_DEFIN_LINKX];
movi[MOVI_FRAMB] = movis_defin[movi_index][MOVI_DEFIN_FRAMH] - movis_defin[movi_index][MOVI_DEFIN_LINKY];
movi[MOVI_FACEW] = movis_image[movi_index].getWidth();
movi[MOVI_FRAMH] = movis_image[movi_index].getHeight();
movi[MOVI_FRAME] = movis_defin[movi_index][MOVI_DEFIN_FRAME];
movi[MOVI_FRAMW] = movis_defin[movi_index][MOVI_DEFIN_FRAMW];
movi[MOVI_INDEX] = 0;
movi[MOVI_SPD_X] = spd_x;
movi[MOVI_SPD_Y] = spd_y;
movi[MOVI_ACCEX] = accelx;
movi[MOVI_ACCEY] = accely;
movi[MOVI_DIREC] = direct;
movi[MOVI_DEATH] = death;
movis.addElement(movi);
}
private final void movi_run(){
for(int i = movis.size() - 1; i >= 0; i--){
int[] movi = (int[])movis.elementAt(i);
int movi_l = movi[MOVI_POS_X] - ((movi[MOVI_DIREC] == -1)? movi[MOVI_FRAML]: movi[MOVI_FRAMR]);
int movi_t = movi[MOVI_POS_Y] - movi[MOVI_FRAMT];
int movi_r = movi[MOVI_POS_X] + ((movi[MOVI_DIREC] == -1)? movi[MOVI_FRAMR]: movi[MOVI_FRAML]);
int movi_b = movi[MOVI_POS_Y] + movi[MOVI_FRAMB];
switch(movi[MOVI_DEATH]){
case MOVI_DEATH_ONCE: if(movi[MOVI_INDEX] == movi[MOVI_FRAME] - 1) movis.removeElementAt(i); break;
case MOVI_DEATH_SIDE: if(!visible(movi_l, movi_t, movi_r, movi_b)) movis.removeElementAt(i); break;
}
movi[MOVI_POS_X] += movi[MOVI_SPD_X] / 100;
movi[MOVI_POS_Y] += movi[MOVI_SPD_Y] / 100;
movi[MOVI_SPD_X] += movi[MOVI_ACCEX];
movi[MOVI_SPD_Y] += movi[MOVI_ACCEY];
movi[MOVI_INDEX] = (movi[MOVI_INDEX] < movi[MOVI_FRAME] - 1) ? movi[MOVI_INDEX] + 1: 0;
}
}
private final void movi_draw(){
//画动画物体
for(int i = movis.size() - 1; i >= 0; i--){
int[] movi = (int[])movis.elementAt(i);
int movi_l = movi[MOVI_POS_X] - ((movi[MOVI_DIREC] == -1)? movi[MOVI_FRAML]: movi[MOVI_FRAMR]);
int movi_t = movi[MOVI_POS_Y] - movi[MOVI_FRAMT];
int movi_r = movi[MOVI_POS_X] + ((movi[MOVI_DIREC] == -1)? movi[MOVI_FRAMR]: movi[MOVI_FRAML]);
int movi_b = movi[MOVI_POS_Y] + movi[MOVI_FRAMB];
int draw_x = (movi[MOVI_DIREC] == -1) ?
movi_l - movi[MOVI_INDEX] * movi[MOVI_FRAMW]:
movi_r + movi[MOVI_INDEX] * movi[MOVI_FRAMW] - movi[MOVI_FACEW];
if(visible(movi_l, movi_t, movi_r, movi_b)){
clipRect(movi_l, movi_t, movi[MOVI_FRAMW], movi[MOVI_FRAMH]);
g.drawImage(movis_image[movi[MOVI_DEFID]],
draw_x - position_x, movi_t - position_y,
(movi[MOVI_DIREC] == -1)? 0: 0x2000);
}
}
}
/**********************************************
* 转换图形翻转属性
* @param rotate int 地图中用到的翻转数据
* @return int nokia j2me api中的图形翻转数据
**********************************************/
private int translateRotate(int rotate){
switch(rotate){
case 1: return 0x2000;
case 2: return 0x4000;
case 3: return 90;
case 4: return 180;
case 5: return 270;
default:return 0;
}
}
//****************************************************************************
// 游戏中的文字提示信息
//****************************************************************************
private String message_prompt = null;
private final void message_prompt(String msg){
message_prompt = msg;
refresh();
}
private final void message_prompt_show(){
if(message_prompt == null) return;
drawframe(15, 54, screen_w - 15, 74);
g.setColor(0xFFFFFF);
g.drawString(message_prompt, screen_w >> 1, 57, 0x11);
}
/**********************************************
* 主角被怪物攻击
* @param attack 怪物的攻击力
**********************************************/
private final void hero_hitted(int attack){
if(hero_cflash > 0) return;
if(attack <= 0) return;
hero_anima -= attack;
hero_cflash = 10;
if(hero_anima <= 0){
hero_setfirestatus(STATUS_FIRE_DEATHS);
hero_setaction(HERO_ACTION_SHOTDEAD);
}
}
/**********************************************
* 判断主角是否和一个矩形发生碰撞
* @param x int
* @param y int
* @param r int
* @param b int
* @return boolean
**********************************************/
private final boolean hero_nexus(int x, int y, int r, int b) {
int[] fram = heroaction[hero_action][hero_cframe];
return !((x > hero_pos_x + fram[HERO_FRAME_RECTW]) ||
(r < hero_pos_x - fram[HERO_FRAME_RECTW]) ||
(y > hero_pos_y + hero_frectb) ||
(b < hero_pos_y - fram[HERO_FRAME_RECTT]));
}
//****************************************************************************
/** @todo: 主角 */
//****************************************************************************
private Image hero_face; //当前主角图形资源
private int hero_pos_x; //主角位置X
private int hero_pos_y; //主角位置Y
private int hero_old_x; //主角上次站立位置X
private int hero_old_y; //主角上次站立位置Y
private int hero_anima = 50; //生命值
private int hero_attak = 10;
private int hero_being = 3; //生命次数
private int hero_score = 0; //得分
private int hero_spd_y = 0; //垂直速度 速度数值为实际位移量的10倍
private int hero_style = 0; //主角的样式:人物,飞机,坦克
private int hero_shot_type = 0; //子弹类型
private int hero_shotcount = 0; //子弹数量
private int hero_shottally = 0; //子弹延时计数
private int hero_bombcount = 0; //炸弹数量
private int hero_bombtally = 0; //炸弹投掷延时
private int HERO_BOMBTALLY = 5; //投弹延迟常数
private int hero_add_being = 0; //根据分数添加的人数
private boolean hero_death = false; //如果主角完成了死亡动作 该标记被设为true 用于新出现主角
private final int SHOT_TYPE_TOMM = 0;//机枪
private final int SHOT_TYPE_MISS = 1;//导弹
private int SPEED_HORZ_ACCEL = 60; //水平方向加速度
private int SPEED_VERT_ACCEL = 50; //垂直方向加速度
private int SPEED_VERT_START = -180; //起跳初速度
private int SPEED_VERT_LIMIT = 200; //垂直方向最大速度
private int hero_direct = 1; //主角动作的方向 -1:向左 1:向右
private int hero_cflash;
private int hero_status;
private int hero_action;
private int hero_cframe;
private int hero_frectw;
private int hero_frectt;
private int hero_fire_count = 0;
private final int hero_frectb = 11;
//主角状态常数 分两部分 字节低位大状态 高位字节小状态
private final int STATUS_MAIN = 0xF000;
private final int STATUS_MAIN_STAND = 0x0000;
private final int STATUS_MAIN_SQUAT = 0x1000;
private final int STATUS_MAIN_INAIR = 0x2000;
private final int STATUS_FIRE = 0xF00;
private final int STATUS_FIRE_NORMAL = 0x000;
private final int STATUS_FIRE_ATTACK = 0x100;
private final int STATUS_FIRE_SWORDS = 0x200;
private final int STATUS_FIRE_THROWS = 0x300;
private final int STATUS_FIRE_DEATHS = 0x400;
private final int STATUS_MOVE = 0xF0;
private final int STATUS_MOVE_REST = 0x00;
private final int STATUS_MOVE_MOVE = 0x10;
private final int STATUS_MOVE_RISE = 0x20;
private final int STATUS_MOVE_LEAP = 0x30;
private final int STATUS_MOVE_FALL = 0x40;
private final int STATUS_PORT = 0xF;
private final int STATUS_PORT_BASE = 0x0;
private final int STATUS_PORT_OVER = 0x1;
private final int STATUS_PORT_DOWN = 0x2;
//主角动作数据 第一维是表示动作索引 第二维表示帧索引 第三维帧定义
private int[][][] heroaction;
private final int HERO_ACTION_STANREST = 0;
private final int HERO_ACTION_STANMOVE = 1;
private final int HERO_ACTION_STANFALCHION = 2;
private final int HERO_ACTION_STANTOSSBOMB = 3;
private final int HERO_ACTION_STANFIREBASE = 4;
private final int HERO_ACTION_STANFIREOVER = 5;
private final int HERO_ACTION_STANPORTOVER = 6;
private final int HERO_ACTION_MOVEFALCHION = 7;
private final int HERO_ACTION_MOVETOSSBOMB = 8;
private final int HERO_ACTION_MOVEFIREBASE = 9;
private final int HERO_ACTION_MOVEFIREOVER = 10;
private final int HERO_ACTION_MOVEPORTOVER = 11;
private final int HERO_ACTION_SQUAREST = 12;
private final int HERO_ACTION_SQUAMOVE = 13;
private final int HERO_ACTION_SQUAFALCHION = 14;
private final int HERO_ACTION_SQUATOSSBOMB = 15;
private final int HERO_ACTION_SQUAFIRE = 16;
private final int HERO_ACTION_JUMPRISE = 17;
private final int HERO_ACTION_RISEFALCHION = 18;
private final int HERO_ACTION_RISETOSSBOMB = 19;
private final int HERO_ACTION_RISEFIREBASE = 20;
private final int HERO_ACTION_RISEFIREOVER = 21;
private final int HERO_ACTION_RISEFIREDOWN = 22;
private final int HERO_ACTION_RISEPORTOVER = 23;
private final int HERO_ACTION_RISEPORTDOWN = 24;
private final int HERO_ACTION_JUMPLEAP = 25;
private final int HERO_ACTION_LEAPFALCHION = 26;
private final int HERO_ACTION_LEAPTOSSBOMB = 27;
private final int HERO_ACTION_LEAPFIREBASE = 28;
private final int HERO_ACTION_LEAPFIREOVER = 29;
private final int HERO_ACTION_LEAPFIREDOWN = 30;
private final int HERO_ACTION_LEAPPORTOVER = 31;
private final int HERO_ACTION_LEAPPORTDOWN = 32;
private final int HERO_ACTION_JUMPFALL = 33;
private final int HERO_ACTION_FALLFALCHION = 34;
private final int HERO_ACTION_FALLTOSSBOMB = 35;
private final int HERO_ACTION_FALLFIREBASE = 36;
private final int HERO_ACTION_FALLFIREOVER = 37;
private final int HERO_ACTION_FALLFIREDOWN = 38;
private final int HERO_ACTION_FALLPORTOVER = 39;
private final int HERO_ACTION_FALLPORTDOWN = 40;
private final int HERO_ACTION_SHOTDEAD = 41;
private final int HERO_ACTION_BOMBDEAD = 42;
private final int HERO_ACTION_VICTORY = 43;
private final int HERO_ACTION_SCARPSIDE = 44;
//主角每一帧包括34个数据 前面6个是 帧的作用区和攻击区
//后面的数据每7个一组 每一组表示一个图块数据
private final int HERO_FRAME_COUNT = 20;
private final int HERO_FRAME_RECTW = 0;
private final int HERO_FRAME_RECTT = 1;
private final int HERO_FRAME_FIREX = 2;
private final int HERO_FRAME_FIREY = 3;
private final int HERO_FRAME_FIREW = 4;
private final int HERO_FRAME_FIREH = 5;
private final int HERO_FRAME_PARTSTART = 6;
private final int HERO_FRAME_PARTCOUNT = 7;
private final int HERO_FRAME_FRAML = 0;
private final int HERO_FRAME_FRAMT = 1;
private final int HERO_FRAME_FRAMR = 2;
private final int HERO_FRAME_FRAMB = 3;
private final int HERO_FRAME_FACEL = 4;
private final int HERO_FRAME_FACET = 5;
private final int HERO_FRAME_FACER = 6;
/**********************************************
* 装载主角数据
**********************************************/
private final void hero_loaddefine(){
InputStream in = stream_create("/hero.bin");
try{
byte[] gifdata = new byte[readWord(in)];
in.read(gifdata, 6, gifdata.length - 6);
System.arraycopy("GIF89a".getBytes(), 0, gifdata, 0, 6);
hero_face = Image.createImage(gifdata,0, gifdata.length);
heroaction = new int[in.read()][][];
for(int i = 0; i < heroaction.length; i++){
int framecount = in.read();
heroaction[i] = new int[framecount][HERO_FRAME_COUNT];
for(int j = 0; j < framecount; j++){
for (int k = 0; k < 6; k++)
heroaction[i][j][k] = (byte)in.read();
for(int k = 0; k < 2; k ++){
for (int l = 0; l < 7; l++)
heroaction[i][j][6 + k * 7 + l] =
(l < 4) ? (byte) in.read() : in.read();
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
/**********************************************
* 设置主角当前状态
* @param status_id int 主角状态索引
**********************************************/
private final void hero_setmainstatus(int status_id){
hero_status = (hero_status & ~STATUS_MAIN) | status_id;
}
private final void hero_setfirestatus(int status_id){
hero_status = (hero_status & ~STATUS_FIRE) | status_id;
}
private final void hero_setmovestatus(int status_id){
hero_status = (hero_status & ~STATUS_MOVE) | status_id;
}
private final void hero_setportstatus(int status_id){
hero_status = (hero_status & ~STATUS_PORT) | status_id;
}
/**********************************************
* 设置主角当前的动作
* @param action_id int 主角动作的索引
**********************************************/
private final void hero_setaction(int action_id) {
if (hero_action == action_id) return;
hero_action = action_id;
hero_setcframe(0);
}
/**********************************************
* 设置主角当前帧
* @param cframe_id int 主角当前帧设置
**********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -