📄 rpg_demo.java
字号:
package rpg_demo_P;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import java.util.Vector;
//import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.TiledLayer;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
public class Rpg_DEMO extends GameCanvas implements Runnable
{ ///*******
///*** 下面为主要状态
private final static int MAIN_STATE_LOGO=-1; //游戏处在logo状态下
private final static int MAIN_STATE_MENU=0; //游戏处在Menu状态下
private final static int MAIN_STATE_GAMERUNNING=1; //游戏处在运行状态下
private final static int MAIN_STATE_GAMEOVER=2; //游戏处在游戏结束状态下
private final static int MAIN_STATE_ABOUT=3; //游戏处在ABOUT界面状态下
////*** 下面为主要状态下的次要状态
private final static int CHILD_STATE_GAMELOADING=1; //游戏处在Loading界面状态下
private final static int CHILD_STATE_MAPS=2; //游戏处在地图界面状态下
private final static int CHILD_STATE_CHANGEMAP=3; //游戏处在换图界面状态下
////*** 下面为游戏处于地图界面状态下的一些状态
private final static int MAP_STATE_NOMORE=0; //地图普通状态
private final static int MAP_STATE_TACKING=1; //地图对话状态
private final static int MAP_STATE_CHANGE=2; //交易状态
private final static int MAP_STATE_DIED=3; //地图下的死亡状态
//****各章地图
private static final int MAP_CUNZI=1;//村子地图
private static final int MAP_SENLIN=2;//森林地图
private static final int MAP_SHAMO=3;//沙漠地图
private static final int MAP_YANSHI=4;//岩石地图
private static final int MAP_QIULIN=5;//丘陵地图
////****
public Command back; //设置一个软键---返回键
public RpgMIDletTest controller; //游戏运行状态的控制者
public Graphics g; //游戏画笔
private static int SCREEN_WIDTH; //屏幕的宽
private static int SCREEN_HEIGHT; //屏幕的高
private int state_Main=-1; //主要状态属性的值
private int state_Child=-1; //次要状态属性的值
private int state_Map=0; //在地图下的状态
private int menu_Selected=0; //玩家在主菜单选项选中的项
private int gamemenu_Selected=0; //玩家在游戏运行时叫出菜单的时候选中的项
private int tacking_Selected=0; //对话时需要显示的对话项
private int tacking_name_Selected=0; //对话是的对象名
private int mapindex=1; //所处的地图,用于地图间的切换
private int To_mapindex=0; //要传到的地图
private int keyCode;
long startTime,endTime;//线程开始,结束时间
///****
public boolean if_pause=false; //观察游戏是否暂停了,也就是有电话接入的时候
public StringBuffer buffer=new StringBuffer("");
public static int jineng=0 ; //技能状态与普通状态的切换
//***set Font
Font mini=Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_SMALL); //小型字体
Font medium=Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM);//中型字体
static final Font lowFont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_MEDIUM);
static final Font highFont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_BOLD,Font.SIZE_LARGE);
//***set Color
static final int lowColor=0x00ff00ff;
static final int highColor=0x00ffffff;
static final int highBGColor=0x00dddddd ;
static int width; //菜单界面是的宽
static int height;//菜单界面时的高
static int startHeight;
static final int spacing=highFont.getHeight();
static final String[] mainMenu={"开始游戏","载入游戏","游戏帮助","离开游戏"};
static final String[] gameMenu={"角色状态","保存游戏","返回游戏","回主菜单"};
static String npc_Name_king="镇长";
static String npc_Name_tiejiang="铁匠";
static String npc_Name_shangdian="杂货商";
static final String[] npc_king_tacking={" 镇长:我的小镇真的是个好地方,是吧少年?",
"镇长:勇敢的年轻人,南方出现了一只凶猛的巨熊,你能帮助镇上的人么?",
"东边的沙漠上出现了一只蝎子怪,很多过往的人们受到了伤害,真希望有人能帮助那些无辜的旅人。",
"....."
};
static final String[] npc_tiejiang_tacking=
{
"小伙子,有什么需要帮忙的吗?",
"想合点什么东西?",
"把东西拿来瞧瞧。",
"....."
};
static final int N72_W=176;
static final int N72_H=208;
static int duibai_pd=1;
int about_level=0; //给ABOUT界面的滚动条用的,用于屏幕上显示的第一行到底是第几行
int about_maxlevel=0; //给ABOUT界面使用的,表示最大可以下移的行数
static Thread menuThread;
////***
Image logo_Image; //logo图片
Image menu_Image;//主菜单图片
Image sprite_hero_Image;//主角精灵图片
Image map_cunzi_Image;//村子地图图片
Image touxiang_Image;//人物头像
Image guaiwu_qiulin_Image;//丘陵怪物图片
Image guaiwu_senlin_Image;//森林怪物图片
Image guaiwu_yanshi_Image;//岩石怪物图片
Image npc_shangdian_Image;//商店npc图片
Image npc_tiejiang_Image;//铁匠npc图片
Image npc_king_Image;//国王npc图片
Image gameover_Image;//死亡状态图
Image red_Image,blue_Image;//红,蓝药图
Image shuxing_Image;//属性图片
Image boss_Image;//boss图片
Image jn_Image;//技能图片--普通攻击
LayerManager lm;//图层管理者
Map_cuizi cunzi;//村子类对象
Map_shamo shamo;//沙漠类对象
Map_senlin senlin;//森林类对象
Map_yanshi yanshi;//半岩石类对象
TiledLayer tl_BG;//背景层
TiledLayer tl_PZ;//碰撞层
int[][] bg,pz;//背景和碰撞数组
static int String_Move=5;//移动字符串移动速度
//static int String_X=SCREEN_WIDTH;//移动字符串的X坐标
Player_RPG Hero;//主角精灵
Npc npc_shangdian,npc_tiejiang,npc_king;//npc精灵
int PlayerState; //精灵的动作状态
Vector vec;//用一个动态数组Vector来存储怪物
Random rand;//用一个随机数在存放怪物出来的位置
static public final int HERO_MOVE_FX_UP=0;
static public final int HERO_MOVE_FX_DOWN=1;
static public final int HERO_MOVE_FX_LEFT=2;
static public final int HERO_MOVE_FX_RIGHT=3;
////***下面的是一些动作索引
/////***主角的索引
int[] moveleft = {18,19,20,21,22,23}; //向左动作的图片索引
int[] moveright = {6,7,8,9,10,11}; //向右动作的图片索引
int[] movedown ={12,13,14,15,16,17}; //向下的动作图片索引
int[] moveup = {0,1,2,3,4,5}; //向上的动作图片索引
int getfx; //获取当前精灵的方向(状态)
int[] action1 = {24,25,26,27,28,29}; //动作图片索引1---向下攻击
int[] action2 = {30,31,32,33,34,35}; //动作图片索引2---向右攻击
int[] action3 = {36,37,38,39,40,41}; //动作图片索引3---向左攻击
int[] action4 = {42,43,44,45,46,47}; //动作图片索引4---向上攻击
//int[] action5 = {36,37,38}; //主角死亡动作
/////****怪物的索引
int[] guai_up={0,1,2};
int[] guai_down={3,4,5};
int[] guai_left={6,7,8};
int[] guai_right={9,10,11};
int[] guai_stop={0};
int[] guai_hurt_up={12,13,14};
int[] guai_hurt_down={15,16,17};
int[] guai_hurt_left={18,19,20};
int[] guai_hurt_right={21,22,23};
int[] guai_walk={6,7,8,9,10,11};
int viewWindowX=100,viewWindowY=150; //视窗的位置
/////***
Player player; //音乐播放器
InputStream is; //创建音乐流所要用到的输入流
public Rpg_DEMO(boolean arg0,RpgMIDletTest rpg_midlet)
{
super(arg0);
back=new Command("返回",Command.BACK,1);
controller=rpg_midlet;
g=this.getGraphics();
SCREEN_WIDTH=getWidth();//屏幕的宽
SCREEN_HEIGHT=getHeight();//屏幕的高
width=getWidth();
height=getHeight();
vec=new Vector();
rand=new Random();
//System.out.println(SCREEN_WIDTH);
//System.out.println(SCREEN_HEIGHT);
startHeight=(highFont.getHeight()*mainMenu.length)+((mainMenu.length-1)*spacing);
startHeight=(height-startHeight)/2;
//this.setCommandListener(this);
setFullScreenMode(true); //设置当前显示模式为全屏模式
// System.out.println(SCREEN_WIDTH);
// System.out.println(SCREEN_HEIGHT);
try
{
logo_Image=Image.createImage("/logo2.png");
//menu_Image=Image.createImage("/hero1.png"); //在DrawMenu里面有这个
map_cunzi_Image=Image.createImage("/map_cun zi yan shi.png");
//sprite_hero_Image=Image.createImage("/所有组合.png");
touxiang_Image=Image.createImage("/touxiang.png");
red_Image=Image.createImage("/red2.png");
blue_Image=Image.createImage("/blue2.png");
jn_Image=Image.createImage("/jian.png");
shuxing_Image=Image.createImage("/shuxing.png");
}catch(IOException e)
{
e.printStackTrace();
System.out.println("this here !");
}
}
public void run()
{
// TODO 自动生成方法存根
while(!if_pause)
{
startTime=System.currentTimeMillis();//得到线程一个循环的开始时间
switch(state_Main)
{
case MAIN_STATE_LOGO:
DrawLogo();
logo_Image=null;
//System.out.println("run here_LOGO");
state_Main=MAIN_STATE_MENU; //draw了Logo以后切换到菜单界面
try
{
is=getClass().getResourceAsStream("/background.mid"); //创建播放器
player=Manager.createPlayer(is,"audio/midi");
player.realize();
player.setLoopCount(-1); //开始播放MENU菜单的音乐
player.start();
}
catch (MediaException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
break;
case MAIN_STATE_MENU:
DrawMenu();
/*menu_Image=null;
System.out.println("run here_MENU");*/
// flushGraphics();
break;
case MAIN_STATE_GAMERUNNING:
///run s
switch(state_Child)
{
case CHILD_STATE_GAMELOADING:
DrawLoading();
state_Child=CHILD_STATE_MAPS;
state_Map=MAP_STATE_NOMORE;//游戏读取完毕的后转到地图界面状态
try
{
player.stop();
player.close();
is=getClass().getResourceAsStream("/map1.mid");
player=Manager.createPlayer(is,"audio/midi");
player.realize();
player.setLoopCount(-1);
player.start();
}catch (MediaException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
break;
case CHILD_STATE_MAPS:
switch(state_Map)
{
case MAP_STATE_NOMORE:
render();
hero_Judge();
npc_Judge();
guai_Judge();
/*System.out.println("++++"+Hero.px);
System.out.println("----"+Hero.py);*/
break;
case MAP_STATE_TACKING:
//System.out.println("start tacking!");
switch(tacking_name_Selected)
{
case 1:
DrawTacking(npc_king_tacking);
if(tacking_Selected==npc_king_tacking.length-1)
{
tacking_Selected=0;
state_Map=MAP_STATE_NOMORE;
}
break;
case 2:
DrawTacking(npc_tiejiang_tacking);
if(tacking_Selected==npc_tiejiang_tacking.length-1)
{
tacking_Selected=0;
state_Map=MAP_STATE_NOMORE;
}
break;
}
break;
case MAP_STATE_CHANGE:
DrawGameMenu();
break;
case MAP_STATE_DIED:
state_Main=MAIN_STATE_GAMEOVER;
break;
}
break;
case CHILD_STATE_CHANGEMAP:
//System.out.println("!!!!!!!!!!!!!change map!");
switch(mapindex)
{
case MAP_CUNZI:
chang_Map(MAP_CUNZI,To_mapindex);
break;
case MAP_SENLIN:
chang_Map(MAP_SENLIN,To_mapindex);
break;
case MAP_SHAMO:
chang_Map(MAP_SHAMO,To_mapindex);
case MAP_YANSHI:
chang_Map(MAP_YANSHI,To_mapindex);
break;
}
//DrawLoading(); //还要把画面转到地图读取状态
state_Child=CHILD_STATE_MAPS;
state_Map=MAP_STATE_NOMORE;
break;
}//end child_state
break;
case MAIN_STATE_GAMEOVER:
drawGameover();
try
{
player.stop();
player.close();
is=getClass().getResourceAsStream("/background.mid"); //创建播放器
player=Manager.createPlayer(is,"audio/midi");
player.realize();
player.setLoopCount(-1); //开始播放MENU菜单的音乐
player.start();
}
catch (MediaException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
state_Main=MAIN_STATE_MENU;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -