第 4 部分 - 方法、属性和插件事件
切记,在任何时候您都可以在 GitHub 读取完整插件 API 文件资料。
插件触发四个关键事件:
start
: 开始stop
: 停止pending
: 待定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) 相同。 |
您可能已经注意到我们收到 paymentPointer
和requestId
。
您可以使用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
属性。插件在内部对该属性予以更新,因此用于奖励玩家特殊奖品或游戏内福利是很安全的。
了解当前状态
插件在其生命周期内经历不同的状态:
- 开始 -插件已经成功启动,并在货币化您的内容。
- 停止 -插件当前已停止,不再货币化您的内容。
- 待定 -已要求启动插件,并且在尝试协商启动,但是尚未完成这一步。
若要了解当前状态,可以查询 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 改变,该金额将重置。 |
如您所看到的,这是很多现成的数据!
或许最有趣的属性是 assetCode
和totalAmount
。assetCode
是我们收到的货币类型,本案中为加密瑞波货币。即使您的钱包可能未设置为瑞波币,它也是 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()
方法,如上文示例代码所示。
支付指示器也可以作为加权数组提供。这允许您利用概率收益共享,我们将在本教程下一部分对此予以详述。