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

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

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

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

Q&A

解決済

2回答

1519閲覧

dxlib 他クラスの関数を使って当たり判定を管理する方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2019/07/25 06:13

編集2019/07/25 10:57

重力効果とコメントしている部分に「もしブロックにあたっていなかったら落下する」みたいな処理を作るのに
他クラスのマップ管理クラスの当たり判定メソッドを使って当たっているか毎回確認したいのですがどうすればいいのでしょうか?

Mapソースファイルの当たり判定関数(コメント部)でプレイヤーの座標を引数に入れて
当たっているかどうかを判定してあたっていなかったら重力でまた下に移動するという処理を作りたいです。

質問ですが全体を把握するためのGameクラスを作りそこにプレイヤーとマップ管理クラスを書いたがために
この問題にあたっているのですがこれはどうすれば解決できるのかが知りです。
そもそもこのコーディングが間違えたのかなと思うのですが

Player.cpp

1#include "Input.h" 2#include "Player.h" 3#include "DxLib.h" 4 5 6/*コンストラクタ*/ 7Player::Player(const char* str, int xx, int yy) :pos{xx,yy} 8{ 9 LoadDivGraph(str,7,7,1,64,64,g_handle); 10 11} 12 13/*計算更新*/ 14void Player::Update() 15{ 16 input_key(); 17 //gravity(); 18 19} 20 21/*描画更新*/ 22void Player::Draw_Update() 23{ 24 DrawFormatString(100,100,GetColor(255,255,255),"Debug"); 25 DrawGraph(gPos_x(), gPos_y(), g_handle[0], true); 26 27} 28 29 30/*キー入力*/ 31void Player::input_key() 32{ 33 if (keybord(KEY_INPUT_LEFT) > 0) 34 { 35 sPos_x(-5); 36 } 37 38 if (keybord(KEY_INPUT_RIGHT) > 0) 39 { 40 sPos_x(+5); 41 } 42 43 /*ジャンプ*/ 44 if (keybord(KEY_INPUT_SPACE) > 0) 45 { 46 n = (n - 2); 47 if (n <= 0) 48 { 49 n = 0; 50 gravity(); 51 } 52 53 sPos_y(n); 54 } 55 else { 56 57 n = jump_range;//減った値を再設定 58 gravity(); 59 } 60 61 62 63} 64 65/*重力効果*/ 66void Player::gravity() 67{ 68 //マップのオブジェクトの上に乗るまでjumpできない。 69 70 if (gPos_y() < 200) 71 { 72 sPos_y(-6); 73 } 74 75 76} 77 78/*座標の取得と設定*/ 79void Player::sPos_x(int xx)//加算 80{ 81 pos.x += xx; 82} 83 84void Player::sPos_y(int yy)//加算 85{ 86 pos.y += -yy; 87} 88 89int Player::gPos_x() 90{ 91 return pos.x; 92} 93 94int Player::gPos_y() 95{ 96 return pos.y; 97} 98

Map.cpp

Map.cpp

1#include "DxLib.h" 2#include "Map.h" 3 4 5 6static int Map_debug = 0; 7 8 9/*コンストラクタ*/ 10Map::Map(const char* str) :pos{0,0} 11{ 12 if (LoadDivGraph(str, 40, 10, 4, 64, 64, g_handle) == -1) { Map_debug = -1; } 13 14} 15 16 17 18void Map::Update() 19{ 20 21} 22 23/*当たり判定////////////////////////////////////////////////////////////////////////////////////////*/ 24bool Map::Map_Col(int x, int y) 25{ 26 return true; 27} 28//////////////////////////////////////////////////////////////////////////////////////////////////// 29 30void Map::Draw_Update() 31{ 32 //DrawFormatString(0, 0, GetColor(255, 255, 255), "%d",Map_debug); 33 34 for (int y = 0; y < 20; y++) 35 { 36 for (int x = 0; x < 20; x++) 37 { 38 39 DrawGraph(y * CELL,x * CELL,g_handle[Draw_set_stage(x,y)],true); 40 } 41 } 42 43 44} 45 46/*描画チップを選別*/ 47/* 48 495 レンガ 50 51*/ 52int Map::Draw_set_stage(int x,int y) 53{ 54 int t = draw_map[x][y]; 55 56 switch (t) 57 { 58 case 0://なにもない 59 return -1; 60 break; 61 62 case 2://レンガ 63 return 5; 64 break; 65 66 67 68 } 69 70 71 72 73 74} 75 76 77 78/*座標の取得と設定*/ 79void Map::sPos_x(int xx) 80{ 81 pos.x += xx; 82} 83 84void Map::sPos_y(int yy) 85{ 86 pos.y += -yy; 87} 88 89int Map::gPos_x() 90{ 91 return pos.x; 92} 93 94int Map::gPos_y() 95{ 96 return pos.y; 97} 98

