top of page
  • 執筆者の写真bosi siro

C++ SFML ゲーム キャラクターの移動等

今回のコード:


//ベースマップの二次元配列を読み込む***省略


// キャラクターの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に相談してやっているので、この備忘録に出力することで少しでも糧になればと考えています。


閲覧数:1回0件のコメント

最新記事

すべて表示

C++ SFML マップのスクロール

本日は時間が無い為、突貫工事になる マップのスクロール機能を実装 以下が、追加分になる // プレイヤーを中心にスクロールするビューを作成 sf::View view(sf::FloatRect(0, 0, 800, 600));...

C++ SFMLでゲーム作成 画像の表示

C++でSFMLというライブラリを使って簡単なゲームを作っていきます。 SFMLでは、画像が白い四角系になる(white square problem)問題が良く起こるようです。 私もこれに困ったので、今回記事にします。 解決方法...

Commenti


bottom of page