ここから本文です

C言語でbmpファイルからデーターを取得しパラパラ漫画のように映像を再生しようと...

tow********さん

2019/7/923:09:26

C言語でbmpファイルからデーターを取得しパラパラ漫画のように映像を再生しようと考えているのですがFPSの調整がうまくいきません

15fps以上のときは抑えることができるのですが15fps以下になったときに修正ができないのでずれてしまいます
うまく修正できないでしょうか
ソース
#include<stdio.h>
#include<math.h>
#include <DxLib.h>
#include<windows.h>

static int mStartTime; //測定開始時刻
static int mCount; //カウンタ
static float mFps; //fps
static const int N = 15; //平均を取るサンプル数
static const int FPS = 15; //設定したFPS

bool Update() {
if (mCount == 0) { //1フレーム目なら時刻を記憶
mStartTime = GetNowCount();
}
if (mCount == N) { //60フレーム目なら平均を計算する
int t = GetNowCount();
mFps = 1000.f / ((t - mStartTime) / (float)N);
mCount = 0;
mStartTime = t;
}
mCount++;
return true;
}

void Draw() {
DrawFormatString(0, 0, GetColor(255, 255, 255), "%.1f", mFps);
}

void Wait() {
int tookTime = GetNowCount() - mStartTime; //かかった時間
int waitTime = mCount * 1000 / FPS - tookTime; //待つべき時間
if (waitTime > 0) {
Sleep(waitTime); //待機
}
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
SetGraphMode(512, 512, 32), ChangeWindowMode(TRUE);
SetDrawScreen(DX_SCREEN_BACK);// 描画先画面を裏画面にセット
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
int I=1;
int A=0;
char fname[256];
PlaySoundFile("badapple.wav",DX_PLAYTYPE_BACK);
while (A == 0) {
snprintf(fname, sizeof fname, "badapple_%04d.bmp", I);
unsigned char img[512][512][3]; //読み込んだ画素情報を保存する
unsigned char BitMapFileHeader[14]; //BMPのファイルヘッダーを保存する
unsigned int biSize; //BMPのサイズを保存する
int biWidth; //BMPの幅を保存する
int biHeight; //BMPの高さを保存する
unsigned char BitMapInfoHeader[28]; //上記3つ以外のBMPの情報ヘッダーを保存する
int i, j, c; //for文用
FILE *fp; //ファイルポインタ
fopen_s(&fp,fname, "rb");


fread(&BitMapFileHeader, sizeof(char), 14, fp); //ファイルヘッダーを読み込む
fread(&biSize, sizeof(int), 1, fp); //情報ヘッダーにあるサイズを読み込む
fread(&biWidth, sizeof(int), 1, fp); //情報ヘッダーにある幅を保存
fread(&biHeight, sizeof(int), 1, fp); //情報ヘッダーにある高さを保存
fread(&BitMapInfoHeader, sizeof(char), 28, fp); //残りの情報ヘッダーを保存
for (j = 0; j < biHeight; j++) { //0から幅まで
for (i = 0; i < biWidth; i++) { //0から高さまで
for (c = 0; c < 3; c++) { //RGBのそれぞれ
fread(&img[i][j][c], sizeof(char), 1, fp); //画素の情報を読み込んで保存する
}
}
}
fclose(fp); //ファイルを閉じる
for (j = 1; j < biHeight; j++) { //0から幅まで
for (i = 0; i < biWidth; i++) { //0から高さまで
DrawPixel(i, biHeight - j, GetColor(img[i][j][2], img[i][j][1], img[i][j][0]));
}
}
I++;
Update(); //更新
Draw(); //描画
ScreenFlip();
Wait();
}
WaitKey(); // キーの入力待ち(『WaitKey』を使用)
return 0; // ソフトの終了
}
DXライブラリを使用しています

閲覧数:
31
回答数:
1
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

taw********さん

2019/7/1000:12:41

使用してるPCのRTCに依存しますが、Sleepの分解能が怪しいかもしれません。timeGetDevCapsで利用可能な分解能を確認し、timeBeginPeriodで分解能を上げてみてはどうでしょうか?

この回答は投票によってベストアンサーに選ばれました!

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる