📄 gameworld.java
字号:
player.move(0, -6);
}
return;
}
if (downPress || inertia > 0 && way == 8)
{
if (!downPress)
{
player.move(0, 1);
} else
{
player.move(0, 6);
}
return;
}
if (leftPress || inertia > 0 && way == 4)
{
if (!leftPress)
{
player.move(-1, 0);
} else
{
player.move(-6, 0);
}
return;
}
if (rightPress || inertia > 0 && way == 6)
{
if (!rightPress)
{
player.move(1, 0);
} else
{
player.move(6, 0);
}
return;
}
}
// 游戏逻辑
public void logic()
{
if (logicTime == 0)
{
logicTime = System.currentTimeMillis();
}
keyProcess(); // 处理连续按键
changeOffsetTime += System.currentTimeMillis() - logicTime;
if (changeOffsetTime >= 50 && !isTop)
{// 是否移动视口
start -= 1;
if (Math.abs(start) == bgWidth)
{
start = bgWidth;
}
end -= 1;
if (Math.abs(end) == bgWidth)
{
end = bgWidth;
}
offsetX--; // 屏幕的偏移
// 计算需要绘制的地图起始位置和结束位置
column = -offsetX / 16;
if (column == 100)
{
isTop = true;// 到达关底
}
if (column < 0)
{
column = 0;
}
endColumn = column + screenWidth / 16 + 1;
// 防止超出地图数组的最大上限
if (endColumn >= horntest_map[0].length)
{
endColumn = 33;
}
changeOffsetTime = 0;
}
if (!isTop)
{
if (endColumn != tempEnd)
{
for (int row = 0; row < horntest_map.length; row++)//horntest_map.length 13
{
if (horntest_map[row][tempEnd] != 0)
{
for (int j = 0; j < allEnemy.length; j++)//20
{
if (!allEnemy[j].visible)
{ //空闲对象即不可见的对象
//初始化对象为地图数据上类型
if (horntest_map[row][tempEnd] == 6)
{ //运输机将从左边飞入
allEnemy[j].init(-offsetX,
horntest_map[row][tempEnd]);
} else
{ //其它的从右边进入
allEnemy[j].init(tempEnd * 16,
horntest_map[row][tempEnd]);
}
if (allEnemy[j].spriteType == 1
|| allEnemy[j].spriteType == 2
|| allEnemy[j].spriteType == 3
|| allEnemy[j].spriteType == 4
|| allEnemy[j].spriteType == 5
|| allEnemy[j].spriteType == 6
|| allEnemy[j].spriteType == 13
|| allEnemy[j].spriteType == 14
|| allEnemy[j].spriteType == 28)
{
enemyCount++;
}
isNewEnemy = true;
break;
}
}
}
}
tempEnd = endColumn;
}
if (enemyCount < 10)
{ //如果画面上的敌人总数少于6人,增加随机出现的敌人
randomEnmeyTime += System.currentTimeMillis() - logicTime;
if (randomEnmeyTime > 1648)
{ //对随机出现的敌人进行控制
enemyCount++; //出现敌人的数量加1
isNewEnemy = true;
randomEnmeyTime = 0;
for (int j = 0; j < allEnemy.length; j++)
{
if (!allEnemy[j].visible)
{
if (randomNum(2) == 0)
{
randomEnemyType = 5; //手雷兵
} else
{
randomEnemyType = 4; //步兵
}
if (randomNum(2) == 0)
{//设置敌人行走方向
allEnemy[j].init(screenWidth - offsetX,
randomEnemyType); //设置敌人类型
allEnemy[j].changeState(Enemy.STA_GO_LEFT);
} else
{
allEnemy[j].init(-offsetX, randomEnemyType); //设置敌人类型
}
break;
}
}
}
}
if (isNewEnemy)
{
//用冒泡法来根据对象的Y坐标排序
for (int i = 0; i < allEnemy.length; i++)
{
for (int k = i + 1; k < allEnemy.length; k++)
{
if (allEnemy[k].visible
&& allEnemy[k].spriteY + allEnemy[k].height < allEnemy[i].spriteY
+ allEnemy[i].height)
{
Enemy tempE = allEnemy[i];
allEnemy[i] = allEnemy[k];
allEnemy[k] = tempE;
isNewEnemy = false;
}
}
}
}
}
//调用所有敌人的logic()
if (player.playerState != Player.DEAD)
{
for (int i = 0; i < allEnemy.length; i++)
{
if (allEnemy[i].visible)
{
allEnemy[i].logic();
}
}
}
player.logic(); //调用玩家的游戏逻辑
if (isTop)
{
for (int i = 0; i < allEnemy.length; i++)
{
if (allEnemy[i].visible)//检验敌人种类是否带攻击性
{//不带攻击性的都是辅助性质的
if (allEnemy[i].spriteType != 1//士兵
&& allEnemy[i].spriteType != 3
&& allEnemy[i].spriteType != 8
&& allEnemy[i].spriteType != 9
&& allEnemy[i].spriteType != 10
&& allEnemy[i].spriteType != 11
&& allEnemy[i].spriteType != 12
&& allEnemy[i].spriteType != 15
&& allEnemy[i].spriteType != 16
&& allEnemy[i].spriteType != 17
&& allEnemy[i].spriteType != 18
&& allEnemy[i].spriteType != 19
&& allEnemy[i].spriteType != 20
&& allEnemy[i].spriteType != 21
&& allEnemy[i].spriteType != 22
&& allEnemy[i].spriteType != 23
&& allEnemy[i].spriteType != 24
&& allEnemy[i].spriteType != 25
&& allEnemy[i].spriteType != 26
&& allEnemy[i].spriteType != 27
&& allEnemy[i].spriteType != 29
&& allEnemy[i].spriteType != 30
&& allEnemy[i].spriteType != 39)
{
isClean = false;
break;
}
}
isClean = true;
}
}
logicTime = System.currentTimeMillis();
}
// 图象绘制
protected void paint(Graphics g)
{
int numW = 5, numH = 8;
/** **************************开始游戏****************************** */
if (!isClean && gameStart)
{
// 绘制背景
if (level < 10)
{
g.drawImage(backgroundImage, start, -positionY, 20);
g.drawImage(backgroundImage, end, -positionY, 20);
} else
// 生存模式
{
g.setColor(0x000000);
g.fillRect(0, 0, screenWidth, screenHeight);
}
// 绘制敌人
for (int i = 0; i < allEnemy.length; i++)
{
allEnemy[i].paint(g);
}
// 绘制主角
player.paint(g);
// 使用空袭
if (player.isAirAttack)// 空袭
{
addSpeed++;
if (addSpeed / 2 > 2)
{
for (int i = 0; i < allEnemy.length; i++)
{
if (allEnemy[i].visible)
{
allEnemy[i].changeState(Enemy.STA_DEAD); // 让所有敌人死亡
}
}
player.isAirAttack = false;
addSpeed = 0;
} else
{// 画清屏图片
drawFrame(bombImage, addSpeed / 2, 100, 50, 63, 64, 0, g);
drawFrame(bombImage, addSpeed / 2, 100, 150, 63, 64, 0, g);
drawFrame(bombImage, addSpeed / 2, 0, 50, 63, 64, 0, g);
drawFrame(bombImage, addSpeed / 2, 0, 150, 63, 64, 0, g);
drawFrame(bombImage, addSpeed / 2, 50, 100, 63, 64, 0, g);
}
}
// //////////////////UI绘制////////////////////
g.setColor(0xfdf1c3);
g.fillRect(74, 178, 103, 5);// 米白色部分
g.setColor(0xffe400);
g.fillRect(75, 179, (int) 101, 4);// 淡黄色部分
g.setColor(0xff0000);
g.fillRect(75, 179, (int) (player.getHP()), 4);// 红色部分
g.setColor(0x000000);
g.fillRect(0, screenHeight - 20, screenWidth, 20);
//UI 绘制
drawFrame(uiImage, 0, 0, screenHeight - uiImage.getHeight(), 176,
44, 0, g);
//绘制空袭导弹
for (int i = 0; i < bombVector.size(); i++)
{
drawFrame((Image) (bombVector.elementAt(i)), 0, bombImageX[i],
193, 16, 16, 3, g);
}
// 绘制弹壳
drawFrame(itemImage, 0, screenWidth >> 1, screenHeight - 17, 16,
16, 4, g);
//玩家子弹图标绘制
for (int j = 0; j < bulletVector.size(); j++)
{
drawFrame((Image) (bulletVector.elementAt(j)), 0,
bulletImageX[j], bulletImageY[j], 16, 16, 5, g);
}
//绘制子弹数字
paintNum(g, bulletVector.size(), 94, screenHeight - 13, numW, numH,
numberImage);
//绘制生命值数字
paintNum(g, player.getHP(), 50, screenHeight - 17, numW, numH,
numberImage);
if (player.getHP() < 50)//生命警报
{
if (lifeAlarm)
{
g.setColor(0xffe400);
lifeAlarm = false;
} else
{
g.setColor(0xff0000);
lifeAlarm = true;
}
g.fillRect(19, 183, 3, 3);
g.fillRect(24, 183, 3, 3);
g.fillRect(29, 183, 3, 3);
g.fillRect(34, 183, 3, 3);
g.fillRect(39, 183, 3, 3);
}
// /////////////////////////////////////////////////////////////////////////
if (gameMenu)// 游戏中途菜单显示
{//游戏中的呼出菜单
if (!keyMenu)
{
keyTime += speed;
if (keyTime >= 500)
{
keyMenu = true;
keyTime = 0;
}
}
drawFrame(menuSelect, 0, (screenWidth - 68) / 2,
(screenHeight - 58) / 2, 68, 58, 0, g);
drawFrame(menuSelect, 1, (screenWidth - 68) / 2,
(screenHeight - 58) / 2, 68, 58, 0, g);
switch (gameMenuItem)
{
case 1:
drawFrame(menuSelect, 3, (screenWidth - 68) / 2,
(screenHeight - 58) / 2, 68, 29, 0, g);
break;
case 2:
drawFrame(menuSelect, 3, (screenWidth - 68) / 2,
29 + (screenHeight - 58) / 2, 68, 29, 1, g);
break;
}
// showMemory(g);
return;
}
//任务失败
if (player.playerState == Player.DEAD)// 任务失败
{
if (usePassTime == 0)
{
usePassTime = System.currentTimeMillis();
}
useTime += System.currentTimeMillis() - usePassTime;
if (useTime >= 5000)
{
useTime = 0;
usePassTime = 0;
reset();//菜单图片加载
return;
}
g.setClip(left, 0, right, screenHeight);
g.setColor(0x000000);
g.fillRect(0, 0, screenWidth, screenHeight);
g.setClip(0, 0, screenWidth, screenHeight);
if (left <= 0 || right >= screenWidth)
drawFrame(gameoverImage, 0, (screenWidth - 71) / 2,
(screenHeight - 18) / 2, 71, 18, 1, g);
usePassTime = System.currentTimeMillis();
}
// showMemory(g);
return;
}
/* / *************************过关提示********************************* / */
else if (isClean)
{
if (usePassTime == 0)
{
usePassTime = System.currentTimeMillis();
}
useTime += System.currentTimeMillis() - usePassTime;
g.setClip(left, 0, right, screenHeight);
g.setColor(0x000000);
g.fillRect(0, 0, screenWidth, screenHeight);
g.setClip(0, 0, screenWidth, screenHeight);
if (left <= 0 || right >= screenWidth)
{
drawFrame(gameoverImage, 0, (screenWidth - 71) / 2,
(screenHeight - 18) / 2, 71, 18, 0, g);
g.setColor(0xff0000);
}
if (useTime >= 3000)
{
useTime = 0;
level++;
if (level > 10)
{
this.gameStart = false;
this.isClean = false;
reset();
startMenu = true;
usePassTime = 0;
return;
}
if (level == 10)
{
this.autoSave();
this.gameStart = false;
this.isClean = false;
this.reset();// 加载菜单
startMenu = true;
//通关;
} else
{
this.autoSave();
this.initGame(20, level);
}
usePassTime = 0;
return;
}
usePassTime = System.currentTimeMillis();
// showMemory(g);
return;
}
if (isNew)
{//游戏刚刚开始时仅仅显示LOGO页面
g.setColor(255, 255, 255);
g.fillRect(0, 0, screenWidth, screenHeight);
if (logoImage[logoCount] != null)
g.drawImage(logoImage[logoCount], screenWidth / 2
- logoImage[logoCount].getWidth() / 2, screenHeight / 2
- logoImage[logoCount].getHeight() / 2, 20);
if (logoCount == 2)
{
g.drawImage(nameImage, 30, nameStart, 20);
if (nameStart <= 120)
if (showAnyKey < 10)
g.drawImage(anykeyImage, 40, 160, 20);
}
// showMemory(g);
return;
}
/** ******************************开始菜单************************************ */
if (startMenu)
{//开始菜单
if (!keyMenu)
{
keyTime += speed;
if (keyTime >= 500)
{
keyMenu = true;
keyTime = 0;
}
}
g.setColor(0x000000);
g.fillRect(0, 0, screenWidth, screenHeight);
if (menuAdd < 88)
{
menuAdd += 4;
return;
}
g.drawImage(gameLogoImage, screenWidth / 2
- gameLogoImage.getWidth() / 2, screenHeight / 2
- gameLogoImage.getHeight() / 2, 20);
int x = (screenWidth - 72) / 2;
switch (menuItem)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -