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