Java Swing游戏开发学习26

news2024/11/24 15:41:58

内容来自RyiSnow视频讲解

这一节讲的是Inventory背包,类似RPG游戏中人物角色放置装备、药品、武器、宝石等物品的一个若干行若干列的表格窗口。

可以显示装备物品,并选择它们。

前言

  作者说这一节可能是第二部分里面爬起来最高的山峰。

效果

在这里插入图片描述
最后还有一个中文效果,可以看下面。

实现

创建子窗口

创建一个子窗口,宽度6 tileSize,高度5 tileSize。

在这里插入图片描述
内容容量为20,4行5列。预计是下面这个图片所示。
在这里插入图片描述

绘制光标格子

public class UI {
	public void drawInventory() {
	...
		// CURSOR
		int cursorX = slotXstart + (gp.tileSize * slotCol);
		int cursorY = slotYstart + (gp.tileSize * slotRow);
		int cursorWidth = gp.tileSize;
		int cursorHeight = gp.tileSize;
		// DRAW CURSOR
		g2.setColor(Color.white);
		g2.setStroke(new BasicStroke(3));
		g2.drawRoundRect(cursorX, cursorY, cursorWidth, cursorHeight, 10 ,10);
	}
}

在这里插入图片描述
格子的边框线条有点粗,修改一下
在这里插入图片描述

// CURSOR
int cursorX = slotXstart + (gp.tileSize * slotCol);
int cursorY = slotYstart + (gp.tileSize * slotRow);
int cursorWidth = gp.tileSize;
int cursorHeight = gp.tileSize;
// DRAW CURSOR
g2.setColor(Color.white);
g2.setStroke(new BasicStroke(3));
g2.drawRoundRect(cursorX, cursorY, cursorWidth, cursorHeight, 10 ,10);

移动光标格子

修改KeyHandler实现。作者增加了一个移动光标格子音效。

public class KeyHandler {

public void characterState(int code) {
    if (code == KeyEvent.VK_C) {
        gp.gameState = gp.playState;
    }
    if (code == KeyEvent.VK_W) {
        gp.ui.slotRow--;
        gp.playSE(9);
    }
    if (code == KeyEvent.VK_A) {
        gp.ui.slotCol--;
        gp.playSE(9);
    }
    if (code == KeyEvent.VK_S) {
        gp.ui.slotRow++;
        gp.playSE(9);
    }
    if (code == KeyEvent.VK_D) {
        gp.ui.slotCol++;
        gp.playSE(9);
    }
}

}

关于音效播放,作者所用的方法经常出现一个异常,已经不止一次了,这个问题后续必须要解决。即使不出异常,音效时有时无,有时候播放不出来,体验很差。

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported.
	at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:513)
	at com.sun.media.sound.DirectAudioDevice$DirectClip.implOpen(DirectAudioDevice.java:1322)
	at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:120)
	at com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1091)
	at com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1193)
	at main.Sound.setFile(Sound.java:30)
	at main.GamePanel.playSE(GamePanel.java:263)
	at main.KeyHandler.characterState(KeyHandler.java:174)
	........

在这里插入图片描述

增加限制防止光标跑到子窗口外面

public void characterState(int code) {
    if (code == KeyEvent.VK_C) {
        gp.gameState = gp.playState;
    }
    if (code == KeyEvent.VK_W) {
        if (gp.ui.slotRow != 0) {
            gp.ui.slotRow--;
            gp.playSE(9);
        }
    }
    if (code == KeyEvent.VK_A) {
        if (gp.ui.slotCol != 0) {
            gp.ui.slotCol--;
            gp.playSE(9);
        }
    }
    if (code == KeyEvent.VK_S) {
        if (gp.ui.slotRow != 3) {//row:0,1,2,3
            gp.ui.slotRow++;
            gp.playSE(9);
        }
    }
    if (code == KeyEvent.VK_D) {
        if (gp.ui.slotCol!=4) {//col:0,1,2,3,4
            gp.ui.slotCol++;
            gp.playSE(9);
        }
    }
}

显示玩家的物品

在这里插入图片描述

