十九菜单和设置开发文档

在JewelJam游戏中,您看到了一些向游戏中添加GUI元素的基本示例,如按钮或框架。在这一章中,您将向PenguinPairs游戏添加一些GUI元素,例如开/关按钮和滑块按钮。您还将看到如何读取和存储游戏设置,如音乐音量和是否允许提示。

设置菜单

当想到菜单时,你可能会想到下拉菜单(如文件或编辑)或应用顶部的按钮。但是,菜单可以是灵活的,尤其是在游戏中,菜单通常是按照游戏的风格设计的,并且在许多情况下可以覆盖部分屏幕甚至整个屏幕。作为一个例子,让我们看看如何定义一个包含两个控件的基本选项菜单屏幕:一个用于打开或关闭提示,另一个用于控制音乐的音量。首先,您需要绘制这些控件周围的元素。向菜单添加背景,然后添加文本标签来描述提示控件。你可以使用宝石果酱游戏中的Label类来实现。你定义应该绘制的文本,并把它放在适当的位置(下面的代码摘自PenguinPairsGameWorld):

varbackground=newSpriteGameObject(sprites.background_options,ID.layer_background);this.add(background);varonOffLabel=newLabel("Arial","60px",ID.layer_overlays);onOffLabel.text="Hints";onOffLabel.position=newVector2(150,360);onOffLabel.color=Color.darkBlue;this.add(onOffLabel);同样,为音乐音量控制器添加一个文本标签。有关完整代码,请参见本章的PenguinPairs2示例。

添加开/关按钮

按钮的一个重要方面是你需要能够读取和设置它是开还是关。因为按钮基于长度为2的sprite条,所以您可以定义如果工作表索引为0,按钮处于off状态,如果工作表索引等于1,按钮处于on状态。然后,您可以添加一个获取和设置该值的布尔属性。该属性的定义如下:

Object.defineProperty(OnOffButton.prototype,"on",{get:function(){returnthis.sheetIndex===1;},set:function(value){if(value)this.sheetIndex=1;elsethis.sheetIndex=0;}});最后,您需要处理按钮上的鼠标点击,以切换按钮的开和关状态。与您在Button类中所做的类似,您在handleInput方法中检查鼠标左键是否被按下,以及鼠标位置是否在按钮的边界框内。对于触摸输入,您遵循类似的过程。如果播放器已按下按钮,则需要修改纸张索引。如果表索引是0,它应该变成1,反之亦然。下面是完整的handleInput方法:

OnOffButton.prototype.handleInput=function(delta){if(!this.visible)return;if(Touch.containsTouchPress(this.boundingBox)||Mouse.containsMousePress(this.boundingBox))this.sheetIndex=1-this.sheetIndex;};请注意,只有当按钮可见时才处理输入。在PenguinPairsGameWorld类中,你添加一个OnOffButton实例到游戏世界,在期望的位置:

添加滑块按钮

接下来添加第二种GUI控件:滑块。这个滑块将控制游戏中背景音乐的音量。它由两个sprite组成:一个代表工具条的backsprite和一个代表实际滑块的frontsprite。因此,Slider类继承自GameObjectList。因为backsprite有边框,所以在移动或绘制滑块时需要考虑到这一点。因此,您还需要定义左右边距,这些边距定义了backsprite左右两侧的边框宽度。您还可以将滑块定位在比背景精灵略低的位置,以适应顶部边框。完整的构造函数如下:

functionSlider(sliderback,sliderfront,layer){GameObjectList.call(this,layer);this.dragging=false;this.draggingId=-1;this.leftmargin=5;this.rightmargin=7;this.back=newSpriteGameObject(sliderback);this.front=newSpriteGameObject(sliderfront,1);this.front.position=newVector2(this.leftmargin,8);this.add(this.back);this.add(this.front);}正如你所看到的,你还设置了一个布尔变量dragging为false和一个变量draggingId为-1。您需要这些变量来跟踪玩家何时拖动滑块以及触摸ID是什么,以便在需要时更新滑块位置,即使鼠标指针/触摸位置不在backsprite的边界内。

下一步是添加一个属性value,允许您检索和设置滑块的值。您希望值为0表示滑块完全移动到左侧,值为1表示滑块完全移动到右侧。你可以通过查看前精灵的位置来计算当前值,并查看它向右移动了多少。因此,以下代码行根据滑块位置计算滑块值:

return(this.front.position.x-this.back.position.x-this.leftmargin)/(this.back.width-this.front.width-this.leftmargin-this.rightmargin);在分数的上半部分,计算前面的精灵向右移动了多远。您可以根据后面的位置加上左边距来计算。然后用它除以滑块可以移动的总长度。这条return指令形成了tT5【何】T1value房产的一部分。对于属性的set部分,您需要将一个介于零和一之间的值转换为前滑块x-位置。这相当于重写先前的公式,使得前x位置是未知的,然后计算如下:

varnewxpos=value*(this.back.width-this.front.width-this.leftmargin–this.rightmargin)+this.back.position.x+this.leftmargin;剩下要做的就是用正确的x位置创建新的前方位置向量:

this.front.position=newVector2(newxpos,this.front.position.y);现在您已经有了设置和获取滑块值的方法,您需要编写代码来处理玩家输入。类似于你在以前的课程中所做的,你分别处理触摸和鼠标输入。对于每种类型的输入,添加一个特定的方法,然后从handleInput方法中调用:

Slider.prototype.handleInput=function(delta){GameObjectList.prototype.handleInput.call(this,delta);if(Touch.isTouchDevice){this.handleInputTouch(delta);}else{this.handleInputMouse(delta);}};您仍然需要处理触摸输入来将滑块拖动到新的位置。第一步是检查玩家是否正在触摸屏幕。如果不是这样,您只需将拖动状态变量重置为初始值,就大功告成了:

if(!Touch.isTouching){this.dragging=false;this.draggingId=-1;return;}如果执行了写在这个if指令之后的指令,你就知道玩家正在触摸屏幕。

你需要检查玩家是否真的触摸了按钮。如果是这种情况,您可以为拖动状态变量指定新值:

if(Touch.containsTouch(this.back.boundingBox)){this.draggingId=Touch.getIndexInRect(this.back.boundingBox);this.dragging=true;}如果玩家正在拖动,最后一步是更新滑块位置。第一步是检索玩家触摸屏幕的位置:

vartouchPos=Touch.getPosition(this.draggingId);接下来你计算滑块的x位置应该是什么。因为触摸位置是在世界坐标中,所以从它减去backsprite的世界位置来获得滑块的局部位置。你还要从这个数字中减去滑块宽度的一半,这样玩家触摸屏幕的地方就在滑块的中心。这是使用以下表达式计算的:

touchPos.x-this.back.worldPosition.x-this.front.width/2但是,您需要做更多的工作,因为您必须确保滑块不能移动到其范围之外。因此,您需要将滑块位置固定在一定范围内。在JavaScript中,您可以动态地用额外的方法来扩充对象,所以让我们给可以执行这个箝位操作的Math对象添加一个方法:

Math.clamp=function(value,min,max){if(valuemax)returnmax;elsereturnvalue;};现在您使用该方法来计算滑块的箝位值,并将其存储为滑块的新x-位置:

this.front.position.x=Math.clamp(touchPos.x-this.back.worldPosition.x-this.front.width/2,this.back.position.x+this.leftmargin,this.back.position.x+this.back.width-this.front.width–this.rightmargin);这就完成了处理触摸输入的代码。

你用非常相似的方式处理鼠标输入。看看Slider类,看看完整的handleInputTouch和handleInputMouse方法。

在PenguinPairs类中,你给游戏世界添加了一个滑块:

this.musicSlider=newSlider(sprites.slider_bar,sprites.slider_button,ID.layer_overlays);this.musicSlider.position=newVector2(650,500);this.add(this.musicSlider);然后,您可以使用该类中的value属性来设置滑动条,使其与背景音乐的当前音量相匹配,只需一行代码:

this.musicSlider.value=sounds.music.volume;最后,在PenguinPairsGameWorld类的update方法中,您检索滑块的当前值,并使用它来更新背景音乐的音量:

sounds.music.volume=this.musicSlider.value;注意大多数游戏都包含一些菜单屏幕。通过这些屏幕,玩家可以设置选项、选择关卡、观看成就和暂停游戏。创建所有这些额外的屏幕可能是大量的工作,对实际的游戏没有贡献,所以开发者倾向于在它们上面投入较少的精力。但这是一个非常错误的决定。

一位艺术家曾经说过,“你的游戏和它最差的屏幕一样好。”如果其中一个菜单屏幕质量很差,玩家会觉得游戏没有完成,开发者没有付出足够的努力。因此,确保你所有的菜单屏幕看起来漂亮,易于使用和导航。

仔细想想你在这些屏幕里放了什么。你可能会想为所有的东西创建选项:游戏的难度、播放的音乐、背景的颜色等等。但是请记住,你是应该创造游戏的人,而不是玩家。你或你的艺术家应该决定什么能给游戏带来最有趣的玩法和最引人注目的视觉风格,而不是用户。

