内容来自RyiSnow视频讲解
这一节讲的是Title Screen
,直译:标题屏幕。视频开始没有字幕了,比较考验听力[/doge]🐶,常听到不认识的单词,一边猜,一边琢磨意思。作者说有许多人讨论如何实现non-gameplay screens,非游戏中状态的屏幕,因此添加了此讲解。
前言
Title Screen
标题屏幕这里的意思,是指游戏开始前的一屏画面,一般这里可以选择玩家数量,选择游戏难度,做一些自定义的设置之类的操作。就比如魂斗罗、坦克大战开始游戏前的那个页面。像下面图这样的。
最终效果
按w光标向上选择,按s光标向下,按Enter选中当前菜单项。
为了尽量实现和作者相似的效果,特地去网上下载了一个像素字体文件。
实现
添加新的Game State
Title State;
在GamePanel中的paintComponent方法中处理不同状态的绘制,titleState作为一个分支处理,其他进入游戏后的状态作为一个分支处理。
标题
标题的字体尺寸最大,顶部居中,作者还实现了一个阴影,看起来比较有立体感。
// title name
g2.setFont(g2.getFont().deriveFont(Font.BOLD, 56F));
String text = "Blue Boy Adventure";
int x = getXforCenteredText(text);
int y = gp.tileSize * 2;
// shadow
g2.setColor(Color.gray);
g2.drawString(text, x+5, y+5);
// main color
g2.setColor(Color.white);
g2.drawString(text, x, y);
图片
图片使用的玩家的一张图片,需要注意的是,图片的宽高要像等,数值推荐为16的整数倍,这样比较美观,因为原始图片的尺寸16x16的。
g2.drawImage(gp.player.down1, x, y, gp.tileSize * 2, gp.tileSize * 2, null);
菜单
目前有3项,第二项尚未实现。
New Game开始新游戏
Load Game载入存档
Exit退出游戏
光标
通过w
, s
按键交互实现光标在菜单中上下移动,Enter
键选中菜单,执行对应的操作。
public class KeyHandler {
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
// title state
if (gp.gameState == gp.titleState) {
if (code == KeyEvent.VK_W) {
gp.ui.commandNum--;
if (gp.ui.commandNum < 0) {
gp.ui.commandNum = 2;
}
}
if (code == KeyEvent.VK_S) {
gp.ui.commandNum++;
if (gp.ui.commandNum > 2) {
gp.ui.commandNum = 0;
}
}
if (code == KeyEvent.VK_ENTER) {
if (gp.ui.commandNum == 0) {
gp.gameState = gp.playState;
gp.playMusic(0);
}
if (gp.ui.commandNum == 1) {
// add this later
}
if (gp.ui.commandNum == 2) {
System.exit(0);
}
}
}
//.......
}
}
延伸
有了上述的例子,可以根据需要实现更多。
Character making screen
角色制作屏幕
Control guide screen
控制向导屏幕
Intro story screen
故事讲述屏幕
etc…等等
Character class secection sample screen角色类别选择示例
角色类别选择示例屏幕,就好比一般的RPG游戏,玩家登录后可以同时创建多个角色,每个角色选择不同的职业,这样可以在游戏中体验不同职业的角色玩法。
道理是一致的,这里的选择是纯文字实现效果。
感悟
从开始到现在看了十几个视频了,作者的讲解很详细、很基础,很适合入门,讲解也很细节,但是发现作者有一个缺点,就是代码中有些地方明明应该用if,else if的地方,作者却常常不加else,虽然说有些地方,这样写并不影响逻辑的执行,可是有一些地方却有影响,甚至出现bug,即便没有bug,也会造成不必要的逻辑判断。这一点得注意。
在最后这个示例里面,作者就因为不加else
出现了bug,当选择New Game后,由于没加else
,游戏继续执行后面的if判断,结果预期应该是进入角色选择页面,却因为前面的if条件体变量赋值,导致接下来的if直接为true,于是提前进入了游戏,而没有进入类别选择页面。
代码
参考第6篇文章最后,可以使用git clone或直接下载获得完整项目