查看“模组:制作指南/游戏基本架构”的源代码
←
模组:制作指南/游戏基本架构
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看和复制此页面的源代码。
{{模组:制作指南/header}} 本页面将简单阐述部分游戏内的概念以帮助您制作模组。配合[[模组:常见任务|常见问题]]食用体验更佳。 ==一些概念== ===图块 (Tiles)=== 星露谷是由一个个图块组成的。我们又为它们定义了自己的坐标,如 (0, 0)表示左上角。横坐标越往右值越大,纵坐标越往下值越大。 [[File:Modding - creating an XNB mod - tile coordinates.png]] ===位置 (Positions)=== {| class="wikitable" |- ! 定位方式 ! 参照点 ! 解释 |- | 图块坐标 (tile position) | 地图左上角 | 以'''[[#图块 (Tiles)|单元格]]'''为单位。通常用于物品放置,如:<tt>location.Objects</tt>。 |- | 绝对坐标 (absolute position) | 地图左上角 | 以'''像素'''为单位。用于更精确的测量,如:NPC的位置。 |- | 相对于屏幕的坐标 (screen position) | '''可见'''(visible) 的屏幕的左上角 | 以'''像素'''为单位。通常用于绘制。 |} 换算: {| class="wikitable" |- !colspan="3"| A → B ! 公式 |- | absolute || → || screen | <code>x - Game1.viewport.X, y - Game1.viewport.Y</code> |- | absolute || → || tile | <code>x / Game1.tileSize, y / Game1.tileSize</code> |- | screen || → || absolute | <code>x + Game1.viewport.X, y + Game1.viewport.Y</code> |- | screen || → || tile | <code>(x + Game1.viewport.X) / Game1.tileSize, (y + Game1.viewport.Y) / Game1.tileSize</code> |- | tile || → || absolute | <code>x * Game1.tileSize, y * Game1.tileSize</code> |- | tile || → || screen | <code>(x * Game1.tileSize) - Game1.viewport.X, (y * Game1.tileSize) - Game1.viewport.Y</code> |} ===Net类型的数据 (Net fields)=== 在源码中,有这样一种特殊的类型,它们都以<tt>Net</tt>作为前缀命名,因此得名'''net类型 (net type)'''。 在联机模式中,游戏正是通过这些net类型实现了'''在玩家之间同步数据'''。 每隔一段时间,游戏便会从<tt>Game1.netWorldState</tt>尽可能收集所有net数据,来与其他玩家同步。这表明,很多因模组做出的改变会自动被游戏同步。 尽管net类型自带隐式转换,如:<code>bool x = new NetBool(true);</code>,但并不稳定,很可能会跟你所想达成的目标有出入,如:<code>item?.category == null</code>和<code>item?.category != null</code> 有可能会同时为<tt>true</tt>。 因此,请'''避免用net类型的隐式转换'''。具体如何拿到对应的值见下表: {| class="wikitable" |- ! net类型 ! 说明 |- | <tt>NetBool</tt><br /><tt>NetColor</tt><br /><tt>NetFloat</tt><br /><tt>NetInt</tt><br /><tt>NetPoint</tt><br /><tt>NetString</tt> | 这些属于简单的net类型。通过<tt>field.Value</tt>拿到对应值。 |- | <tt>NetCollection<T></tt><br /><tt>NetList<T></tt><br /><tt>NetObjectList<T></tt> | <tt>T</tt>的集合。直接遍历 <code>foreach (T value in field)</code>。 |- | <tt>NetLongDictionary<TValue, TNetValue></tt><br /><tt>NetPointDictionary<TValue, TNetValue></tt><br /><tt>NetVector2Dictionary<TValue, TNetValue></tt> | 将<tt>Long</tt>, <tt>Point</tt>, 或<tt>Vector2</tt> 类型的键映射至 <tt>TValue</tt> (原类型) 和 <tt>TNetValue</tt> (用于同步的net类型)。遍历键值对,如:<code>foreach (KeyValuePair<Long, TValue> pair in field.Pairs)</code>。 |} ===缩放 (Zoom level)=== 玩家可以设置缩放等级,从75%到200%。这会影响屏幕上显示的像素大小。 {| class="wikitable" |- ! 缩放至最小 (75%) ! 缩放至最大 (200%) |- | [[File:Zoom level 75.png|300px]] | [[File:Zoom level 200.png|300px]] |} ====对于SMAPI模组的影响==== 缩放等级储存在<tt>Game1.options.zoomLevel</tt>中。游戏会自动调整坐标绘制大小,很少有情况需要你亲自调整。万一有,你可以<tt>position * (1f / Game1.options.zoomLevel)</tt>手动调。 ===UI缩放 (UI Scaling)=== 在1.5版本中,游戏加入了缩放UI的功能。这是一个独立于[[#缩放 (Zoom level)|上一节的缩放]]的新功能,特别用于缩放'''用户界面''',最小75%,最大150%。 {| class="wikitable" |- ! UI最小显示 (75%) ! UI最大显示 (150%) |- | [[File:UI scale 75.png|300px]] | [[File:UI scale 150.png|300px]] |} ====对于SMAPI模组的影响==== 游戏有两种缩放模式,UI 和 non-UI。当前模式储存在<code>Game1.uiMode</code>中。不要将两种模式混淆,这会带来复杂的计算。 下表是游戏使用两种缩放模式的不同情景: {| class="wikitable" |- ! 情景 ! 缩放模式 |- | [[模组:常见任务#菜单 (Active clickable menu)|菜单 (clickable menus)]] | UI模式 (通常) |- | [[模组:常见任务#HUD消息|HUD消息]] | UI模式 |- | [[模组:制作指南/APIs/Events#Display.RenderedActiveMenu|<tt>RenderingActiveMenu</tt>事件]]<br />[[模组:制作指南/APIs/Events#Display.RenderedActiveMenu|<tt>RenderedActiveMenu</tt>事件]] | UI模式 |- | [[模组:制作指南/APIs/Events#Display.Rendering|<tt>Rendering</tt>事件]]<br />[[模组:制作指南/APIs/Events#Display.Rendering|<tt>Rendered</tt>事件]] | 取决于具体上下文 |- | <tt>draw</tt>方法 | non-UI模式 |- | tile (non-pixel) coordinates | 不受UI缩放影响 |} 当游戏不在UI模式中,而你又想绘制UI时,请手动设置: <syntaxhighlight lang="c#"> Game1.game1.InUIMode(() => { // ... }); </syntaxhighlight> 在UI模式中,<tt>Game1.viewport</tt>通常可以替换成<tt>Game1.uiViewport</tt>。... // 未翻译 ==主要的类== ===Game1=== 游戏主要逻辑。 下面是一些重要的成员: {| class="wikitable" |- ! 字段、属性 ! 类型 ! 描述 |- | <tt>Game1.player</tt> | <tt>Farmer</tt> | 当前玩家。 |- | <tt>Game1.currentLocation</tt> | <tt>[[#GameLocation|GameLocation]]</tt> | 当前玩家所在的地点。 '''对于联机中客机玩家,在地点变化时可能为<tt>null</tt>。''' |- | <tt>Game1.locations</tt> | <tt>IList<[[#GameLocation|GameLocation]]></tt> | 所有地点。'''对于联机中客机玩家,请使用[[Modding:Modder Guide/APIs/Multiplayer#Get_active_locations|SMAPI的<tt>GetActiveLocations</tt>方法]]代替。''' |- | <tt>Game1.timeOfDay</tt><br /><tt>Game1.dayOfMonth</tt><br /><tt>Game1.currentSeason</tt><br /><tt>Game1.year</tt> | <tt>int</tt><br /><tt>int</tt><br /><tt>string</tt><br /><tt>int</tt> | 当前时间、日期、季节、年份。另见[[Modding:Modder Guide/APIs/Utilities#Dates|SMAPI的日期工具类]]。 |- | <tt>Game1.itemsToShip</tt> | <tt>IList<Item></tt> | 不要用这个,这是存档逻辑的一部分。请用<tt>Game1.getFarm().getShippingBin(Farmer)</tt>。 |- | <tt>Game1.activeClickableMenu</tt> | <tt>IClickableMenu</tt> | 当前显示的菜单。 |} ===GameLocation=== 表示地点,内有地图、物品、角色、动植物等等数据。下表是一些重要的成员: {| class="wikitable" |- ! 字段、属性 ! 类型 ! 描述 |- | <tt>Name</tt> | <tt>string</tt> | 唯一名称。(这对于建筑室内并不唯一,见<tt>uniqueName</tt>。) |- | <tt>IsFarm</tt> | <tt>bool</tt> | 是否为农场(农场内可种植作物)。 |- | <tt>IsGreenhouse</tt> | <tt>bool</tt> | 是否为温室(温室内可种植作物,且全年可生长)。 |- | <tt>IsOutdoors</tt> | <tt>bool</tt> | 是否为室外。 |- | <tt>characters</tt> | [[#Net类型的数据 (Net fields)|<tt>NetCollection</tt>]] of <tt>NPC</tt> | 该地点中的村民、宠物、马、怪物。 |- | <tt>critters</tt> (private) | <tt>List</tt> of <tt>Critter</tt> | 该地点中暂时的鸟、松鼠等等,用于衬托景色。 |- | <tt>debris</tt> | [[#Net类型的数据 (Net fields)|<tt>NetCollection</tt>]] of <tt>Debris</tt> | 掉落物(漂浮的物品)。 |- | <tt>farmers</tt> | <tt>FarmerCollection</tt> | 该地点中的玩家。 |- | <tt>Objects</tt> | <tt>OverlaidDictionary</tt> | 该地点中所有物品。(<tt>OverlaidDictionary</tt>实际上是一个[[#Net类型的数据 (Net fields)|<tt>NetVector2Dictionary</tt>]],并额外增加了show certain quest items over pre-existing objects 的逻辑。) |- | <tt>terrainFeatures</tt> | [[#Net类型的数据 (Net fields)|<tt>NetVector2Dictionary</tt>]] of <tt>TerrainFeature</tt> | 该地点中的树、果树、草、泥土地(其中包括农作物)、地板等等。 |- | <tt>waterTiles</tt> | <tt>bool[,]</tt> | 一个多维数组表示地图图块是否为代表河/湖。如:<code>if (location.waterTiles[10, 20])</code>将检查坐标为(10, 20)的图块。 |} ====BuildableGameLocation==== <tt>GameLocation</tt>的子类。表示'''支持建造建筑'''的地点。原版游戏中,只有<tt>Farm</tt>是<tt>BuildableGameLocation</tt>。下面是一些重要的成员: {| class="wikitable" |- ! 字段 ! 类型 ! 描述 |- | <tt>buildings</tt> | [[#Net类型的数据 (Net fields)|<tt>NetCollection</tt>]] of <tt>Building</tt> | 该地点中的建筑。 |} ====Farm==== <tt>GameLocation</tt>和<tt>BuildableGameLocation</tt>的子类。玩家可在农场中养动物、种庄稼。原版游戏中,Farm类型的实例地点只有一个(<tt>Game1.getFarm();</tt>)。下面是一些重要的成员: {| class="wikitable" |- ! 字段、属性 ! 类型 ! 描述 |- | <tt>animals</tt> | [[#Net fields|<tt>NetLongDictionary</tt>]] of <tt>FarmAnimal</tt> | The farm animals currently in the location. |- | <tt>resourceClumps</tt> | [[#Net类型的数据 (Net fields)|<tt>NetCollection</tt>]] of <tt>ResourceClump</tt> | 该地点中的巨大作物、木桩、大石块、陨石。 |- | <tt>piecesOfHay</tt> | [[#Net类型的数据 (Net fields)|<tt>NetInt</tt>]] | 筒仓中储存的稻草数量。 |- | <tt>shippingBin</tt> | [[#Net类型的数据 (Net fields)|<tt>NetCollection</tt>]] of <tt>Item</tt> | 出货箱里的物品。 |} [[en:Modding:Modder Guide/Game Fundamentals]]
该页面使用的模板:
模组:制作指南/header
(
查看源代码
)
返回至
模组:制作指南/游戏基本架构
。
导航菜单
个人工具
创建账户
登录
名字空间
模组
讨论
不转换
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
台灣正體
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
未翻译的页面
帮助:编辑入门
随机页面
官方链接
官方网站
官方论坛
官方商品
Discord
Reddit
工具
链入页面
相关更改
上传文件
特殊页面
页面信息