尽量避免选项。比如玩家真的应该设置难度吗?难道不能通过监控玩家的进度来自动适应难度吗?你真的需要一个关卡选择屏幕吗?你不能简单地记起玩家最后一次在哪里,然后立即在那里继续吗?让你的界面尽可能简单!

读取和存储游戏设置

varGameSettings={hints:true};这个变量现在随处可见。但是,请注意,它不会在游戏中持续存在:如果您关闭游戏,稍后在浏览器中打开它,该变量将默认为其原始设置。在第21章中,你会看到一种跨不同游戏维护数据的方法。

在选项菜单中,确保该变量的值始终与提示按钮的状态相同。这是在PenguinPairsGameWorld的update方法中完成的,您使用添加到按钮的on属性:

THE END
1.MFC更改菜单项标题(菜单文本)mfc如何修改菜单标题MFC更改菜单项标题(菜单文本) 做个记录,备忘。 CMenu *subMenu =AfxGetMainWnd()->GetMenu()->GetSubMenu(0);// 0:第一列菜单 subMenu->ModifyMenu(0, MF_BYPOSITION, ID_MENU_ONOFF, _T("打开(&O)"));// 0:第一列菜单下第1个子菜单 其中,(&O)为设置快捷键。https://blog.csdn.net/WU9797/article/details/81135216
2.英文菜单制作.docx英文菜单制作.docx,. . . . 一、作业内容 Menu 英文菜单制作 二、作业要求 作业准备要求: 熟悉菜名的常用表达方式 选择地方特色菜为主要内容作业完成形式: 英文菜单 成果形式: 英文菜单打印稿 作业过程要求: 步骤一:回顾食物/菜名的常用表达方式步骤二:确定地方特色菜https://m.book118.com/html/2023/1110/8137132117006004.shtm
3.美食菜单Word模板美食菜单Word模板下载熊猫办公网站共为您提供91个美食菜单设计素材以及精品美食菜单Word模板下载,汇集全球精品流行的美食菜单Word完整版模板,下载后直接替换文字图片即可使用,方便快捷的不二选择。https://m.tukuppt.com/wordmuban/meishicaidan.html
4.在网页中实现折叠式菜单的ASP通用程序菜单文本文件 本文约定菜单文本文件内容必须遵循以下规则:描述一个菜单选项的名称必须有三行内容(见下例);文件中不允许有空行;菜单选项名称前可以有空格,但必须用空格键(space)形成,不能用tab键;文件的结尾用两行“*end*”来完成。 假设有如下的三级菜单: https://www.west.cn/www/info/10764-1.htm
5.shell笔记>脚本使用shell创建文本菜单和窗口部件创建文本菜单 创建交互式shell脚本最常用的方法是使用菜单,它提供了各种选项帮助脚本用户了解脚本能做到的和不能做的。 shell脚本菜单的核心是case命令,该命令会根据用户在菜单上的选择来执行特定命令。 下面我们逐步了解和创建基于菜单的shell脚本的步骤。 https://www.jianshu.com/p/6eff4c0bf0d8
6.菜单系统范文12篇(全文)本文提出了关于中英文菜单翻译系统的设计与开发以及关于餐饮业菜名规范的方法。意在为我国呼吁我国南粤餐饮业形成一个规范菜名及其翻译的参考, 并给外国友人提供一个简单、易用的菜单翻译软件, 从而让国外食客更好地了解中国菜名的意义, 更好的促进饮食文化交流。除了在广东地区范围内以问卷方式参加社会调研, 该系统的https://www.99xueshu.com/w/ikeyx4fsfigg.html
7.如何设置菜单大小javamob64ca12eb7baf的技术博客通过设置菜单的大小和调整文本显示,我们可以显著提高Java应用程序的用户界面友好性。菜单组件的设计并不仅仅是为了美观,合理的设计能够提高用户的操作效率和满意度。 在本文中,我们讨论了如何创建菜单、调整其大小的方法,并提供了实例代码。此外,我们通过ER图和序列图展示了菜单项的相关结构和交互过程。通过这些手段,我们https://blog.51cto.com/u_16213411/11677775
8.编辑菜单模板要编辑菜单模板,选择编辑选项卡中的选项或单击预览窗口中的菜单对象。您还可以添加新文本、修饰和注解菜单。自定义模板可保存为新的菜单模板。 如果制作 Blu-ray 光盘,您可以创建无需中断回放即可使用的高级菜单。这表示,用户可以在观看影片的同时浏览光盘的内容。 http://help.corel.com/videostudio/v26/Corel-VideoStudio-zh-Hans/videostudio/h2-editing-menu-template.html
9.集成接口·致远开放平台--菜单添加的功能模块(页面),与页面Controller中定义的的名称相同,可以在多个页面 中添加同一菜单项 --> <property name="module"> <list> <value>apps/doc/rightNew</value> </list> </property> <!--菜单文本,在资源文件中的名称。 --> <property name="label" value="doc.menu.export.label"/> <http://open.seeyon.com/book/ctp/ji-cheng-chang-jing/portalji-cheng.html
10.菜单列表全屏使当前浏览的页面充满整个屏幕,右键菜单将被禁止 工具手形当前页面上的光标变成手的形状,可以随意拖动页面,也可以点击打开链接 文本选择当前页面上的光标变成文本选择的形状,按下鼠标左键可以按行选择文本 选择对象当前页面上的光标变成选择对象的形状,可以选中标注 https://cajviewer.cnki.net/cajviewer7/help/cajviewer7/allmenu.htm
11.华为计算机桌面右键菜单无法新建文本文档华为官网华为官网提供手机、平板、笔记本、智慧屏、智能穿戴等产品常见故障问题解答和使用技巧, 查看更多'华为计算机桌面右键菜单无法新建文本文档'相关信息.https://consumer.huawei.com/cn/support/content/zh-cn15863381/
12.桌面右键新建菜单没有“文本文档”选项的解决桌面右键新建菜单“文本文档”选项突然消失不见了,怎么办? 小编带你来通过注册表的方法修复。 1.reg的内容为: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.txt] @="txtfile" "Content Type"="text/plain" "PerceivedType"="text" [HKEY_CLASSES_ROOT\.txt\PersistentHandler] @="{5e941d80-bfhttps://www.baiyunxitong.com/bangzhu/3650.html
13.自定义菜单介绍编辑回复信息内容,支持纯文本、图片、图文和语音。 2.4 触发关键词 【版本】标准版及以上版本可使用。 支持设置触发关键词,设置后用户点击菜单触发关键词,在公众号窗口返回对应关键词匹配的回复内容。 注意:输入关键词后要按下回车键(Enter),否则会提示“触发关键词不能为空”。 https://m.hqgkj.cn/h-nd-831.html
14.Vuetifyvselect菜单涵盖文本字段输入我不希望菜单覆盖输入框。我的 Vuetify 版本是 2.3.18。我该如何解决?我发现了这个,但它对我不起作用: https ://codepen.io/jrast/pen/NwMaZE?editors=1010我发现了一个 Vuetify github 错误: https ://github.com/vuetifyjs/vuetify/issues/2377Vuetify v-selectCodepen 示例: https://codepen.io/zmrqohttps://www.imooc.com/wenda/detail/724167
15.适用于Mac的文本编辑使用手册将多信息文本文稿转换为其他格式 通过“文本编辑”,你可以打开和编辑在其他文字处理 App(包括 Microsoft Word 和 OpenOffice)中创建的多信息文本文稿。还可以将文稿以其他格式进行存储,从而与其他 App 兼容。 如何打开、编辑和转换文稿 创建和编辑 HTML 文稿 https://support.apple.com/zh-cn/guide/textedit/welcome/mac
16.辐射4MCM菜单汉化指南及开源文本编辑工具NotePad++下载ModV1.0在3DM Mod站下载辐射4最新的 MCM菜单汉化指南及开源文本编辑工具NotePad++下载 Mod,由未知 制作。杰克罗姆在我们的平台上分享了这个免费且高质量的游戏模组,让玩家们可以享受到更加丰富的游戏体验。快来3DM Mod站下载并尝试吧! 详细介绍 Mod作者: 未知 Mod版本: 1.0 Mod大小: 7.72 MB 更新时间: 2018-07-14 13:https://mod.3dmgame.com/mod/34482
17.html文本编辑器(很实用)菜单文本:Run命令:$(FileNameNoExt)参数:初始目录:$(FileDir)【15】工具集成——让Editplus调试PHP程序1:打开Editplus,选择"工具->配置用户工具"菜单。2:在弹出的窗口中选择"添加工具->应用程序",给新程序起一个好记的 名字,比如这里我们用"Debug PHP",在"菜单文本"中输入"Debug PHP"。点击"命令行"https://www.360docs.net/doc/47fe3c05bed5b9f3f90f1cec.html