📄 gamecanvas.java
字号:
// 初始化玩家属性
formatPlayer();
// 开始剧情文字
gutString = "丹尼20岁的那天,他的家乡被海盗沙尔顿侵略了,丹尼侥幸的活了下来。他决定用自己的力量将海盗沙尔顿消灭,从而保护在这片海域生活的人民。于是他驾驶着父亲的商船开始了他的人生。";
// 初始化图片
try {
// 导入地图
map_0 = Image.createImage("/images/map.png");
// 导入玩家
player = Image.createImage("/images/boat.png");
// 导入剧情背景
gutBack = Image.createImage("/images/about.png");
// 导入游戏运行中菜单
runningMenu = Image.createImage("/images/runningMenu1.png");
// 导入选框图片
imageChoose = Image.createImage("/images/choose.png");
// 导入提示框图片
cueImage = Image.createImage("/images/cue.png");
// 导入对话图片
speak = Image.createImage("/images/speak.png");
// 导入修理升级界面
buy = Image.createImage("/images/buy.png");
// 导入是和否按钮图片
yes = Image.createImage("/images/yes.png");
no = Image.createImage("/images/no.png");
// 导入港口NPC头像图片
npcHead = Image.createImage("/images/head.png");
// 导入查看属性图片
property = Image.createImage("/images/property.png");
// 导入战斗背景图片
actionImage = Image.createImage("/images/actionCanvas.png");
// 导入战斗画面玩家船只图片
actionPlayerImage = Image.createImage("/images/player.png");
// 导入战斗画面海盗船图片
actionNpcImage = Image.createImage("/images/npc1.png");
// 导入选择攻击模式选项
actionFashion = Image.createImage("/images/actionfashion.png");
// 导入炮弹图片
shotImage = Image.createImage("/images/shot.png");
// 导入爆炸图片
boomImage = Image.createImage("/images/boom.png");
// 导入战斗胜利或者失败图片
actionWinImage = Image.createImage("/images/win.png");
actionLostImage = Image.createImage("/images/lost.png");
// 导入Boss图片
bossImage = Image.createImage("/images/boss.png");
// 导入战斗中Boss图片
bossActionImage = Image.createImage("/images/bossimage.png");
// 导入字体图片
FontIn = Image.createImage("/images/FontIn.png");
// 导入离开港口
FontLift = Image.createImage("/images/FontLift.png");
// 导入边框图片
runs = Image.createImage("/images/runs.png");
// 导入交易界面图片
abc = Image.createImage("/images/abc.png");
// 导入商品图片
shangPin = Image.createImage("/images/shangping.png");
// 导入游戏结束图片
gameOverImage = Image.createImage("/images/gameover.png");
// 导入任务信息
InputStream is = this.getClass().getResourceAsStream("/task.txt");
InputStream is1 = this.getClass().getResourceAsStream(
"/taskcue.txt");
byte data[] = new byte[7000];
byte data2[] = new byte[2000];
int index = is.read(data);
int index1 = is1.read(data2);
byte data1[] = new byte[index];
byte data3[] = new byte[index1];
System.arraycopy(data, 0, data1, 0, index);
System.arraycopy(data2, 0, data3, 0, index1);
// 关闭流
is.close();
is1.close();
// 接收任务信息
String tempTask = new String(data1, "UTF-8");
// 接收任务提示信息
String tempTaskCue = new String(data3, "UTF-8");
int num = 0, num1 = 0, num2 = 0, num3 = 0;
// 获取跑商任务及跑商任务提示信息
int len = task.length;
for (int i = 0; i < len; i++) {
num1 = tempTask.indexOf("*", num);
num3 = tempTaskCue.indexOf("*", num2);
task[i] = tempTask.substring(num, num1);
taskCue[i] = tempTaskCue.substring(num2, num3);
num = num1 + 3;
num2 = num3 + 3;
}
// 获取主线任务信息
len = mainTaskInfo.length;
for (int i = 0; i < len; i++) {
num1 = tempTask.indexOf("*", num);
mainTaskInfo[i] = tempTask.substring(num, num1);
num = num1 + 3;
}
// 获取主线任务提示信息
len = mainTaskCue.length;
for (int i = 0; i < len; i++) {
num3 = tempTaskCue.indexOf("*", num2);
mainTaskCue[i] = tempTaskCue.substring(num2, num3);
num2 = num3 + 3;
}
tempTask = null;
tempTaskCue = null;
} catch (Exception e) {
e.printStackTrace();
}
// 获得提示框y坐标
cy = height - cueImage.getHeight();
// 设置当前状态为海上
isSeaRepair = true;
f = Font
.getFont(Font.FACE_MONOSPACE, Font.STYLE_PLAIN, Font.SIZE_SMALL);
strHeight = f.getHeight();
strWidth = f.stringWidth("大");
// 初始化任务对应港口信息
formatRunShangAim();
// mainTask[1] = 1;
// runShangTask[0] = 1;
// runShangTask[1] = 16;
// ///// 构造方法新增加内容/////////////////////////////////////////////
// for (int i = 0; i < mainTaskInfo.length; i++) {
// System.out.println(mainTaskInfo[i]);
// }
// 初始化游戏结束图片的起始位置为屏幕底端
gameOverY = height + gameOverImage.getHeight();
// 创建随机对象
random = new Random();
// 初始化炮弹位置
shotX1 = width - 80 + actionPlayerImage.getWidth() / 2;
shotY = height / 2 + actionPlayerImage.getHeight() / 2;
shotX2 = 20 + actionPlayerImage.getWidth() / 2;
// 启动线程
new Thread(this).start();
/** ********************测试************************** */
// 初始化x,y坐标
x = 50;
y = 50;
// for (int i = 0; i < mainTaskInfo.length; i++) {
// System.out.println(mainTaskInfo[i]);
// }
}
public GameCanvas(String str) {
this();
// 设置游戏为开始状态
isRuning = true;
scene = 0;
loadGame();
}
/**
* 当按键按下时
*
* @param keyCode按下按键对应的键值
*/
protected void keyPressed(int keyCode) {
action = this.getGameAction(keyCode);
// 当游戏正常运行时
if (isRuning) {
// 根据当前scene的值判断执行按键处理
switch (scene) {
case 0: // 航行界面
keySailing(action, keyCode);
break;
case 1: // 对战界面
keyAction(action, keyCode);
break;
case 2: // 进入港口界面
// 设置修理状态
isSeaRepair = false;
keyInPort(action, keyCode);
break;
case 3: // NPC对话界面
kedog(action, keyCode);
break;
case 4: // 跑商界面
keyRunShang(action, keyCode);
break;
case 5: // 游戏菜单界面
// 设置修理状态
isSeaRepair = true;
keyGameMenu(action, keyCode);
break;
case 6: // 查看船体属性界面
keyProperty(action);
break;
case 7: // 保存游戏界面
keySaveTheGame(action, keyCode);
break;
case 8: // 查看当前任务界面
// 直接返回正常航行状态
draw = true;
mainTaskCueTemp = null;
scene = 0;
break;
case 9: // 交易与船只升级界面
keyBuy(action, keyCode);
break;
case 10: // 修理界面
keyRepair(action, keyCode);
break;
case 11: // 提示框
keyTiShi(keyCode);
break;
case 12:
// 根据修理状态,返回相应界面,海上状态返回游戏运行菜单界面,如果是正常修理,返回进入港口界面
if (isSeaRepair) {
scene = 5;
} else {
scene = 2;
}
break;
case 13: // 跑商任务确定
// 初始化选择序号
runShangSelect = 0;
scene = 2;
runShangCueTemp = null;
break;
case 14: // 跑商任务奖励信息界面
scene = 2;
break;
case 15: // 弹药不足提示界面按键处理
scene = 1;
break;
case 16: // 逃跑提示界面
if (flee) { // 逃跑成功直接返回正常航行界面
scene = 0;
} else { // 逃跑失败,丧失本轮攻击机会~海盗船攻击
theAction(0, true);
scene = 1;
actionCourse = 2;
}
break;
case 17: // 战斗结束界面
if (actionResult == 0 && runShangTask[0] == 0) {
// 游戏结束界面
scene = 30;
} else {
// 战斗结束后的战况界面
scene = 18;
draw = true;
}
break;
case 18: // 战况查看按键处理
if (actionResult == 0) { // 战斗失败
if (power[6] - 200 > 0) {
power[6] -= 200;
} else {
power[6] = 0;
}
if (power[7] - 5 > 0) {
power[7] -= 5;
} else {
power[7] = 0;
}
// 设置当前血量为总血量的一半
power[9] = power[1] / 2;
// 清除当前跑商任务
runShangTask[0] = 0;
} else if (actionResult == 1) { // 战斗胜利
power[6] += tempNpc[3];
power[7] += tempNpc[5];
}
scene = 0;
actionResult = -1;
draw = true;
break;
// 升级要求提示信息界面
case 19:
keybat(keyCode, action);
break;
// 无法进入当前隐藏地图提示界面
case 20:
scene = 0; // 返回主海域正常航行状态
draw = true;
break;
case 21:// 是否进入赌场按键处理
keySok(keyCode, action);
break;
case 22:// 赌场按键处理
keyGambing(keyCode, action);
break;
case 23:// 确认购买商品按键处理
keyshang(keyCode, action);
break;
case 24:// 购买商品按键处理
keybuyshangping(keyCode, action);
break;
case 25:// 购买是否成功提示信息界面按键处理
keydm();
break;
case 30:// 游戏结束按键处理
keyGameOver();
break;
}
}
}
/**
* 随即生成1-10之间的随即整数
*
* @param a
* int 玩家当前的点数
* @return int 玩家增加后的点数
*/
public int Gambing(int a) {
a += random.nextInt() % 5 + 5;
return a;
}
/**
* 重新开始游戏还原游戏设置
*/
public void reStart() {
AI = false;
pNumber = 0;
aNumber = 0;
showFont = false;
isWin = false;
isShow = true;
}
/**
* 赌博界面按键处理
*
* @param keyCode
* int 键值
* @param action
* int 游戏动作
*/
public void keyGambing(int keyCode, int action) {
// 如果再来一次的话
if (isWin) {
// 还原默认值
reStart();
return;
}
// 如果选择是的话
if (showFont) {
// 根据玩家按键
switch (action) {
// 向左
case LEFT:
if (repairLabel > 0) {
repairLabel = 0;
} else {
repairLabel = 1;
}
break;
// 向右
case RIGHT:
if (repairLabel < 1) {
repairLabel = 1;
} else {
repairLabel = 0;
}
break;
}
} else {
// 根据游戏动作
switch (action) {
// 左
case LEFT:
// 所在的位置不是最左边一个的时候
if (color > 0) {
color--;
} else {
// 还原为最右边的
color = 3;
}
break;
// 右
case RIGHT:
// 如果不是最右边的时候
if (color < 3) {
color++;
} else {
// 还原为最左边的
color = 0;
}
break;
}
}
// 当按下确定的时候
if (keyCode == -7) {
// 显示 是和否的字体
showFont = true;
// 玩家控制状态下
isShow = true;
// 提示信息
dm = "还需要再来一张吗";
// 根据玩家选择 0为是 1为否
switch (repairLabel) {
case 0:
// 如果玩家选择不再要张的时候
switch (color) {
case 3:
// 进入NPC操作状态
AI = true;
break;
}
// 如果玩家的点数小于21点的时候
if (pNumber < 21) {
// 提示玩家是否再来一张
dm = "还需要再来一张吗";
// 进行时间处理
pNumber = Gambing(pNumber);
}
// 如果超过21点
if (pNumber > 21) {
// 提示玩家输了,要不要再来一局
dm = "你输了,再来一局吗";
// 还原默认值
isAgain = true;
// 根据玩家选择的金钱扣掉相应的钱
if (power[6] > 0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -