Navigation

第 4 部分 - 方法、属性和插件事件

切记,在任何时候您都可以在 GitHub 读取完整插件 API 文件资料

插件触发四个关键事件:

  1. start : 开始
  2. stop : 停止
  3. pending : 待定
  4. progress : 进展

您可以从游戏代码中收听这些内容,因为游戏网络货币化插件是一个事件发射器。这意味着您可以直接在插件上使用以下方法:

once('event-name', eventHandler, context);
on('event-name', eventHandler, context);
off('event-name', eventHandler, context);

如果您喜欢更详细内容,可以使用 addListener 代替 on,使用 removeListener 代替 off。我们在以下代码中使用精简版本。

START 事件

当网络货币化 API 成功启动时,将触发此事件。

若要使用它,可以将自己的监听器绑定到 GameWebMonetization.START 事件:

gameWebMonetization.on(GameWebMonetization.START, (event) => {
    // Your handler
});

小贴士:记得在插件上调用 start() 之前 执行此操作!

为了测试此操作,让其在事件触发时登出一些信息,然后转到控制台,这样我们就可以在浏览器Dev Tools 中观察其返回的内容:

将以下代码添加到 main.js 文件中,然后 调用 gameWebMonetization.start()

gameWebMonetization.on(GameWebMonetization.START, (event) => {
    console.log(event);
});

如果您正在测试,应该在 Dev Tools 控制台中看到以下内容:

事件开始结果

发送事件处理程序,即包含以下属性的对象:

属性 详细信息
paymentPointer 您的付款账户 URL。标记中的内容使用相同的值。
requestId 该值与用户代理生成的会话 ID/货币化 ID (UUID v4) 相同。

您可能已经注意到我们收到 paymentPointerrequestId

您可以使用start事件来了解您的游戏正在货币化。此时,您可以向玩家显示信息,感谢他们,或者解锁一些额外内容。

重要信息:每当您改变浏览器窗口或切换到另一个浏览器标签时,货币化就会停止。玩家返回窗口时,start事件再次触发。所以要注意游戏代码中的此流程,并适当处理它。

isMonetized

start事件有助于了解货币化何时开始,但如果您想要检查游戏是否在代码中更深入的地方货币化?

为此,您可以使用 isMoneized 布尔属性。

您可以在游戏中的任何一点检查该属性,为“这名玩家是否为我们创收”这一问题提供简单的正确/错误回答。

我们通过将 main.js 修改为控制台,来记录 start 事件前后属性状态:

var gameWebMonetization = new GameWebMonetization({
    paymentPointer: '$ilp.uphold.com/zdXzL8aWJ4ii'
});

gameWebMonetization.start();

// New code:
console.log('Is monetized? ', gameWebMonetization.isMonetized);

// New code:
gameWebMonetization.on(GameWebMonetization.START, (event) => {
    console.log('[inside event start] - Is monetized? ', gameWebMonetization.isMonetized);
});

如果您测试此代码,会发现在货币化开始之前,属性为 错误,在 start 事件触发后,它会切换到 正确

isMonetized 结果

您可以在游戏中的任何一点查看 isMonetized属性。插件在内部对该属性予以更新,因此用于奖励玩家特殊奖品或游戏内福利是很安全的。

了解当前状态

插件在其生命周期内经历不同的状态:

  1. 开始 -插件已经成功启动,并在货币化您的内容。
  2. 停止 -插件当前已停止,不再货币化您的内容。
  3. 待定 -已要求启动插件,并且在尝试协商启动,但是尚未完成这一步。

若要了解当前状态,可以查询 state 属性。

我们采用与 isMonetized 同样的方法来查看 state。以下是更新的 main.js 来测试该内容:

import { GameWebMonetization } from './GameWebMonetization.js';

var gameWebMonetization = new GameWebMonetization({
    paymentPointer: '$ilp.uphold.com/zdXzL8aWJ4ii'
});

gameWebMonetization.start();

// New code
console.log('The state: ', gameWebMonetization.state);

gameWebMonetization.on(GameWebMonetization.START, (event) => {
    // New code
    console.log('[inside event start] - The state: ', gameWebMonetization.state);
});

在控制台中会看到以下内容:

状态

访问插件状态,方便内部调试。

PENDING 事件

当网络货币化 API 准备开始货币化您的网络时,此事件就被触发。您调用插件上的 start 方法之后,此事件就被触发。该 API 进入“待定”状态,意味着它目前正在协商从您的支付指示器开始,但还没有完成该操作。如果协商成功,插件就会触发START事件。

我们编辑 main.js 来演示此状态:

import { GameWebMonetization } from './GameWebMonetization.js';

var gameWebMonetization = new GameWebMonetization({
    paymentPointer: '$ilp.uphold.com/zdXzL8aWJ4ii'
});

gameWebMonetization.start();

console.log('The state: ', gameWebMonetization.state);

// New code
gameWebMonetization.on(GameWebMonetization.PENDING, (event) => {
    console.log('[inside event pending] - The state: ', gameWebMonetization.state);
});

gameWebMonetization.on(GameWebMonetization.START, (event) => {
    console.log('[inside event start] - The state: ', gameWebMonetization.state);
});

如果我们打开浏览器,会看到以下内容:

待定事件

查看控制台日志,就可以看到运行中的 API 流。

如果您的支付指示器出现连接问题,则流程将是 PENDING,然后是 STOP 事件。如果连接成功,流程将是 PENDING,然后是 START 事件。

