トップページ > 記事閲覧
斜めに当たり判定をつけたい
名前:PP 日時: 2020/09/20 10:07

斜めに当たり判定をつけたいのですが、やり方が全然分かりません。 どうやってやればいいのでしょうか? #include "DxLib.h" int pX = 320, pY = 240, pW, pH; int sX = 100, sY = 100, sW, sH; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); // ウィンドウモードに変更 if (DxLib_Init() == -1) return -1; int damage = 0; while (!ProcessMessage()) { SetDrawScreen(DX_SCREEN_BACK); //描画先を裏画面に変更 ClearDrawScreen(); //裏画面のデータを全て削除 if (CheckHitKey(KEY_INPUT_UP) == 1) pY -= 3; if (CheckHitKey(KEY_INPUT_DOWN) == 1) pY += 3; if (CheckHitKey(KEY_INPUT_LEFT) == 1) pX -= 3; if (CheckHitKey(KEY_INPUT_RIGHT) == 1) pX += 3; //プレイヤーの操作設定 int player = LoadGraph("player.png"); GetGraphSize(player, &pW, &pH); DrawGraph(pX, pY, player, TRUE); //プレイヤーの描画 int stick = LoadGraph("stick.png"); GetGraphSize(stick, &sW, &sH); DrawRotaGraph(sX, sY, 1.0f, 45 * DX_PI_F / 180, stick, TRUE); //障害物の描画 if (pX >= sX-pW-sW/2 && pX <= sX + sW-sW / 2 && pY >= sY-pH-sH/2 && pY<=sY+sH-sH/2) { damage = 1; } else { damage = 0; } //ダメージ範囲 DrawFormatString(0, 0, GetColor(255, 255, 255), "%d %d", damage,pX); ScreenFlip(); //裏画面データを表画面へ反映 } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
メンテ

Page: 1 |

Re: 斜めに当たり判定をつけたい ( No.1 )
名前:Tatu 日時:2020/09/21 23:08

Googleで「当たり判定 四角 斜めの四角」と検索してみてはどうでしょうか。 小さい四角に分けて判定するという方法でもよいかもしれません。 #include <DxLib.h> #include <math.h> class プレイヤークラス { public: void 更新(); void 描画(); double x; double y; }; void プレイヤークラス::更新() { if (CheckHitKey(KEY_INPUT_RIGHT)) x += 3; if (CheckHitKey(KEY_INPUT_DOWN)) y += 3; if (CheckHitKey(KEY_INPUT_LEFT)) x -= 3; if (CheckHitKey(KEY_INPUT_UP)) y -= 3; } void プレイヤークラス::描画() { DrawBox(x - 16, y - 16, x + 16, y + 16, 0x0000FF, TRUE); } プレイヤークラス プレイヤー; class 棒クラス { public: void 更新(); void 描画(); double 回転中心x; double 回転中心y; double 角度; }; void 棒クラス::更新() { 角度 += DX_PI / 180; } void 棒クラス::描画() { //表示 DrawQuadrangle( 回転中心x - 12 * cos(角度) + 12 * sin(角度), 回転中心y - 12 * sin(角度) - 12 * cos(角度), 回転中心x + 80 * cos(角度) + 12 * sin(角度), 回転中心y + 80 * sin(角度) - 12 * cos(角度), 回転中心x + 80 * cos(角度) - 12 * sin(角度), 回転中心y + 80 * sin(角度) + 12 * cos(角度), 回転中心x - 12 * cos(角度) - 12 * sin(角度), 回転中心y - 12 * sin(角度) + 12 * cos(角度), 0x880000, TRUE ); //当たり判定 double x = 回転中心x; double y = 回転中心y; for (int i = 0; i < 5; i++) { DrawBox(x - 8, y - 8, x + 8, y + 8, 0xFF0000, TRUE); x += 16 * cos(角度); y += 16 * sin(角度); } } 棒クラス 棒; bool 当たっている; void 当たり判定() { 当たっている = false; double x = 棒.回転中心x; double y = 棒.回転中心y; double dx, dy; for (int i = 0; i < 5; i++) { dx = x - プレイヤー.x; dy = y - プレイヤー.y; if (dx > -24 && dx < 24 && dy > -24 && dy < 24) { 当たっている = true; break; } x += 16 * cos(棒.角度); y += 16 * sin(棒.角度); } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ ChangeWindowMode(true); DxLib_Init(); SetDrawScreen(DX_SCREEN_BACK); プレイヤー.x = 100; プレイヤー.y = 100; 棒.回転中心x = 320; 棒.回転中心y = 240; 棒.角度 = 0; while(ProcessMessage() == 0) { ClearDrawScreen(); プレイヤー.更新(); 棒.更新(); 当たり判定(); 棒.描画(); プレイヤー.描画(); if (当たっている) { DrawString(0,0,"ヒット",0xFFFFFF); } if(CheckHitKey(KEY_INPUT_ESCAPE) == 1) { break; } ScreenFlip(); } DxLib_End(); return 0; }
メンテ
Re: 斜めに当たり判定をつけたい ( No.2 )
名前:PP 日時:2020/09/22 14:35

その例だと敵のサイズが大きいときに重くなりそうなんですけど...
メンテ
Re: 斜めに当たり判定をつけたい ( No.3 )
名前:管理人 日時:2020/09/23 23:49

> その例だと敵のサイズが大きいときに重くなりそうなんですけど... 現在のCPUではこの方法で判定を行ってもなかなか処理落ち( 60fpsが保てない状態 )してしまうほど重くなることは無いと思います もし負荷が気になる場合は「小さい四角に分けて判定する」前に「大きな四角で大雑把に判定する」を入れることで処理負荷を抑えることができます 「大きな四角で大雑把に判定」で当たっていると判定された場合のみ「小さい四角に分けて判定する」を実行する形にすると 「斜めの当たり判定」を行いたい存在が多数接近していない限り「小さい四角に分けて判定する」処理が沢山実行されることはなくなります
メンテ
Re: 斜めに当たり判定をつけたい ( No.4 )
名前:PP(解決) 日時:2020/09/27 10:03

そうなんですか、わかりました。皆さんありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存