Game.h

1#include "Dxlib.h" 2#include "Game.h" 3 4 5Game::Game() 6{ 7 8} 9 10 11void Game::Update() 12{ 13 14 m->Update(); 15 p->Update(); 16 17} 18 19void Game::Draw_Update() 20{ 21 m->Draw_Update(); 22 p->Draw_Update(); 23 24}

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

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

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

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

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

guest

回答2

0

衝突判定の場合、collisionという名の静的クラスを利用する場合が多いですね。

管理が出来なくなると懸念されますが、ゲームの場合は衝突判定がどこで呼ばれているか、開発初期段階では全く予想がつかないことが多いので、基本はどこでも呼び出せるようにするのが無難な選択です。

投稿2019/07/26 00:20

stdio

総合スコア3307

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

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

退会済みユーザー

退会済みユーザー

2019/07/28 17:07

静的クラスにするとそもそもマップを管理している配列が呼べなくってしまうのですが そのあたりはどうすればいいのでしょうか?それとGameクラスにはどのような処理を書くべきなのでしょうか?
stdio

2019/07/29 00:17

静的クラスにするとそもそもマップを管理している配列が呼べなくってしまうのはあまり衝突判定では気にしない分野ですよ。 四角形同士の衝突判定を、マップで呼べばいいだけなのでね。 Gameに関してはDraw_Updateではなく、DrawだけでOKな気がしますね。 後、コンストラクタでシーンの初期化を行うのは、マルチスレッドの観点から言ってお勧め出来ません。
退会済みユーザー

退会済みユーザー

2019/07/29 01:31

コンストラクタでの初期化というのはplayer *p等のことで 各クラスにini()のような初期化メンバ関数を用意スべきなのでしょうか?
stdio

2019/07/29 07:26

主にシーンを担当しているクラスだけにしか当てはまりませんから、この場合はGameクラスのみですね。 他のは、普通にコンストラクターで初期化すればいいと思いますよ。後、解放をお忘れなく。
退会済みユーザー

退会済みユーザー

2019/07/29 08:51

つまりGameクラスのコンストラクタにプレイヤーとマップのクラスをnew ()でインスタンスを生成してもよいということでしょうか?もう少し説明がほしいです。
guest

0

ベストアンサー

playerの中でこういう感じでやればいいです

map->Map_Col(pos.x, pos.y)

問題はmapのポインタをどう取るかですが、
・mapをグローバル変数にする
・ゲームループが始まる前に、playerにmapのポインタを渡す
のどちらかだと思います

投稿2019/07/25 10:16

izmktr

総合スコア2856

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

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

退会済みユーザー

退会済みユーザー

2019/07/25 10:58

質問ですがマップクラスというステージのブロックとかアイテムとかを管理しているのつもりなのですが その情報を他のクラス等に渡したりする場合設計を変えたほうがいいのでしょうか?
izmktr

2019/07/25 15:42

現行の設計に問題があるのかは公開されているソースでは判断できませんし、 どう変えたいのかも書いてくれないと何もアドバイスはできません
stdio

2019/07/28 17:41

w,hの情報が欠けているその方法では、マップと上手く衝突しないと思うのですが....
退会済みユーザー

退会済みユーザー

2019/07/28 17:45

いや、#define CELL 64 という形でそのあたりは問題なにです。
stdio

2019/07/29 00:11

あまり、C++で#defineは推奨されていないのだけど... ゲームなら敵とかアイテムとかほかの要素も考慮しないといけないから、この方法では敵やアイテムごとに衝突判定の関数を用意する羽目になりますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問