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

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

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

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

DXライブラリ

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

Q&A

解決済

1回答

744閲覧

斜めに移動したら逆方向に斜めで戻るプログラムで誤差がどこで起きているのか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

DXライブラリ

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

0グッド

0クリップ

投稿2021/04/16 02:28

提示コードです斜め右上に移動して300移動したら逆側である斜め左下に移動して元の座標に戻るというコードなのですがなぜか左上に移動してしますこれは何かの誤差だと思うのですがどこで誤差が起きているのでしょうか?double形やfloat 型などを触りましたが治りません。

イメージ説明
イメージ説明

cpp

1#include "Game.hpp" 2#include "Entry.hpp" 3#include "Input.hpp" 4 5#include <iostream> 6 7#include "DxLib.h" 8 9#define PI ((double)3.14159265359) //円周率 10 11 12Game::Game(Entry* entry) 13{ 14 owner = entry; //Entry クラス 15 16 17 18 mHandlePlayer_ = LoadGraph("Assets/Player.png"); //プレイヤー 19 playerPosition = glm::ivec2(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2); 20} 21 22 23//計算 24void Game::Update() 25{ 26#define SPEED ((float)4.0f) 27 28 29 length += sqrt(pow(cos(PI / 4) * SPEED, 2) + pow(sin(PI / 4) * SPEED, 2)); 30 31 if (length > 300) 32 { 33 turn = !turn; 34 length = 0; 35 } 36 37 if (turn == false) 38 { 39 playerPosition.x += cos(PI / 4) * SPEED; 40 playerPosition.y += -sin(PI / 4) * SPEED; 41 } 42 else if (turn == true) 43 { 44 playerPosition.x += -cos(PI / 4) * SPEED; 45 playerPosition.y += sin(PI / 4) * SPEED; 46 } 47 48 49} 50 51//描画 52void Game::Draw() 53{ 54 DrawGraph(playerPosition.x, playerPosition.y, mHandlePlayer_, TRUE); 55} 56 57 58Game::~Game() 59{ 60 61} 62

hpp

1#ifndef ___GAME_HPP 2#define ___GAME_HPP 3#include "glm/glm.hpp" 4#include <array> 5 6 7//画面サイズ 8#define SCREEN_WIDTH ((int)14 * 70) 9#define SCREEN_HEIGHT ((int) 9 * 70) 10 11//前方宣言 12class Entry; 13class Game 14{ 15public: 16 Game(Entry* entry); 17 ~Game(); 18 19 void Update(); 20 void Draw(); 21 22 23private: 24 25 //スプライト 26 int mHandlePlayer_; //プレイヤー 27 28 29 30 glm::ivec2 playerPosition = glm::ivec2(0,0); 31 32 float length = 0; 33 bool turn = false; 34 Entry* owner; //Entryクラス 35}; 36 37#endif 38

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

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

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

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

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

txty

2021/04/17 13:42 編集

あってるかわからんがradを変更してcos(),sin()のままじゃ、駄目ですか。 ああキャラクターの移動でradは変更できないのか もしくは1*,ー1*で。流石に少し忘れたよ。いや今のままであってるかな。
guest

回答1

0

ベストアンサー

playerPosition.x += cos(PI / 4) * SPEED;
playerPosition.y += -sin(PI / 4) * SPEED;

playerPosition.x と y は整数なので小数点以下は切り捨てられます。
このためだんだんと x, y は正確な値よりも小さくなっていき
左上に移動することになります。

プレイヤーの x,y座標は浮動小数の変数に保持しておき、
それを playerPosition に代入するとよいでしょう。

float fx, fy; // プレイヤーの座標を保持する変数をfx,fyと仮定 if (turn == false) { fx += cos(PI / 4) * SPEED; fy += -sin(PI / 4) * SPEED; } else if (turn == true) { fx += -cos(PI / 4) * SPEED; fy += sin(PI / 4) * SPEED; } playerPosition.x = fx; // ここで切り捨てが出るけど fx,fy は正確なまま playerPosition.y = fy;

投稿2021/04/18 10:06

sigsegv

総合スコア895

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

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

退会済みユーザー

退会済みユーザー

2021/04/18 10:24

質問ですがplayerPosition.y += -sin(PI / 4) * SPEED;では掛け算の時点で整数になってしまうのでしょうか?
sigsegv

2021/04/18 22:38

掛け算は double で計算されます。 SPEEDは float ですが、sin() が double なので、double で計算します。 右辺は double 型ですが、playerPosition.y が int なので代入するときに int になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問