今回のコード:
//ベースマップの二次元配列を読み込む***省略
// キャラクターの2次元配列を定義 (0: なし、1: 敵、2: 操作可能キャラクター)
std::vector<std::vector<std::string>> characterArray = 2次元配列を読み込む関数;
// 抽出する領域AとBの座標とサイズを指定 32*32
sf::IntRect rectA(0, 0, move_space, move_space); // 領域A
sf::IntRect rectB(5 * move_space, 0, move_space, move_space); // 領域B
//二次元配列を基にマップをスプライトに設定***省略
// 操作可能なキャラクターの初期位置を特定
sf::Vector2i playerPosition;
↑特殊なvectorのようで、説明できないがとにかく現在のプレイヤー座標を表す為の変数
for (size_t i = 0; i < characterArray.size(); ++i) {
for (size_t j = 0; j < characterArray[i].size(); ++j) {
if (characterArray[i][j] == "2") {
playerPosition = sf::Vector2i(j, i);
プレイヤーを表す文字列「2」がある座標を変数に返している
break;
}
}
}
// キャラクターのスプライトを生成 プレイヤー以外を表示
現段階では、操作可能なプレイヤー以外をここで表示している
まだ動く機能も無い
std::vector<sf::Sprite> characterSprites;
for (size_t i = 0; i < characterArray.size(); ++i) {
for (size_t j = 0; j < characterArray[i].size(); ++j) {
sf::Sprite sprite;
if (characterArray[i][j] == "1") {
sprite.setTexture(middleLayer2.getTexture());
sprite.setTextureRect(rectMiddleEnemy);
}
//else if (characterArray[i][j] == "2") {
// sprite.setTexture(middleLayer.getTexture());
// sprite.setTextureRect(rectMiddlePlayer);
//}
else {
continue; // 0の場合はスプライトを作成しない
}
sprite.setPosition(static_cast<float>(j * rectMiddleEnemy.width), static_cast<float>(i * rectMiddleEnemy.height));
characterSprites.push_back(sprite);
}
}
// プレイヤースプライトを設定
操作可能なプレイヤーのみ、別で宣言スプライトも別で設定しているため
今回は背景の上に敵、の上にプレイヤー、といった画像の層になっている。
sf::Sprite playerSprite;
プレイヤースプライトに画像をセット
playerSprite.setTexture(middleLayer.getTexture());
セットした画から座標を切り抜く
playerSprite.setTextureRect(rectMiddlePlayer);
スプライトの表示場所を設定
playerSprite.setPosition(static_cast<float>(playerPosition.x * rectMiddlePlayer.width), static_cast<float>(playerPosition.y * rectMiddlePlayer.height));
// ディレイを管理するための時計
sf::Clock clock;
const sf::Time delay = sf::seconds(0.1f); // 200ミリ秒のディレイ
// ウィンドウを作成
sf::RenderWindow window(sf::VideoMode(800, 600), "Array Based Image Display");
// メインループ
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
}
window.clear();
// プレイヤーの移動処理
if文で変数delayを参照し、連続入力にならないよう処理している
最後に、if文最後に時計をリセットしている
if (clock.getElapsedTime() >= delay) {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
if (playerPosition.x > 0 && mapArray[playerPosition.y][playerPosition.x - 1] == "0") {
playerPosition.x -= 1;
}
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
if (playerPosition.x < mapArray[0].size() - 1 && mapArray[playerPosition.y][playerPosition.x + 1] == "0") {
playerPosition.x += 1;
}
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
if (playerPosition.y > 0 && mapArray[playerPosition.y - 1][playerPosition.x] == "0") {
playerPosition.y -= 1;
}
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
if (playerPosition.y < mapArray.size() - 1 && mapArray[playerPosition.y + 1][playerPosition.x] == "0") {
playerPosition.y += 1;
}
}
// プレイヤースプライトの位置を更新
playerSprite.setPosition(static_cast<float>(playerPosition.x * rectMiddlePlayer.width), static_cast<float>(playerPosition.y * rectMiddlePlayer.height));
// 時計をリセット
clock.restart();
}
// スプライトを描画 (重ねる順番に注意)
for (const auto& baseSprite : baseSprites) {
window.draw(baseSprite);
}
for (const auto& sprite : characterSprites) {
window.draw(sprite);
}
// プレイヤースプライトを描画
window.draw(playerSprite);
以上が今回行った
レイヤーの複数保持
自キャラと他キャラを表示
自キャラ操作
操作時のディレイタイムの実装
になります。
ほとんどはchatGPTに相談してやっているので、この備忘録に出力することで少しでも糧になればと考えています。
Comments