📄 xianjiancanvas.java
字号:
import java.util.Vector;
import javax.microedition.lcdui.*;
import javax.microedition.media.MediaException;
/**
* @游戏名称: 仙剑奇侠传
* @作者:张卫国
* @Email: weiguo2000@hotmail.com
* @创建于:2006/7/18--2006/8/3 by Weiguo
*/
public class XianJianCanvas extends Canvas {
private boolean start = true;
private Board board = null;
private Character player = null; //主角
private int keystate = 0;
private int xtmp,ytmp;
private Menu menu = null; //菜单
private Vector npc = null; //npc
private Vector enemy = null; //怪物
private int enemymove = 0;
private int messID = 0; //对话id
private String[] dlgM = null; //对话内容
private int[] talk = null;
private boolean bMess = false;
private int eventID = 1; //事件id
private boolean bEvent = false;
private String taskMess = null; //当前任务提示
public boolean bAttle = false;
private boolean gameshow = true;
private int canvasWidth;
private int canvasHeight;
private Image bufferImage = null; //屏幕图象缓冲
private Graphics bufferGraphics; //屏幕图象缓冲句柄
private Battle batt = null;
public XianJianCanvas() {
this.setFullScreenMode(true);
try {
XianJianImage.music1.start();
} catch (MediaException e) {
e.printStackTrace();
}
canvasWidth = 180;
canvasHeight = 196;
bufferImage = Image.createImage(canvasWidth,canvasHeight);
bufferGraphics = bufferImage.getGraphics();
enemy = new Vector();
npc = new Vector();
board = new Board();
menu = new Menu();
board.createMap(1);
player = new Character("李逍遥");
board.putCharacter(player);
player.setPosition(12,34);
xtmp = 66;
ytmp = 50;
NpcRole npctmp = new NpcRole("李大娘",211);
npctmp.changeDir(3);
npctmp.setPosition(36,46);
npc.addElement(npctmp);
Item item1 = new Item(1001);
player.addGoods(item1);
player.addGoods(item1);
for(int i=1001;i<1008;i++){
item1 = new Item(i);
player.addGoods(item1);
}
for(int i=2201;i<2205;i++){
item1 = new Item(i);
player.addGoods(item1);
}
for(int i=2001;i<2003;i++){
item1 = new Item(i);
player.addGoods(item1);
}
for(int i=2101;i<2103;i++){
item1 = new Item(i);
player.addGoods(item1);
}
for(int i=2301;i<2304;i++){
item1 = new Item(i);
player.addGoods(item1);
}
batt = new Battle(this,player);
new KeyTh().start();
}
protected void paint(Graphics g) {
if(!bAttle){
bufferGraphics.setClip(0,0,canvasWidth,canvasHeight);
bufferGraphics.setColor(0x111111);
bufferGraphics.fillRect(0, 0,canvasWidth,canvasHeight);
if(gameshow){
board.draw( xtmp, ytmp, bufferGraphics );
for(int i=0;i<npc.size();i++){
if (npc.elementAt(i) instanceof NpcRole) {
NpcRole npctmp = (NpcRole) npc.elementAt(i);
npctmp.draw(xtmp,ytmp,bufferGraphics);
}
}
for(int i=0;i<enemy.size();i++){
if (enemy.elementAt(i) instanceof Animal) {
Animal enemytmp = (Animal) enemy.elementAt(i);
enemytmp.x+=(enemymove-1)*3;
enemytmp.draw(xtmp,ytmp,bufferGraphics);
}
}
if(menu.onMenu!=-1){
menu.drawMenu(bufferGraphics);
}else{
bufferGraphics.setColor(0x000000);
bufferGraphics.fillRect(0, canvasHeight-20, canvasWidth, canvasHeight);
bufferGraphics.setColor(0xffffff);
bufferGraphics.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_LARGE));
bufferGraphics.drawString("菜单",0,canvasHeight,Graphics.LEFT|Graphics.BOTTOM);
}
if(bMess){
bufferGraphics.setColor(0xffff00);
message(eventID,bufferGraphics);
}
}
}else if(bAttle){
batt.paint(bufferGraphics);
}
g.drawImage(bufferImage,0,0,Graphics.LEFT|Graphics.TOP);
}
protected void keyPressed(int code) {
int key=this.getGameAction(code);
if(!bAttle){
int [] cell=board.getCell(player.x,player.y);
if(board.map.walk[cell[1]][cell[0]] == -1){
switch(code){
case KEY_STAR:
if(menu.onMenu == -1){
menu.onMenu = 11;
}
break;
}
}
if((!bMess)&&(!bEvent)){
switch(code){
case -7:
menu.back();
break;
case -6:
menu.select();
if(menu.onMenu == -1){
menu.onMenu = 0;
}
break;
}
}
if((!bMess)&&(!bEvent)&&menu.onMenu==-1){
switch(key){
case UP:
keystate|=1;
break;
case RIGHT:
keystate|=2;
break;
case DOWN:
keystate|=4;
break;
case LEFT:
keystate|=8;
break;
}
}
if(bMess){
switch(key){
case FIRE:
messID++;
break;
}
}
if(menu.onMenu!=-1){
switch(key){
case UP:
menu.up();
break;
case DOWN:
menu.down();
break;
}
}
}else if(bAttle){
switch(code){
case -7:
batt.back();
break;
}
if(!batt.isEnd&&!batt.fail){
switch(key){
case UP:
batt.up();
break;
case DOWN:
batt.down();
break;
case FIRE:
batt.select();
break;
}
repaint();
}else{
switch(key){
case FIRE:
batt.endi++;
batt.faili++;
break;
}
repaint();
}
}
}
protected void keyReleased(int code) {
int key=this.getGameAction(code);
switch(key){
case UP:
keystate&=~1;
break;
case RIGHT:
keystate&=~2;
break;
case DOWN:
keystate&=~4;
break;
case LEFT:
keystate&=~8;
break;
}
}
/**
* 主角移动
*/
public void movePlayer(){
if(keystate==1){ //up
if(player.getDir()!=0)
player.changeDir(0);
player.move();
}
if(keystate ==2){ //right
if(player.getDir()!=1)
player.changeDir(1);
player.move();
}
if(keystate ==4){ //down
if(player.getDir()!=2)
player.changeDir(2);
player.move();
}
if(keystate==8){ //left
if(player.getDir()!=3)
player.changeDir(3);
player.move();
}
}
/**
* 对话
*/
public void message(int ii,Graphics g)
{
dlgM=null;
switch(ii)
{
case 1:
dlgM=new String[4];
talk=new int[]{0,0,1,1};
dlgM[0]="李逍遥:罗刹鬼婆哪里逃!";
dlgM[1]="啊...好疼!";
dlgM[2]="李大娘:大白天,做什么梦!";
dlgM[3]="有客人来了还不快去帮忙!";
break;
case 2:
dlgM=new String[2];
talk=new int[]{0,0};
dlgM[0]="李逍遥:真没意思...一大清早";
dlgM[1]="就要做那个做这个的!";
break;
case 3:
dlgM=new String[3];
talk=new int[]{1,1,1};
dlgM[0]="李大娘:逍遥,招呼客人歇歇脚,";
dlgM[1]="我到厨房准备酒菜,待会你进";
dlgM[2]="来端!";
break;
case 4:
dlgM=new String[6];
talk=new int[]{2,2,2,0,0,0};
dlgM[0]="苗人头领:这间客栈我们包了,";
dlgM[1]="除了老板和伙计,不许闲杂人";
dlgM[2]="进来,这是给你的赏银。";
dlgM[3]="得到500文钱";
dlgM[4]="李逍遥:谢大爷的赏,小的一";
dlgM[5]="定听候吩咐!";
break;
case 6:
dlgM=new String[1];
talk=new int[]{0};
dlgM[0]="嘿!遇上财神爷了!";
break;
case 7:
dlgM=new String[4];
talk=new int[]{1,1,0,0};
dlgM[0]="李大娘:快把桌上的酒菜给客人";
dlgM[1]="送到楼上去。";
dlgM[2]="李逍遥:是!";
dlgM[3]="得到酒菜";
break;
case 8:
dlgM=new String[8];
talk=new int[]{0,2,2,0,0,0,2,0};
dlgM[0]="李逍遥:大爷,酒菜来了!";
dlgM[1]="苗人喽罗:恩~什么酒呀?一点味";
dlgM[2]="道也没有!";
dlgM[3]="李逍遥:哦!大爷您有所不知,";
dlgM[4]="此酒乃本地的名产~桂花酒,清香";
dlgM[5]="甘醇无比。";
dlgM[6]="苗人喽罗:拿走!拿走!";
dlgM[7]="得到桂花酒";
break;
case 9:
dlgM=new String[8];
talk=new int[]{1,0,3,0,3,0,3,3,1,0};
dlgM[0]="李大娘:门口有个要饭的,快去把他赶走,免得影响我们做生意!";
dlgM[1]="李逍遥:你快走吧,我们也很穷,没有钱给你!";
dlgM[2]="醉道士:酒...求求...你...一口...喝一口...就好...";
dlgM[3]="李逍遥:好吧,让你喝一口,只能喝一口咯";
dlgM[4]="咕嘟...咕嘟...";
dlgM[5]="李逍遥:呀,一壶酒全喝光了!赔我!";
dlgM[6]="醉道士:呵呵~你不是很想学剑吗?看在酒的份上贫道破例指点你几招,那就三天后三更十里坡'山神庙',不见不散!";
dlgM[7]="醉道士说完话一溜烟地就不见了...";
dlgM[8]="李大娘:你要是有空的话到码头买两条鱼回来,要新鲜的。";
dlgM[9]="得到50文钱";
break;
default:
break;
}
if(messID>dlgM.length-1){
bMess=false;
eventID++;
messID=0;
}
else{
switch(talk[messID]){
case 0:
g.drawImage(XianJianImage.Role,26,canvasHeight-40,Graphics.BOTTOM | Graphics.HCENTER);
break;
case 1:
g.drawImage(XianJianImage.NPC1,26,canvasHeight-40,Graphics.BOTTOM | Graphics.HCENTER);
break;
case 2:
g.drawImage(XianJianImage.NPC2,26,canvasHeight-40,Graphics.BOTTOM | Graphics.HCENTER);
break;
default:
break;
}
g.setColor(0x2d2d40);
g.fillRoundRect(0,canvasHeight-41,canvasWidth-1,40,8,8);
g.setColor(0x1e2d64);
g.drawRoundRect(0,canvasHeight-41,canvasWidth-1,40,8,8);
g.drawImage(XianJianImage.kuang,0,canvasHeight-41,Graphics.LEFT|Graphics.TOP);
g.setColor(0xffffff);
g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD|Font.STYLE_ITALIC,Font.SIZE_MEDIUM));
g.drawString(dlgM[messID],5,canvasHeight-25,Graphics.LEFT|Graphics.TOP);
}
}
public void displayTask(int id,Graphics g){
taskMess=null;
switch(id)
{
case 3:
taskMess = "去楼下";
break;
case 7:
taskMess = "去左上房间找李大娘";
break;
case 8:
taskMess = "去楼上房间找苗人";
break;
default:
taskMess = "";
break;
}
g.setColor(0x2d2d40);
g.fillRoundRect(0,40,179,100,8,8);
g.setColor(0x1e2d64);
g.drawRoundRect(0,40,179,100,8,8);
g.setColor(0xFFFFFF);
g.drawImage(XianJianImage.kuang,0,40,Graphics.LEFT|Graphics.TOP);
g.drawImage(XianJianImage.roletask,(canvasWidth-XianJianImage.rolestate.getWidth())/2,40,Graphics.LEFT|Graphics.TOP);
g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_LARGE));
g.drawString(taskMess,15,65,Graphics.LEFT|Graphics.TOP);
g.setColor(0x000000);
g.fillRect(0, canvasHeight-20, canvasWidth, canvasHeight);
g.setColor(0xffffff);
g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_LARGE));
g.drawString("返回",canvasWidth,canvasHeight,Graphics.RIGHT|Graphics.BOTTOM);
}
/**
* 地图切换
*/
public void changeMap(){
int [] cell=board.getCell(player.x,player.y);
if(board.map.walk[cell[1]][cell[0]] == -99){
player.moveback();
}
if((-board.map.walk[cell[1]][cell[0]])%1000/100 == 1){
enemy.removeAllElements();
npc.removeAllElements();
switch(board.map.walk[cell[1]][cell[0]]){
case -112:
board.createMap((-board.map.walk[cell[1]][cell[0]])%10);
player.setPosition(196,108);
xtmp=-118;
ytmp=-21;
break;
case -121:
board.createMap((-board.map.walk[cell[1]][cell[0]])%10);
player.setPosition(-20,82);
xtmp=98;
ytmp=7;
break;
case -123:
board.createMap((-board.map.walk[cell[1]][cell[0]])%10);
player.setPosition(60,72);
xtmp=20;
ytmp=14;
break;
case -132:
board.createMap((-board.map.walk[cell[1]][cell[0]])%10);
player.setPosition(10,41);
xtmp=72;
ytmp=46;
break;
case -134:
board.createMap((-board.map.walk[cell[1]][cell[0]])%10);
player.setPosition(22,151);
xtmp=56;
ytmp=-64;
NpcRole npc3=new NpcRole("商人",13);
npc3.changeDir(2);
npc3.setPosition(60,160);
npc.addElement(npc3);
break;
case -143:
board.createMap((-board.map.walk[cell[1]][cell[0]])%10);
player.setPosition(-30,155);
xtmp=110;
ytmp=-65;
break;
case -145:
board.createMap((-board.map.walk[cell[1]][cell[0]])%10);
player.setPosition(76,72);
xtmp=4;
ytmp=18;
Animal enemy1 = new Animal(0);
enemy1.setPosition(0,130);
Animal enemy2 = new Animal(0);
enemy2.setPosition(76,108);
Animal enemy3 = new Animal(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -