質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

2回答

2651閲覧

RPGの仲間が自分の後ろを追尾する処理の実装方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2020/02/29 10:05

編集2020/03/01 10:48

提示コードの////コメント部のコードです。真横に動いても自分の"後"を仲間が追尾する処理を実装したいのですがどうすればいいのでしょうか?アルゴリズムというか考え方が知りたいです。

提示画像の一番上のキャラクターが自分のキャラクターでそれを右に動かしてその後上に動かした時にちゃんと後ろを追いかけてくれる処理を作りたいです。

イメージ説明

#include "Game.hpp" #include "DxLib.h" #include "Input.hpp" #include <time.h> static const char* filename = "Log.txt"; static std::ofstream ofs(filename); Game::Game() { isMove = false; srand((unsigned int)time(NULL)); LoadDivGraph("assets/resource/Character_48px.png", 56, 8, 7, mapCELL, mapCELL, handle_chr);//キャラクター全データ読み込み int c = 0; for(int i = 0; i < 56;) { for(int j = 0; j< 8; j++){ handle_chr_all[c][j] = handle_chr[i++]; } c++; } //ofs<<"aa"<<std::endl; player = new Player(handle_chr_all[0], 100, 100); member_a = new Player(handle_chr_all[1], 100, 100 + (mapCELL * 1)); member_b = new Player(handle_chr_all[2], 100, 100 + (mapCELL * 2)); member_c = new Player(handle_chr_all[3], 100, 100 + (mapCELL * 3)); map = new Map(); speed = new Position(0,0);//速度管理 } /*操作*/ void Game::Control() { const float move = 5; if (Input::keyboard(KEY_INPUT_LEFT) > 0) { speed->x = -move; speed->y = 0; isMove = true; } else if (Input::keyboard(KEY_INPUT_RIGHT) > 0) { speed->x = move; speed->y = 0; isMove = true; } else if (Input::keyboard(KEY_INPUT_UP) > 0) { speed->x = 0; speed->y = -move; isMove = true; } else if (Input::keyboard(KEY_INPUT_DOWN) > 0) { speed->x = 0; speed->y = move; isMove = true; }else{ isMove = false; speed->x = 0; speed->y = 0; } *player->PrevPos = *player->position; player->Move(speed); } /////////////////////////////////////////////////////////////////////////////////////////////////////// /*仲間を自分に追尾させる。処理*/ void Game::Party() { // member_a->position->x = p.x - mapCELL; // member_a->position->y = p.y - mapCELL; /*Right move*/ if(player->getDirection().x > 0 && player->getDirection().y == 0) { member_a->position->x = player->PrevPos->x - mapCELL; member_a->position->y = player->PrevPos->y; }else if (player->getDirection().x < 0 && player->getDirection().y == 0) { member_a->position->x = player->PrevPos->x + mapCELL; member_a->position->y = player->PrevPos->y; } //member_a->Move(speed); //member_b->Move(speed); //member_c->Move(speed); } /////////////////////////////////////////////////////////////////////////////////////////////////////// /*エンカウントを管理 */ void Game::Encount() { if(isMove == true && rand() % 5 == 0) { //ofs<<"エンカウント!!! "<<std::endl; } } void Game::Update() { Control(); Encount(); Party(); map->Update(); member_a->Update(); member_b->Update(); member_c->Update(); player->Update(); } void Game::Draw_Update() { map->Draw_Update(); member_a->Draw_Update(); member_b->Draw_Update(); member_c->Draw_Update(); player->Draw_Update(); DrawFormatString(0, 0, GetColor(0, 0, 0), "player: %.2f , %.2f", player->position->x, player->position->y); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2020/03/01 10:43

タグがC#になっていますが、C++では?
fana

2020/03/02 01:17

前々から思っているのですが,こういう場所で質問する際には,自前の画像に差し替える等するべきでは…
guest

回答2

0

動的配列を用意して、先頭のプレイヤーの移動量を、列のキャラクターが一人つづ、加算していくことで実現出来ます。ごめんなさい、動的配列の詳しい関数名を失念してしまったので、sampleは書けませんが、キューで動的配列を確保し、1フレームごとに先頭のプレイヤーの移動量を動的配列に追加すれば、実現出来ます。

//5は自分の"後"を仲間が追尾するキャラクターの数。 for (int i = 0; i < 5; i++){ 先頭のプレイヤーの一つ後ろのキャラクタ[i]の位置 += 動的配列[i] }

もちろん、動的配列ですので、メモリ確保出来ていないキャラクターには移動量を加算しないというプログラムも必要ですし、不要となった動的配列の解放もお忘れなく...

投稿2020/03/02 01:13

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

何人並んでいたとしても、各キャラのひとり前の移動前位置へ動かせば良いだけでは

投稿2020/02/29 12:25

SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/29 15:35

重なってしまうと思うのですが...正方形なのでその辺をどうしたらいいのかなと迷っています。
SHOMI

2020/02/29 18:01

なぜ重なるのでしょう?前のキャラがいたマスへ向かって移動するだけですよ?
SHOMI

2020/02/29 18:21 編集

難しく考えすぎているのではないでしょうか。一マス移動するとどうなるかを実際に紙にでも描いてみてはいかがですか?
退会済みユーザー

退会済みユーザー

2020/03/01 07:27 編集

このゲームは斜め移動はできないためX,Yどちらかにしか移動できないのです。 /*Right move*/ if(player->getDirection().x > 0 && player->getDirection().y == 0) { member_a->position->x = player->PrevPos->x - mapCELL; member_a->position->y = player->PrevPos->y; }else if (player->getDirection().x < 0 && player->getDirection().y == 0) { member_a->position->x = player->PrevPos->x + mapCELL; member_a->position->y = player->PrevPos->y; } このように処理を実装したいのですがこれですと逆に逆方向に動いた時に自分の後ろにくっついてしまうのでちょっと本家の処理とは違うと思います。自分のキャラクターの下に味方キャラクターが重なって重ならなくなると後ろにくっついて移動するという処理を実現したいのですがどうすればいいのでしょうか?また指摘通り紙の上に絵を書いて考えています。
SHOMI

2020/03/01 10:21

player->PrevPosが1マス単位での座標なら、前のキャラのplayer->PrevPosを後ろのキャラの移動先とするだけでしょう。
退会済みユーザー

退会済みユーザー

2020/03/01 10:30

いえただの座標です。5ドットずつ移動します。
SHOMI

2020/03/01 10:41 編集

もしかして1マスの移動を一気にではなく、滑るように移動させていて先頭キャラの直前の座標を使うと重なると言っているのでょうか。もしそうなら1マス移動完了した時点で前いたマスの位置を更新するようにし、あとはおなじでは?
SHOMI

2020/03/01 10:39 編集

先頭と後続を分けて実装しようとしているようですが、そのせいでややこしくなっているのでは? ・先頭キャラの次の移動先マスは今いるマスの上下左右いずれか ・2番目キャラの次の移動先マスは先頭キャラが移動前にいたマス ・3番目キャラの次の移動先マスは2番目キャラが移動前にいたマス ・4番目キャラの次の移動先マスは3番目キャラが移動前にいたマス へ向けて移動するだけで重なりを考える必要などないと思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問