プログラム初心者の学生です。
dxライブラリで音ゲーをいろいろなサイトを見ながら作っているのですが、動画とノーツの当たり判定がぶつかっているようでうまくなったので質問させていただきました。
#include"DxLib.h"
#define WIN_W 800 //横幅
#define WIN_H 600 //縦幅
#define LANE_SIZE 1 //レーン
#define BAR_SIZE 40//
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
int MovieGraphHandle;
char buf[256];
int key[LANE_SIZE] = {
KEY_INPUT_Z,
};
bool bar_f[LANE_SIZE][BAR_SIZE];
float bar_y[LANE_SIZE][BAR_SIZE];
int bar_c[BAR_SIZE];
for (int j = 0; j < BAR_SIZE; j++) {
for (int i = 0; i < LANE_SIZE; i++) {
bar_f[i][j] = false;
}
}
LONGLONG start_time;
LONGLONG now_time;
int curentTime;
int counter = 0;
const int bpm = 120;
const float speed = 3.0f;
const int offset = 0;
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1;// エラーが起きたら直ちに終了
}
MovieGraphHandle = LoadGraph("桜島.avi");
// ムービーを再生状態にします
PlayMovieToGraph(MovieGraphHandle);
// 描画先の画面を裏画面に
SetDrawScreen(DX_SCREEN_BACK);
//ChangeWindowMode(TRUE);
// SetGraphMode(WIN_W, WIN_H, 32); // 動画とぶつかっている
//SetWindowSizeChangeEnableFlag(FALSE);
if (DxLib_Init() == -1) {
return -1;
}
// SetDrawScreen(DX_SCREEN_BACK);
int bgmHandle = LoadSoundMem("e1usi-0ujep.wav");
SetMainWindowText("OtogeNoYounaNanika");
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
if (buf[KEY_INPUT_ESCAPE] == 1) {
break;
}
// ムービー映像を画面いっぱいに描画します
DrawExtendGraph(0, 0, 640, 360, MovieGraphHandle, FALSE);
// 画面左上に再生時間を描画します
DrawFormatString(0, 0, GetColor(255, 255, 255), "Time:%d", TellMovieToGraph(MovieGraphHandle));
//------------------------------
if (ProcessMessage() == -1) break;
//-------------------------------
// 裏画面の内容を表画面に反映します
ScreenFlip();
if (counter == 0) {
PlaySoundMem(bgmHandle, DX_PLAYTYPE_BACK);
start_time = GetNowHiPerformanceCount();
}
now_time = GetNowHiPerformanceCount();
curentTime = (int)((now_time - start_time) / 1000) - offset;
while(curentTime >=( 60000 / bpm * counter) - 3000){
for (int i = 0; i < LANE_SIZE; i++) {
bar_f[i][counter % BAR_SIZE] = true;
bar_c[counter % BAR_SIZE] = 60000 / bpm * counter;
}
counter++;
}
for (int i = 0; i < LANE_SIZE; i++) {
for (int j = 0; j < BAR_SIZE; j++) {
if (bar_f[i][j]) {
bar_y[i][j] = (curentTime - bar_c[j]) / 5 * speed + WIN_H / 5 * 4;
if (bar_y[i][j] > WIN_H + 10) {
bar_f[i][j] = false;
}
}
}
}
GetHitKeyStateAll(buf);
for (int i = 0; i < LANE_SIZE; i++) {
for (int j = 0; j < BAR_SIZE; j++) {
if (bar_f[i][j]) {
if (WIN_H / 5 * 4 - 30 < bar_y[i][j] && bar_y[i][j] < WIN_H / 5 * 4 + 30) {
if (buf[key[i]] == 1) {
bar_f[i][j] = false;
}
}
}
}
}
DrawLine(0, WIN_H / 5 * 4, WIN_W, WIN_H / 5 * 4, GetColor(225, 225, 225));
for (int i = 0; i < LANE_SIZE; i++) {
for (int j = 0; j < BAR_SIZE; j++) {
if (bar_f[i][j]) {
DrawBoxAA(100.f + i * 150.f, bar_y[i][j] - 10.f,
100.0f + 72.0f + i * 150.0f, bar_y[i][j] + 10.0f, GetColor(0, 255, 0), TRUE);
}
}
}
}
DxLib_End();
return 0;
}
このまま動かすとノーツと動画は動いてくれるのですが、ノーツの判定を取ることが出来ない。
動画とぶつかっているのコメント化を外すと動画は流れないがノーツとその判定は取ることは出来ました。