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

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

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

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

DXライブラリ

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

Q&A

解決済

2回答

2675閲覧

ホーミングミサイルを実装したい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

DXライブラリ

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

0グッド

0クリップ

投稿2020/03/29 11:21

スライムが今のところのミサイルです。 毎フレーム距離と角度を計算してその場所に修正しながら飛んでいくという理屈はわかりましたがその実装に悩んでいます。
atan();によりラジアンを取得するしれが目標のラジアンなのはわかったのですが斜め下に移動してしまいます。これ以上わからず、また動いている時などどのようにしたらいいのでしょうか?

参考サイト:http://www5.big.or.jp/~high/VENIO/kuz/kuz_are_10.htm
参考サイト:https://cpprefjp.github.io/reference/cmath/atan2.html

イメージ説明

#include "Game.hpp" #include "frame.hpp" #include "DxLib.h" #include "Input.hpp" #include "UI.hpp" #include <math.h> #include "Position.hpp" Game::Game() { pos.x = (screen_size_x / 2) - (45 / 2); pos.y = (screen_size_y / 2) - (48 / 2) + 200; targetPos.x = 400; targetPos.y = 50; //45,48 handle_chr = LoadGraph("assets/resource/Enemy.png");//キャラクター全データ読み込み LoadDivGraph("assets/resource/Map.png", cell, 24, 2, cell, cell, handle_all); } /*操作*/ void Game::Control() { const float root2 = sqrt(2); if (Input::keyboard(KEY_INPUT_UP) > 0) { DrawFormatString(100, 100, GetColor(255, 255, 255), "up"); if (Input::keyboard(KEY_INPUT_RIGHT) > 0) { speed.x = +(move / root2); speed.y = -(move / root2); DrawFormatString(100, 150, GetColor(255, 255, 255), "right"); } else if (Input::keyboard(KEY_INPUT_LEFT) > 0) { speed.x = -(move / root2); speed.y = -(move / root2); DrawFormatString(100, 150, GetColor(255, 255, 255), "left"); } else { speed.y = -move; } } else if (Input::keyboard(KEY_INPUT_DOWN) > 0) { DrawFormatString(100, 100, GetColor(255, 255, 255), "down"); if (Input::keyboard(KEY_INPUT_RIGHT) > 0) { speed.x = +(move / root2); speed.y = +(move / root2); DrawFormatString(100, 150, GetColor(255, 255, 255), "right"); } else if (Input::keyboard(KEY_INPUT_LEFT) > 0) { speed.x = -(move / root2); speed.y = +(move / root2); DrawFormatString(100, 150, GetColor(255, 255, 255), "left"); } else { speed.y = +move; } } else if (Input::keyboard(KEY_INPUT_LEFT) > 0) { DrawFormatString(100, 100, GetColor(255, 255, 255), "left"); if (Input::keyboard(KEY_INPUT_UP) > 0) { speed.x = -(move / root2); speed.y = -(move / root2); DrawFormatString(100, 150, GetColor(255, 255, 255), "up"); } else if (Input::keyboard(KEY_INPUT_DOWN) > 0) { speed.x = -(move / root2); speed.y = +(move / root2); DrawFormatString(100, 150, GetColor(255, 255, 255), "down"); } else { speed.x = -move; } } else if (Input::keyboard(KEY_INPUT_RIGHT) > 0) { DrawFormatString(100, 100, GetColor(255, 255, 255), "right"); if (Input::keyboard(KEY_INPUT_UP) > 0) { speed.x = +(move / root2); speed.y = -(move / root2); DrawFormatString(100, 150, GetColor(255, 255, 255), "up"); } else if (Input::keyboard(KEY_INPUT_DOWN) > 0) { speed.x = +(move / root2); speed.y = +(move / root2); DrawFormatString(100, 150, GetColor(255, 255, 255), "down"); } else { speed.x = +move; } } else { speed.x = 0; speed.y = 0; } pos.x += speed.x; pos.y += speed.y; DrawFormatString(0, 0, GetColor(255, 255, 255), " speed.x: %f", speed.x); DrawFormatString(0, 32, GetColor(255, 255, 255), " speed.y: %f", speed.y); // DrawFormatString(300, 300, GetColor(255, 255, 255), "%f", sqrt(((2.121320 * 2.121320)) + (2.121320 * 2.121320))); DrawFormatString(300, 300, GetColor(255, 255, 255), "%f", sqrt(((1 * 1)) + (1 * 1))); } float rad; void Game::Update() { float targetRad = atan2(targetPos.y,targetPos.x);//ターゲットのラジアンを取得 pos.x += cos(targetRad * -1) * 2; pos.y += sin(targetRad * -1) * 2; } void Game::Draw_Update() { DrawGraph(pos.x, pos.y, handle_chr, true); DrawGraph(targetPos.x, targetPos.y, handle_all[0], true); }

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

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

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

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

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

guest

回答2

0

ベストアンサー

あとは当たり判定とミサイル画像の回転のみですがとりあえず完成したので自己解決とさせていただきます。

posはミサイル座標でspeedはミサイルの速度です。targetPosは目標座標です。

void Game::Update() { Position<float> speed; float targetRad = atan2(targetPos.y - pos.y,targetPos.x - pos.x);//ターゲットのラジアンを取得 DrawFormatString(0,0,GetColor(255,255,255),"%f",targetRad); /*弾の移動速度*/ speed.x = cos( targetRad ) * 2; speed.y = sin( targetRad ) * 2; pos.x += speed.x; pos.y += speed.y; }

投稿2020/03/29 12:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

描画座標ではY軸は下向きがプラスだからでは?

投稿2020/03/29 11:34

episteme

総合スコア16612

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

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

退会済みユーザー

退会済みユーザー

2020/03/29 11:35

それを含めた実装法が知りたいです
episteme

2020/03/29 11:40

Y軸が逆転してるんだから、現在位置から+X,-Yしたとこに移動するんちゃいます?
退会済みユーザー

退会済みユーザー

2020/03/29 11:43

そもそもこれが出来てどうやってホーミングミサイルを実装したらいいのかがわかりませんw
episteme

2020/03/29 12:13

は? 目標物に近づき、座標が一致したら爆発すりゃいいんでしょ?
退会済みユーザー

退会済みユーザー

2020/03/29 12:14

目標に近ずくのってどうすればいいんですかね?目標が動く場合など...
episteme

2020/03/29 12:23

止まっていようが動いていようが、ミサイルから目標に向かうベクトルの方向にミサイルを移動すりゃいいんでしょ? てか、こーゆー仕様はアナタが決めることでしょうに。
退会済みユーザー

退会済みユーザー

2020/03/29 12:42

すいません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問