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キャラクターの情報を格納していくことになります。