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

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

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

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

Q&A

解決済

1回答

1969閲覧

Dxlib 数学との関係で座標系をわかりやすくしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2019/07/29 06:12

DirectXの場合はY軸は上に上がると数字がマイナスされた下にいくと数字がプラスされますが数式を使う場合はY軸はこの逆なのでそこと数式を使わない時でY軸の軸の向きを整理したいのですが当たり判定があったりと色々でどこをどうしたいいかわかりません。わかりやすい方法などありますでしょうか?
複数の場所で座標など描画など決まりごとそのものがわかりません。

Player.cpp

#include "Input.h" #include "Player.h" #include "DxLib.h" #include "Map.h" #define MOVE_SPD 5 /*コンストラクタ*/ Player::Player(const char* str, int xx, int yy) :pos{xx,yy} { LoadDivGraph(str,7,7,1,64,64,g_handle); } /*計算更新*/ void Player::Update() { input_key(); //gravity(); } /*描画更新*/ void Player::Draw_Update() { DrawFormatString(100,100,GetColor(255,255,255),"Debug"); DrawGraph(gPos_x(), gPos_y(), g_handle[0], true); } /*キー入力*/ void Player::input_key() { if (keybord(KEY_INPUT_LEFT) > 0) { sPos_x(-MOVE_SPD); } if (keybord(KEY_INPUT_RIGHT) > 0) { sPos_x(+MOVE_SPD); } /*ジャンプ*/ if (keybord(KEY_INPUT_SPACE) > 0) { if (n <= 0) { n = 0; gravity(); } sPos_y(n); n = (n - 2); } else { n = jump_range;//減った値を再設定 gravity(); } } /*重力効果*/ void Player::gravity() { bool t = Map::col(pos.x,pos.y); if (gPos_y() < 1000) { sPos_y(-2); } if (t == true) { DrawFormatString(0, 100, GetColor(255, 255, 255), "collsiion"); } } /*座標の取得と設定*/ void Player::sPos_x(int xx)//加算 { pos.x += xx; } void Player::sPos_y(int yy)//加算 { pos.y += -yy; } int& Player::gPos_x() { return pos.x; } int& Player::gPos_y() { return pos.y; }

Map.cpp

#include "Map.h" #define CELL 64 int Map::map_set[11][20] = { {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1}, }; /*マップセル取得*/ int Map::draw_mapCell(int& x, int& y) { return (int)map_set[y][x]; } int Map::get_mapCell(int& x, int& y) { return (int)map_set[y][x]; } /*描画 更新*/ void Map::Draw_Update() { for (int y = 0; y < 11; y++) { for (int x = 0; x < 20; x++) { DrawGraph(x * 64, y * 64, ghandle[draw_mapCell(x, y)], true); } } } /*計算 更新*/ void Map::Update() { } /*当たり判定 当たったらtrue*/ bool Map::col(int& px, int& py)//引数はプレイヤー座標 当たっていたらtrue { ///////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// DrawFormatString(px + 100,py,GetColor(255,255,255),"x: %d ,y %d",px,py); for (int y = 10; y >= 0; y--) { for (int x = 19; x >= 0; x--) { if (get_mapCell(x, y) == 0) { if ( (y * CELL) > py - CELL || (y * CELL) - CELL < py && (x * CELL) > px + CELL || (x * CELL) + CELL < px ) { return true; } } } } return false; ////////////////////////////////////////////////////////////////////////////////////////////// }

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

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

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

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

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

guest

回答1

0

ベストアンサー

描画に使う座標系と「数式」を考えている座標系とが異なっていて混乱するという話ならば,
座標系を意識して書けばどうでしょう.

  • 各処理がどの座標系の上での話なのかを明確にし,
  • 異なる座標系の値をあれこれする場面では明示的に座標変換の処理手順を設ける

と解りやすくなるかと思います.
例えば,座標系の間を行き来する場合には,こんな感じの関数とかを必ず用いることにする.

//描画時の座標系[pixel]における座標(PixX,PixY)を, //「数式」を考えているデータの世界の座標系の値に変換する void Cvt_DrawPixelCoord_to_DataCoord( int PixX, int PixY, int *pDstDataX, int *pDstDataY ) { *pDstDataX = PixX; *pDstDataY = -PixY; } //逆向きの変換も同様に…

投稿2019/07/29 06:33

fana

総合スコア11656

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

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

fana

2019/07/29 06:43

後は【所属座標系がわかるような変数名の付け方ルール】みたいなのを設ければ,コードが見やすくなるんじゃないでしょうか.
退会済みユーザー

退会済みユーザー

2019/08/12 08:11

質問ですが自分は void Player::Position::sPos_y(int yy) { y += -yy; } のようなコードを書き参照と値型両方用意したいのですがこれはどうなのでしょうか?提示コードは値をコピーして元の値をいじらないようにしていますが....
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問