Java Swing游戏开发学习15

内容来自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或直接下载获得完整项目

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值