スライムが今のところのミサイルです。 毎フレーム距離と角度を計算してその場所に修正しながら飛んでいくという理屈はわかりましたがその実装に悩んでいます。
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); }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。