NFTキャラクターに実用的な属性を与えよう
🤝 フロントエンドと連携するための関数を作成する
これから、Webアプリケーションにゲームを構築していくので、コントラクトとフロントエンドを連携させるための関数を実装していきます。
-
下記で実装していく関数は、フロントエンドから呼び出すことを前提としています。
-
したがって、今わからないことがあったとしても、フロントエンドのスクリプトを実装する段階では、それらはクリアになるはずです。
-
まずは、
MyEpicGame.solを更新することをゴールに進んでいきましょう。
✅ ユーザーが NFT キャラクターを持っているか確認する
checkIfUserHasNFT関数を作成していきます。
この関数の機能は下記の2つです。
-
ユーザーがすでにNFTキャラクターを持っているかどうかを確認する。
-
ユーザーのウォレットにNFTキャラクターがすでに存在する場合は、その属性を取得情報(HPなど)を取得する。
下記の関数をMyEpicGame.solに追加してください。
attackBoss関 数のコードブロック直下がお勧めです。
function checkIfUserHasNFT() public view returns (CharacterAttributes memory) {
// ユーザーの tokenId を取得します。
uint256 userNftTokenId = nftHolders[msg.sender];
// ユーザーがすでにtokenIdを持っている場合、そのキャラクターの属性情報を返します。
if (userNftTokenId > 0) {
return nftHolderAttributes[userNftTokenId];
}
// それ以外の場合は、空文字を返します。
else {
CharacterAttributes memory emptyStruct;
return emptyStruct;
}
}
上記のコードを詳しく見ていきましょう。
function checkIfUserHasNFT() public view returns (CharacterAttributes memory) {
// ユーザーの tokenId を取得します。
uint256 userNftTokenId = nftHolders[msg.sender];
:
checkIfUserHasNFT関数がフロントエンドから呼び出されると、uint256 userNftTokenId = nftHolders[msg.sender];を実行して、ユーザーがすでにNFTキャラクターを持っているかチェックします。
userNftTokenIdには、WebアプリケーションにログインしたユーザーのtokenIdが入ります。
次に、下記のコードを見ていきましょう。
// ユーザーがすでにtokenIdを持っている場合、そのキャラクターの属性情報を返します。
if (userNftTokenId > 0) {
return nftHolderAttributes[userNftTokenId];
}
// それ以外の場合は、空文字を返します。
else {
CharacterAttributes memory emptyStruct;
return emptyStruct;
}
constructorで_tokenIds.increment()を行っているので、tokenIdの0番を保持している人は存在しません。
よって、userNftTokenId > 0の場合、ユーザーは何かしらのtokenIdを保持していることになります。
同時に、nftHolders[msg.sender]に新しいユーザーの アドレスが渡された場合は、デフォルト値である0がuserNftTokenIdに格納されます。
もし、ユーザーがNFTキャラクターをまだ持っていない場合は、emptyStructが返されるので、そこに新しくNFTキャラクターの情報を格納していくことになります。
🎃 キャラクターを選ぶ
Webアプリケーションに、「キャラクター選択画面」を作成し、プレイヤーにMintするNFTキャラクターを選んでもらいます。
そのための関数getAllDefaultCharactersをMyEpicGame.solの中に作成していきます。
checkIfUserHasNFT関数のコードブロック直下がお勧めです。
function getAllDefaultCharacters() public view returns (CharacterAttributes[] memory) {
return defaultCharacters;
}
これにより、Webアプリケーションから、3体のNFTキャラクターのデフォルト情報が取得できます。
💀 フロントエンドからボスのデータを取得する
フロントエンドに、ボスの情報(HP、名前、画像など)を反映させる関数を作成します。
getAllDefaultCharacters関数のコードブロック直下がお勧めです。
function getBigBoss() public view returns (BigBoss memory) {
return bigBoss;
}