“模组:常用方法”的版本间的差异

来自Stardew Valley Wiki
跳到导航 跳到搜索
第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|获取有效的地点]]。

2021年6月9日 (三) 11:53的版本

目录

此页面展示了制作SMAPI模组时常见的任务。在阅读时,请结合参考模组制作入门游戏基本架构

基础技巧

追踪一个值的变化

在写模组时,你可能常常需要了解一个值的变化(什么时候变,变化前后的值分别是多少,等等)。如果该值没有包括在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) 方法。

地点

游戏基本架构#地点

获取所有地点

Game1.locations属性中储存着主要的地点,但是不包括建筑的室内。以下这个方法提供了主玩家的所有地点。 <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>

注意:联机中客机是拿不到所有地点的。见获取有效的地点