第7行: |
第7行: |
| ===追踪一个值的变化=== | | ===追踪一个值的变化=== |
| 在写模组时,你可能常常需要了解一个值的变化(什么时候变,变化前后的值分别是多少,等等)。如果该值没有包括在SMAPI内置的'''事件''' (event)中,那么你可以为该值创建一个私有变量,然后在SMAPI的update tick事件中刷新此变量,以达到追踪值变化的目的。 | | 在写模组时,你可能常常需要了解一个值的变化(什么时候变,变化前后的值分别是多少,等等)。如果该值没有包括在SMAPI内置的'''事件''' (event)中,那么你可以为该值创建一个私有变量,然后在SMAPI的update tick事件中刷新此变量,以达到追踪值变化的目的。 |
| + | |
| + | 示例见:[模组:制作指南/APIs/Events#变化监控] |
| + | |
| + | ==物品 (Items)== |
| + | 物品 代表那些能够放在背包里的东西,比如说工具、农作物等等。 |
| + | |
| + | ===创建一个物品的实例(类型:Object)=== |
| + | Object中所有的构造函数: |
| + | |
| + | <syntaxhightlight 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 文件中)。 |
| + | |
| + | ===在地上生成物品=== |
| + | <syntaxhightlight 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> |
| + | |
| + | ===添加物品到背包=== |
| + | <syntaxhightlight 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: |
| + | <syntaxhightlight 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) 方法。 |
| + | |
| + | ==地点== |
| + | 见 [[模组:制作指南/游戏基本架构#地点|游戏基本架构#地点]]。 |
| + | |
| + | ==获取所有地点== |
| + | <tt>Game1.locations</tt>属性中储存着主要的地点,但是不包括建筑的室内。以下这个方法提供了主玩家的所有地点。 |
| + | <syntaxhightlight 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> |
| + | |
| + | 遍历: |
| + | <syntaxhightlight lang="c#"> |
| + | foreach (GameLocation location in this.GetLocations()) |
| + | { |
| + | // ... |
| + | } |
| + | </syntaxhightlight> |
| + | |
| + | 注意:联机中客机是拿不到所有地点的。见[[模组:制作指南/APIs/Multiplayer#Get active locations|获取有效的地点]]。 |