“模组:常用方法”的版本间的差异
第13行: | 第13行: | ||
物品 代表那些能够放在背包里的东西,比如说工具、农作物等等。 | 物品 代表那些能够放在背包里的东西,比如说工具、农作物等等。 | ||
− | ===创建一个物品的实例 | + | ===创建一个物品的实例(Object)=== |
Object中所有的构造函数: | Object中所有的构造函数: | ||
− | < | + | <syntaxhighlight lang="c#"> |
public Object(Vector2 tileLocation, int parentSheetIndex, int initialStack); | public Object(Vector2 tileLocation, int parentSheetIndex, int initialStack); | ||
public Object(Vector2 tileLocation, int parentSheetIndex, bool isRecipe = false); | public Object(Vector2 tileLocation, int parentSheetIndex, bool isRecipe = false); | ||
第26行: | 第26行: | ||
===在地上生成物品=== | ===在地上生成物品=== | ||
− | < | + | <syntaxhighlight lang="c#"> |
public virtual bool dropObject(Object obj, Vector2 dropLocation, xTile.Dimensions.Rectangle viewport, bool initialPlacement, Farmer who = null); | public virtual bool dropObject(Object obj, Vector2 dropLocation, xTile.Dimensions.Rectangle viewport, bool initialPlacement, Farmer who = null); | ||
第34行: | 第34行: | ||
===添加物品到背包=== | ===添加物品到背包=== | ||
− | < | + | <syntaxhighlight lang="c#"> |
// You can add items found in ObjectInformation using: | // You can add items found in ObjectInformation using: | ||
Game1.player.addItemByMenuIfNecessary((Item)new StardewValley.Object(int parentSheetIndex, int initialStack, [bool isRecipe = false], [int price = -1], [int quality = 0])); | Game1.player.addItemByMenuIfNecessary((Item)new StardewValley.Object(int parentSheetIndex, int initialStack, [bool isRecipe = false], [int price = -1], [int quality = 0])); | ||
</syntaxhightlight> | </syntaxhightlight> | ||
例2: | 例2: | ||
− | < | + | <syntaxhighlight lang="c#"> |
// Add a weapon directly into player's inventory | // Add a weapon directly into player's inventory | ||
const int WEAP_ID = 19; // Shadow Dagger -- see Data/weapons | const int WEAP_ID = 19; // Shadow Dagger -- see Data/weapons | ||
第53行: | 第53行: | ||
在大多数情况下,仅需调用 .removeItemFromInventory(Item) 方法。 | 在大多数情况下,仅需调用 .removeItemFromInventory(Item) 方法。 | ||
− | ==地点== | + | ==地点(Locations)== |
见 [[模组:制作指南/游戏基本架构#地点|游戏基本架构#地点]]。 | 见 [[模组:制作指南/游戏基本架构#地点|游戏基本架构#地点]]。 | ||
==获取所有地点== | ==获取所有地点== | ||
<tt>Game1.locations</tt>属性中储存着主要的地点,但是不包括建筑的室内。以下这个方法提供了主玩家的所有地点。 | <tt>Game1.locations</tt>属性中储存着主要的地点,但是不包括建筑的室内。以下这个方法提供了主玩家的所有地点。 | ||
− | < | + | <syntaxhighlight lang="c#"> |
/// <summary>Get all game locations.</summary> | /// <summary>Get all game locations.</summary> | ||
public static IEnumerable<GameLocation> GetLocations() | public static IEnumerable<GameLocation> GetLocations() | ||
第73行: | 第73行: | ||
遍历: | 遍历: | ||
− | < | + | <syntaxhighlight lang="c#"> |
foreach (GameLocation location in this.GetLocations()) | foreach (GameLocation location in this.GetLocations()) | ||
{ | { |
2021年6月9日 (三) 11:59的版本
← 目录
页面仍需完善
该页面不完善且缺少信息。您可以通过扩充内容来帮助我们。 |
此页面展示了制作SMAPI模组时常见的任务。在阅读时,请结合参考模组制作入门和游戏基本架构。
基础技巧
追踪一个值的变化
在写模组时,你可能常常需要了解一个值的变化(什么时候变,变化前后的值分别是多少,等等)。如果该值没有包括在SMAPI内置的事件 (event)中,那么你可以为该值创建一个私有变量,然后在SMAPI的update tick事件中刷新此变量,以达到追踪值变化的目的。
示例见:[模组:制作指南/APIs/Events#变化监控]
物品 (Items)
物品 代表那些能够放在背包里的东西,比如说工具、农作物等等。
创建一个物品的实例(Object)
Object中所有的构造函数:
<syntaxhighlight lang="c#">
public Object(Vector2 tileLocation, int parentSheetIndex, int initialStack); public Object(Vector2 tileLocation, int parentSheetIndex, bool isRecipe = false); public Object(int parentSheetIndex, int initialStack, bool isRecipe = false, int price = -1, int quality = 0); public Object(Vector2 tileLocation, int parentSheetIndex, string Givenname, bool canBeSetDown, bool canBeGrabbed, bool isHoedirt, bool isSpawnedObject);
</syntaxhightlight>
parentSheetIndex为该物品的ID(储存在 ObjectInformation.xnb 文件中)。
在地上生成物品
<syntaxhighlight lang="c#"> public virtual bool dropObject(Object obj, Vector2 dropLocation, xTile.Dimensions.Rectangle viewport, bool initialPlacement, Farmer who = null);
// 调用: Game1.getLocationFromName("Farm").dropObject(new StardewValley.Object(itemId, 1, false, -1, 0), new Vector2(x, y) * 64f, Game1.viewport, true, (Farmer)null);
</syntaxhightlight>
添加物品到背包
<syntaxhighlight lang="c#"> // You can add items found in ObjectInformation using:
Game1.player.addItemByMenuIfNecessary((Item)new StardewValley.Object(int parentSheetIndex, int initialStack, [bool isRecipe = false], [int price = -1], [int quality = 0]));
</syntaxhightlight> 例2: <syntaxhighlight lang="c#"> // Add a weapon directly into player's inventory
const int WEAP_ID = 19; // Shadow Dagger -- see Data/weapons Item weapon = new MeleeWeapon(WEAP_ID); // MeleeWeapon is a class in StardewValley.Tools Game1.player.addItemByMenuIfNecessary(weapon);
// Note: This code WORKS.
</syntaxhightlight>
从背包移除物品
取决于你背包的具体情况。很少有情况需要你亲自来调用,因为相关的方法在Farmer类中已经有了。
在大多数情况下,仅需调用 .removeItemFromInventory(Item) 方法。
地点(Locations)
见 游戏基本架构#地点。
获取所有地点
Game1.locations属性中储存着主要的地点,但是不包括建筑的室内。以下这个方法提供了主玩家的所有地点。 <syntaxhighlight lang="c#"> /// <summary>Get all game locations.</summary> public static IEnumerable<GameLocation> GetLocations() {
return Game1.locations .Concat( from location in Game1.locations.OfType<BuildableGameLocation>() from building in location.buildings where building.indoors.Value != null select building.indoors.Value );
} </syntaxhightlight>
遍历: <syntaxhighlight lang="c#"> foreach (GameLocation location in this.GetLocations()) {
// ...
} </syntaxhightlight>
注意:联机中客机是拿不到所有地点的。见获取有效的地点。