如果出现网络错误,例如 wifi 退出,而请求仍然是 PENDING,则将无限期保持这种状态,永远不会到达 STOP 事件。所以,始终在游戏代码中使用 isMonetized 布尔值,了解_当前_货币化状态。

PROGRESS 事件

网络货币化 API 成功连接到您的支付指示器时,它将开始将小额付款支付到您的钱包。每当发生这种情况,都会触发 PROGRESS 事件。

此事件包含许多有用的数据,包括流向您的钱包的金额,您可以在游戏中用它来跟踪支付流,或者使用它来直观显示特殊的动画或类似内容。

您可以用以下事件:

gameWebMonetization.on(GameWebMonetization.PROGRESS, (event) => {
    console.log('Progress: ', event);
});

将上面的代码添加到 main.js 中,并在浏览器中检查。打开控制台查看输出:

进展事件

该事件为我们提供诸多有用的属性:

属性 详细信息
paymentPointer 您的付款账户 URL。标签中的内容中使用相同的值。
requestId 该数值与用户代理生成的会话 ID/货币化 ID (UUID v4) 相同。
amount Interledger 协议 (ILP) 包中指定的接收目标金额。
assetCode 标识金额单位的代码(通常为三个字符)。例如,单位可以是货币(美元、瑞波币)。
assetScale 金额小数点后的位数。例如,如果您的美元资产规模为 2,则最小可分割单位为美分。
receipt base64-编码流收据由网络货币化接收方发送给网络货币化提供商,作为在流中接收的总金额的证明。
totalAmount 当前 paymentPointer 已经收到的金额,如果 paymentPointer 改变,该金额将重置。

如您所看到的,这是很多现成的数据!

或许最有趣的属性是 assetCodetotalAmountassetCode 是我们收到的货币类型,本案中为加密瑞波货币。即使您的钱包可能未设置为瑞波币,它也是 Uphold 转账的主要货币。但是,别担心,您会在钱包里收到您真正想要的货币。如果您使用的是 Uphold 以外的提供商,则您应该看到货币与钱包中设置的货币相匹配。

totalAmount 是我们在_这个游戏回合中_从玩家收到的收入。如果游戏页面被刷新,此计数器将被重置。持续时间不超过单个游戏回合。

顾名思义,PROGRESS 事件可以帮助您随时跟踪货币化流程。因为支付到您的钱包的流量是恒定的,该事件触发多次。测试期间,我们看到游戏运行时每 2 秒触发一次 ,但实际频率可能高于或低于此。所以您一定要小心游戏因为此事件而做出的反应!

与其将此事件称为游戏内动画,不如将其整合到游戏内信息中,然后再使用您自己的定时游戏内事件。

total属性

正如我们所见,PROGRESS 事件为我们提供大量手边数据。该插件为您提供 total属性,用于跟踪玩家在游戏回合中支付到您钱包的总支付金额。

即使玩家切换到另一个应用程序,然后再返回到您的游戏,该数值也会持续存在。

您可以在任何时候通过插件实例访问 total

const currentTotal = gameWebMonetization.total;

货币total根据您使用的钱包服务而变化。就像我们这里使用的,Uphold 瑞波币然后转换成您选择的货币。然而,其他钱包服务通过 Interledger 协议以您的钱包的实际货币进行传输。

此货币可以通过 PROGRESS 事件发送的 assetCode属性收到。如果与您钱包里的货币不匹配,很可能使用瑞波币作为兑换货币。您可以通过使用 assetScale属性,以您选择的货币计算,计算出您实际收到的金额。

STOP 事件

最后,我们来看 STOP 事件。API 进入停止状态时触发此事件。这可能来自您调用插件 stop方法,或者用户通过执行某动作(如切换到另一个浏览器标签或窗口),来停止通过他们的浏览器付款。

您听取该事件的方式和听取其他事件相同。我们修改您的 main.js 来处理该事件:

gameWebMonetization.on(GameWebMonetization.STOP, (event) => {
    console.log('[inside event stop] - The state: ', gameWebMonetization.state);
});

一旦创建事件处理程序,如果我们调用 stop 方法,或者切换到另一个浏览器标签,该事件就被触发。

试着进行上面的操作,然后在标签中切换几次。每次进行以下操作时,您应当看到 STOP 事件:

停止事件

或者,我们可以使用 setTimeout,来为我们调用 stop 方法伪造该动作,如下文代码所示:

gameWebMonetization.on(GameWebMonetization.STOP, (receive) => {
    console.log('[inside event stop] - The state: ', gameWebMonetization.state);
});

setTimeout(() => {
    gameWebMonetization.stop();
}, 5000);

现在,如果您转到控制台,就会看到进展事件触发,然后插件在 5 秒后停止。

您可以使用 STOP事件来了解货币化何时停止。只要记住,完全有可能再次开始,例如,当玩家切换标签或应用程序时。

变更支付指示器

如果您需要改变游戏正在使用的支付指示器,您可以调用 changePaymentPointer 方法。

只需调用该方法,并向其传递一个新配置对象:

gameWebMonetization.changePaymentPointer({
    paymentPointer: '$ilp.uphold.com/ziW6E7iwKUkp',
    pointerName: "Alice"
});
gameWebMonetization.restart();

调用 changePaymentPointer() 只会让插件为更改做好准备,但不会使其生效。为此,您需要调用 restart() 方法,如上文示例代码所示。

支付指示器也可以作为加权数组提供。这允许您利用概率收益共享,我们将在本教程下一部分对此予以详述。