public void drawInventory() {
    // FRAME
    int frameX = gp.tileSize * 9;
    int frameY = gp.tileSize;
    int frameWidth = gp.tileSize * 6;
    int frameHeight = gp.tileSize * 5;
    drawSubWindow(frameX, frameY, frameWidth, frameHeight);

    // SLOT
    final int slotXstart = frameX + 20;
    final int slotYstart = frameY + 20;
    int slotX = slotXstart;
    int slotY = slotYstart;

    // DRAW PLAYER'S ITEMS
    for (int i = 0; i < gp.player.inventory.size(); i++) {
        // down1 is default image
        g2.drawImage(gp.player.inventory.get(i).down1, slotX, slotY, null);
        slotX += gp.tileSize;

        if (i == 4 || i == 9 || i == 14) {
            slotX = slotXstart;
            slotY += gp.tileSize;
        }
    }
    ......

右侧空隙过大,调整一下。具体可参考项目代码。
在这里插入图片描述

增加网格线

这个作者没有,自己增加做个练习,显示效果不太好。
在这里插入图片描述

显示光标所在物品的描述信息

创建一个描述子窗口,位于物品窗口下方,显示装备物品的名称和描述信息。
在这里插入图片描述

public class UI {

	public void drawInventory() {
	......
		// DESCRIPTION FRAME
        int dFrameX = frameX;
        int dFrameY = frameY + frameHeight;
        int dFrameWidth = frameWidth;
        int dFrameHeight = gp.tileSize * 3;
        drawSubWindow(dFrameX, dFrameY, dFrameWidth, dFrameHeight);

        // DRAW DESCRIPTION TEXT
        int textX = dFrameX + 20;
        int textY = dFrameY + gp.tileSize;
        g2.setFont(arial_40);
        g2.setFont(g2.getFont().deriveFont(28F));

        int itemIndex = getItemIndexOnSlot();

        if (itemIndex < gp.player.inventory.size()) {
            String[] descArr = gp.player.inventory.get(itemIndex).description.split("\n");
            for (String line : descArr) {
                g2.drawString(line, textX, textY);
                textY += 32;
            }
        }
    }
}

移动光标,描述信息相应改变。用中文试了一下。效果还行。
在这里插入图片描述

代码

参考第6篇文章最后gitee仓库链接,可以使用git clone命令clone一下或直接下载获得完整项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1632865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3d 学习之按钮绑定事件

创建测试脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class myTest : MonoBehaviour {// Start is called before the first frame updatepublic Button _codeBindBtn null;void Start(){if (_codeBi…

IC设计数据传输 如何能保障安全高效?

IC&#xff08;集成电路&#xff09;设计数据&#xff0c;对于IC设计企业来说&#xff0c;其重要性不言而喻。所以IC设计数据传输过程中&#xff0c;其安全性和效率&#xff0c;也需要有保障。 首先我们来看看IC设计数据为什么重要&#xff0c;其重要性体现在多个方面&#xff…

远距离、高品质、低延迟、高保真——SA316无线音频模块带您探索新的音频体验

SA316系列产品分为发射端模块SA316S-TX,SA316F30和接收端模块SA316-RX&#xff0c;该系列方案采用了无线高品质的语音传输芯片来设计&#xff0c;它可以支持外部 PCM / IIS 双模数字音频接口&#xff0c;同时模块为客户提供了标准化的串行接口&#xff0c;使用者可通过串口指令…

C语言基础:初识指针(二)

当你不知道指针变量初始化什么时&#xff0c;可以初始化为空指针 int *pNULL; 我们看NULL的定义&#xff0c;可以看出NULL是0被强制转化为Void* 类型的0&#xff1b;实质还是个0&#xff1b; 如何避免野指针&#xff1a; 1. 指针初始化 2. 小心指针越界 3. 指针指向空间…

算法工程师——算法岗的分类及要求汇总

算法岗工程师 根据 Talent Seer 人才报告显示,全球 AI 从业者总人数约有 30 万,还是供不应求,其中 AI 技术专家(具有相关领域博士学位及 3 年以上工作经验的)约有 3.65 万。 简介 对于计算机专业的毕业生而言,算法岗基本上就是 「高薪」 的代名词。 在当今 IT 行业,算…

vue3.2+vite+unocss原子化配置

1、安装unocss&#xff1a;npm install unocss 2、vite.config.ts中配置&#xff1a; 3、创建unocss自己的ts文件&#xff1a;uno.config.ts 根路径下创建&#xff0c; 4、在创建好的uno.config.ts文件中编写如下代码&#xff1a; // uno.config.ts import {defineConfig,prese…

如果把软路由的网段更换成169.254.0.0/16会咋样?

前言 这几天有小伙伴在折腾软路由系统&#xff0c;然后问题就来了。 他咨询的是&#xff1a;为啥电脑连接软路由之后&#xff0c;无法访问软路由的管理页&#xff1f; 嗯。。。确实不是什么大事。但不注意看&#xff0c;还以为软路由没有正常获取到ip。 熟悉网络的小伙伴们都…

【统计推断】-01 抽样原理之(三)

文章目录 一、说明二、抽样分布三 均值抽样分布3.1 有限母体无放回抽样3.2 有限母体有放回抽样3.3 无限母体 四、比例抽样分布五、和差抽样分布 一、说明 上文中叙述母体和抽样的设计&#xff1b;以及抽样分布的概念&#xff0c;本篇将这种关系定量化&#xff0c;专门针对抽样的…

5V升8.4V2A同步升压恒压WT3213

5V升8.4V2A同步升压恒压WT3213 WT3213同步升压型直流/直流转换器以其微小的尺寸和卓越的能效而广受欢迎。这款设备在设计上的巧妙&#xff0c;包含电流模PWM控制环路、误差放大器、斜线补偿电路、比较器以及功率开关等关键元件&#xff0c;共同构成了它的特殊性能。 在细节上…

mysql-sql-练习题-1

文章目录 环境注释建表 5张建库学生表课程表教师表分数表总表 语法书写顺序in学过/没学过完全相同 环境 Windows cmd&#xff08;普通用户/管理员&#xff09; mysql -uroot -pmysql版本&#xff0c;模式&#xff08;可自定义&#xff09; select version(),global.sql_mode…

选对伪原创改写软件,文章写作不犯难!

文章写作在当下火热的自媒体的行业中是一项非常重要的技能&#xff0c;只要是参与做自媒体的朋友&#xff0c;想要在内容输出方面不出现困难的情况&#xff0c;那么文章写作的技能基本要具备&#xff0c;但是我们依然能看到有很多不擅长写作的朋友也做起了自媒体&#xff0c;并…

为什么选择福汇外汇?

福汇外汇凭借其品牌信誉、丰富的交易产品、先进的交易平台、高杠杆和低保证金要求、专业的客户服务、严格的监管以及便捷的出入金方式&#xff0c;成为了许多投资者选择的外汇交易平台。 为什么选择福汇外汇&#xff1f; 1、品牌信誉&#xff1a;福汇外汇是全球最大的零售外汇交…

深度学习-自动求导

目录 向量链式法则标量链式法则 拓展到向量例题1例题2 符号求导数值求导自动求导计算图自动求导的两种模式链式法则正向累积&#xff08;从x出发&#xff09;反向累积&#xff08;反向传递--先计算最终的函数即y&#xff09;反向累积总结 自动求导计算y关于x的梯度&#xff0c;…

Virtualbox7.0.10--创建虚拟机

前言 下载Virtualbox7.0.10&#xff0c;可参考《Virtualbox–下载指定版本》 Virtualbox7.0.10具体安装步骤&#xff0c;可参考《Virtualbox7.0.10的安装步骤》 Virtualbox7.0.10创建虚拟机&#xff0c;可参考《Virtualbox7.0.10–创建虚拟机》 Virtualbox7.0.10安装Ubuntu20.0…

校园安全升级:AR实景监测场景方案

在教育领域&#xff0c;随着校园的逐步对外开放&#xff0c;学校正面临着前所未有的管理挑战。社会人员的大量涌入不仅带来了文化的交流和知识的分享&#xff0c;也给校园安全带来了诸多隐患。新闻报道中不断出现的校园安全事件&#xff0c;如入室伤人、盗窃和非法传销等&#…

7.19 下午题典型考点

一、安全防护体系 &#xff08;一&#xff09;来由 安全保护等级&#xff08;5个&#xff09;&#xff1a;用户自主、系统审计、安全标记、结构化、访问验证&#xff08;自己全借问&#xff09; 为了对信息系统从不同角度做安全保护&#xff1b; 有利于从不同角度去加强信息系…

提示词工程入门-使用文心一言4.0-通义千问-GPT4-Claude3通用提示技巧测试

提示词工程基础&#x1f680; 在了解完了大语模型的基本知识&#xff0c;例如API的使用多轮对话&#xff0c;流式输出&#xff0c;微调&#xff0c;知识向量库等知识之后&#xff0c;接下来需要进一步补足的一个大块就是提示词工程&#xff0c;学习和了解提示词工程除了基本的提…

【逆向百例】百度翻译js逆向

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff01; 前言 目标 分析某度翻译接口&#xff0c;使用python获取翻译结果&#xff0c;并用pyinstaller打包成单文件可执行程序。 工具 ch…

云端飞翔,一触即达 —— 100G网卡,连接未来

关于100G网卡&#xff0c;这是一种高速网络接口控制器&#xff0c;主要用于数据中心和高性能计算环境&#xff0c;以支持更快的数据传输速率。100G网卡可以提供每秒100吉比特的传输速率&#xff0c;适用于需要处理大量数据和高速网络通信的场合。 在选择100G网卡时&#xff0c;…

排序算法(2)快排

交换排序 思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键值较大的记录向序列的尾部移动&#xff0c;键值较小的记录向序列的前部移动。 一、冒泡排序 public static…