自機の移動について
Re:自機の移動について
分かる人にはわかるかもしれないですけど、ぶれる、というのがどういう感じなのか、僕にはイメージが出来ません。
自分がわかってるから、人もわかってくれる、と思うのは勘違いです。
答えられる人は、知識が問題を推測できるほどあるからでしょう。
>自機の移動している最中たまにずれて表示しながら移動するのですが
まずは、自分が何をしてるか、ぐらい書きましょう。
シューティングを作ってるのでしょうか?
ライブラリは何を使ってるのでしょうか?
設計は、このサイトのゲームを模範としているのでしょうか?
環境は?
ぶれてるところのスクリーンショットを貼り付けるとわかりやすいかも。
僕はシューティング作ったことないので、おそらく分からないでしょうけど、質問をみて分かる人が答えてくれるような文章を書かないと、損するのは自分です。
漢字の使い方から推測するに、おそらくもう小学生ではないでしょう。
自分がわかってるから、人もわかってくれる、と思うのは勘違いです。
答えられる人は、知識が問題を推測できるほどあるからでしょう。
>自機の移動している最中たまにずれて表示しながら移動するのですが
まずは、自分が何をしてるか、ぐらい書きましょう。
シューティングを作ってるのでしょうか?
ライブラリは何を使ってるのでしょうか?
設計は、このサイトのゲームを模範としているのでしょうか?
環境は?
ぶれてるところのスクリーンショットを貼り付けるとわかりやすいかも。
僕はシューティング作ったことないので、おそらく分からないでしょうけど、質問をみて分かる人が答えてくれるような文章を書かないと、損するのは自分です。
漢字の使い方から推測するに、おそらくもう小学生ではないでしょう。
Re:自機の移動について
質問の仕方が曖昧と言うか大雑把すぎると思いますよ。
>一つ聞きたいことあるのですが、自機の移動している最中たまにずれて表示しながら移動するのですがこれは
直した方がいいのでしょうか?
本人が良いと思えば良いし、良くないと思えば直すしかないです。
sizumaさんも言ってますが他人がとやかく言う事じゃないです。
>回答有難うございます。出きることなら、ぶれながら移動するのは、見栄えが悪いので直したいのですが...
なら直しましょう。つまり最初の質問は意味がありませんよね。
直したいなら、直したいって書くべきでは?
>直した方がいい場合どの辺りを直せばよいのでしょうか?またどうしてこういうことが起きるのでしょうか?よろしくお願いします。
>これはしょうがないものなのでしょうか?
ソースコードも見ていませんしアルゴリズムも聞いていませんので、神様でもエスパーでも予言者でも無い私には正直まったく分かりません。
「しょうがないものなのでしょうか?」本人が諦めれば、しょうがないって事になります。諦めないなら、なぜずれるのか調べてみてはどうでしょうか?必ず原因があるはずですよ。
1.デバッガでトレースする。
2.printfDxで座標情報を表示してバグの原因を探る。
3.プログラムに自機の座標がずれた事を検知するプログラムを入れて、原因を探る。
>一つ聞きたいことあるのですが、自機の移動している最中たまにずれて表示しながら移動するのですがこれは
直した方がいいのでしょうか?
本人が良いと思えば良いし、良くないと思えば直すしかないです。
sizumaさんも言ってますが他人がとやかく言う事じゃないです。
>回答有難うございます。出きることなら、ぶれながら移動するのは、見栄えが悪いので直したいのですが...
なら直しましょう。つまり最初の質問は意味がありませんよね。
直したいなら、直したいって書くべきでは?
>直した方がいい場合どの辺りを直せばよいのでしょうか?またどうしてこういうことが起きるのでしょうか?よろしくお願いします。
>これはしょうがないものなのでしょうか?
ソースコードも見ていませんしアルゴリズムも聞いていませんので、神様でもエスパーでも予言者でも無い私には正直まったく分かりません。
「しょうがないものなのでしょうか?」本人が諦めれば、しょうがないって事になります。諦めないなら、なぜずれるのか調べてみてはどうでしょうか?必ず原因があるはずですよ。
1.デバッガでトレースする。
2.printfDxで座標情報を表示してバグの原因を探る。
3.プログラムに自機の座標がずれた事を検知するプログラムを入れて、原因を探る。
Re:自機の移動について
返信ありがとうございます。
自分でもなんて説明したらいいのかわかりません。
>シューティングを作ってるのでしょうか?
はい。
>ライブラリは何を使ってるのでしょうか?
自作です。
>設計は、このサイトのゲームを模範としているのでしょうか?
いいえ違います。
>環境は?
VC++2005です。
>ぶれてるところのスクリーンショットを貼り付けるとわかりやすいかも。
張りました。
この画像が一瞬起きます。
動画を再生するとこの現象が多く起きるみたいです。
ソースは多分ここだろうなというところを載せます。
void Draw()
{
// ↓ここから描画処理
// ↑ここまで描画処理
//----------------------------------------------------------
}
// キャラクタ描画関数
// type : キャラタイプ(eChrType)
// x : 表示位置X
// y : 表示位置Y
void DrawChr(int type,int x,int y)
{
}
//================================================================================
// オフスクリーンへ画像表示。マスク表示→画像表示
// idx : 画像データの添え字
// x,y : 表示位置x,y
// sx,sy : 画像切り出し位置x,y
// w,h : 画像切り出し幅、高さ
// mx,my : マスク切り出し位置x,y
//================================================================================
void DrawImgMask(int idx,int x,int y,int sx,int sy,int w,int h,int mx,int my)
{
}
です。よろしくお願いします。
自分でもなんて説明したらいいのかわかりません。
>シューティングを作ってるのでしょうか?
はい。
>ライブラリは何を使ってるのでしょうか?
自作です。
>設計は、このサイトのゲームを模範としているのでしょうか?
いいえ違います。
>環境は?
VC++2005です。
>ぶれてるところのスクリーンショットを貼り付けるとわかりやすいかも。
張りました。
この画像が一瞬起きます。
動画を再生するとこの現象が多く起きるみたいです。
ソースは多分ここだろうなというところを載せます。
void Draw()
{
// 画面消去
HBRUSH oldbr = (HBRUSH)SelectObject(g_hdcOff, g_hbrBg);
Rectangle(g_hdcOff, -1, -1, CLIENT_WIDTH+1, CLIENT_HEIGHT+1);
SelectObject(g_hdcOff, oldbr);//----------------------------------------------------------
// ↓ここから描画処理
// プレイヤーの表示
DrawChr(g_Player.type, g_Player.x, g_Player.y);
// 自機の弾表示
for(i=0 ; i<PLSHOT_MAX ; i++)
{
if (g_PlShot.type == CT_PLSHOT)
{
DrawChr(g_PlShot.type,g_PlShot.x,g_PlShot.y);
}
}
// ↑ここまで描画処理
//----------------------------------------------------------
// 再描画
InvalidateRect(g_hWnd,0,FALSE);
UpdateWindow(g_hWnd);
}
// キャラクタ描画関数
// type : キャラタイプ(eChrType)
// x : 表示位置X
// y : 表示位置Y
void DrawChr(int type,int x,int y)
{
DrawImgMask(g_ImgData[type].idx, x,y,
g_ImgData[type].sx, g_ImgData[type].sy,
g_ImgData[type].w, g_ImgData[type].h,
g_ImgData[type].mx, g_ImgData[type].my);
}
//================================================================================
// オフスクリーンへ画像表示。マスク表示→画像表示
// idx : 画像データの添え字
// x,y : 表示位置x,y
// sx,sy : 画像切り出し位置x,y
// w,h : 画像切り出し幅、高さ
// mx,my : マスク切り出し位置x,y
//================================================================================
void DrawImgMask(int idx,int x,int y,int sx,int sy,int w,int h,int mx,int my)
{
BitBlt(g_hdcOff,x,y,w,h,g_hdcImg[idx],mx,my,SRCPAINT);
BitBlt(g_hdcOff,x,y,w,h,g_hdcImg[idx],sx,sy,SRCAND);
}
です。よろしくお願いします。
Re:自機の移動について
ざっと見た感じですがWindowsAPIで作っていますよね。
これ、裏画面描画はしていないんでしょうか?
だとしたらタイミング次第で"ぶれ"ても仕方ないかと思いますが。
ちなみに画像貼れてないです。
これ、裏画面描画はしていないんでしょうか?
だとしたらタイミング次第で"ぶれ"ても仕方ないかと思いますが。
ちなみに画像貼れてないです。
Re:自機の移動について
画像を見る限り、どちらかと言うとvsync(垂直同期)のティアリング問題ですね。
http://spitfire.client.jp/program/fps.html
まぁ、「vsync ティアリング」で色々調べてみて下さい。
それと裏画面とは、画面バッファのコピーを作って画面消去や描画をそちらでする事で、消去から描画のタイミングでのちらつきをおさえる方法です。描画が終わったらvsyncしてから表画面にBitBltでコピーします。
http://spitfire.client.jp/program/fps.html
まぁ、「vsync ティアリング」で色々調べてみて下さい。
それと裏画面とは、画面バッファのコピーを作って画面消去や描画をそちらでする事で、消去から描画のタイミングでのちらつきをおさえる方法です。描画が終わったらvsyncしてから表画面にBitBltでコピーします。
Re:自機の移動について
返信ありがとうございます。ティアリングの意味はわかったのですが、
どのサイトで調べてみてもDirectXのは載っているのですが、WINAPIで
使えるのが載ってなくて。。。
FPSの処理をこのサイトのFPS処理に変えたら少しは減ったのですが(動
画を再生した状態)完全には消えません。どうなおせばよいのでしょう
か?助けてください。。。
どのサイトで調べてみてもDirectXのは載っているのですが、WINAPIで
使えるのが載ってなくて。。。
FPSの処理をこのサイトのFPS処理に変えたら少しは減ったのですが(動
画を再生した状態)完全には消えません。どうなおせばよいのでしょう
か?助けてください。。。
Re:自機の移動について
#include <windows.h> HWND g_hWnd; HDC g_hBackDC; //裏画面のデバイスコンテキストハンドル HBITMAP g_hBitmap; //裏画面のビットマップ LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (uMsg) { case WM_DESTROY: DeleteDC(g_hBackDC); DeleteObject(g_hBitmap); PostQuitMessage(0); break; case WM_CREATE: g_hWnd = hWnd; //裏画面を作成 hdc = GetDC(hWnd); g_hBackDC = CreateCompatibleDC(hdc); g_hBitmap = CreateCompatibleBitmap(hdc, 640, 480); SelectObject(g_hBackDC, g_hBitmap); ReleaseDC(hWnd, hdc); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); BitBlt(hdc, 0, 0, 640, 480, g_hBackDC, 0, 0, SRCCOPY); //裏画面を表画面に転送 EndPaint(hWnd, &ps); default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hWnd; WNDCLASS wc; MSG msg; RECT clrc = {0, 0, 640, 480}; //クライアント領域(640×480) //ウィンドウクラスを登録 wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = NULL; wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "Sample"; if (!RegisterClass(&wc)) return 0; //クライアント領域の確保に必要なウィンドウ領域を取得 AdjustWindowRect(&clrc, WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME ^ WS_MAXIMIZEBOX, FALSE); //ウィンドウを作成 hWnd = CreateWindow( wc.lpszClassName, "ダブルバッファリング", WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME ^ WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, clrc.right - clrc.left, clrc.bottom - clrc.top, NULL, NULL, hInstance, NULL ); if (!hWnd) return 0; //ウィンドウを表示 ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); //メッセージループ while (1) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } else { //ゲームループ } } return msg.wParam; }あまりよろしくないつくりなのですが一応裏画面を使うプログラムを書いてみました。
ゲームループの中で描画処理をg_hBackDCに対して行います。
そして適当なタイミングでInvalidateRect(g_hWnd, NULL, FALSE);を呼び出すと
WM_PAINTで表画面に転送が行われます。
※FPSの処理は必ず入れてください。
Re:自機の移動について
ティアリングを完全に防ぐ方法は無い様ですね。
理由は、Win32APIでは垂直同期のタイミングを掴むAPIが存在しないためです。
※ 周期(リフレッシュレート)だけは分かりますが、タイミングが分かるわけではありません。
ティアリングの原因↓
http://d4.princess.ne.jp/multimedia/ntsc/tearing.html
テレビゲーム機やDirectX、OpenGLでは、垂直同期に連動して裏表画面を切り替える機能がありますのでティアリングを完全に避けることが出来ます。Win32APIだけを使う限りは避けられないと考えた方が良さそうです。
理由は、Win32APIでは垂直同期のタイミングを掴むAPIが存在しないためです。
※ 周期(リフレッシュレート)だけは分かりますが、タイミングが分かるわけではありません。
ティアリングの原因↓
http://d4.princess.ne.jp/multimedia/ntsc/tearing.html
テレビゲーム機やDirectX、OpenGLでは、垂直同期に連動して裏表画面を切り替える機能がありますのでティアリングを完全に避けることが出来ます。Win32APIだけを使う限りは避けられないと考えた方が良さそうです。
Re:自機の移動について
返信ありがとうございます。
http://www.play21.jp/board/formz.cgi?ac ... 7126#47092
描画処理は上の通りです。
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
// エントリポイント
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
{
//WNDCLASSEXの初期化
とやったのですが、ティアリングが取れません。
http://www.play21.jp/board/formz.cgi?ac ... 7126#47092
描画処理は上の通りです。
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
// メッセージの種類に応じて処理を分岐します。
HDC hdc;
PAINTSTRUCT ps;
HBITMAP hbmp;
TCHAR buff[10];
switch (message)
{
// ウィンドウ作成時の処理
case WM_CREATE:
// オフスクリーンの作成
hdc = GetDC(hWnd);
g_hdcOff = CreateCompatibleDC(hdc);
hbmp = CreateCompatibleBitmap(hdc,CLIENT_WIDTH,CLIENT_HEIGHT);
ReleaseDC(hWnd, hdc);
SelectObject(g_hdcOff,hbmp);
DeleteObject(hbmp);
SetTimer( hWnd, NULL, 1000, NULL );
return 0;
// マウス移動
case WM_MOUSEMOVE:
g_MouseX = LOWORD(lParam);
g_MouseY = HIWORD(lParam);
return 0;
case WM_TIMER:
InvalidateRect(hWnd,NULL,FALSE);
return 0;
// クライアント領域の再描画処理
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
_stprintf(buff,_T("%.1f\n"),FpsDraw);
SetWindowText(hWnd,buff);
// オフスクリーンからウィンドウに転送
BitBlt(hdc,0,0,CLIENT_WIDTH,CLIENT_HEIGHT,g_hdcOff,0,0,SRCCOPY);
EndPaint(hWnd,&ps);
return 0;
// ウインドウが破棄されたときの処理
case WM_DESTROY:
PostQuitMessage(0);
return 0;
// デフォルトの処理
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}}
// エントリポイント
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
{
//WNDCLASSEXの初期化
・
・
・
// ウインドウクラスを登録します。
RegisterClassEx(&wcex);
RECT rect = {0, 0, CLIENT_WIDTH, CLIENT_HEIGHT};
AdjustWindowRect(&rect, MY_WS, FALSE);
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;
// ウインドウを作成します。
g_hWnd = CreateWindow(wcex.lpszClassName,_T("WinAPISample"),MY_WS,100,30,width, height,NULL,NULL,hInstance,NULL); [pre] // ウインドウを表示します。
ShowWindow(g_hWnd, nCmdShow);
UpdateWindow(g_hWnd);
// 初期化処理
Init();
// タイマーの精度を1msにする
TIMECAPS tc;
timeGetDevCaps(&tc, sizeof(tc));
timeBeginPeriod(tc.wPeriodMin);
// メッセージループ
while(true)
{
if (PeekMessage(&msg, NULL, 0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
WaitFps();
Draw();
Sleep(1);
}
}
timeEndPeriod(tc.wPeriodMin);
// 終了処理
Cleanup();
// 戻り値を返します。
return (int)msg.wParam;}
とやったのですが、ティアリングが取れません。
Re:自機の移動について
回答ありがとうございます。ということはWIN32APIではティアリングは
起きても直すことが出来ないのはしょうがないということでしょうか?
前にこのサイトでゲームを提供してくれたC言語とWIN32APIで作ったゲームでは
ティアリングは起きなかったのですが、どういうことなのでしょうか?
起きても直すことが出来ないのはしょうがないということでしょうか?
前にこのサイトでゲームを提供してくれたC言語とWIN32APIで作ったゲームでは
ティアリングは起きなかったのですが、どういうことなのでしょうか?
Re:自機の移動について
>前にこのサイトでゲームを提供してくれたC言語とWIN32APIで作ったゲームでは
>ティアリングは起きなかったのですが、どういうことなのでしょうか?
そのゲームを見ていませんので分かりません。
ソースコードがあるなら調べられるのでは?
>ティアリングは起きなかったのですが、どういうことなのでしょうか?
そのゲームを見ていませんので分かりません。
ソースコードがあるなら調べられるのでは?
Re:自機の移動について
>DeleteObject(hbmp);
SetTimer( hWnd, NULL, 1000, NULL );
せっかく作ったビットマップをすぐに削除しては意味がありません。
WM_DESTROYで削除すれば良いと思います。
また、私は先のコードでビットマップをグローバル変数にしてしまいましたがstaticで良いですね。
それと、画面の書き換えは1秒間隔で良いのですか?
シューティングゲームとのことなので普通は1/60秒周期かなと。
SetTimer( hWnd, NULL, 1000, NULL );
せっかく作ったビットマップをすぐに削除しては意味がありません。
WM_DESTROYで削除すれば良いと思います。
また、私は先のコードでビットマップをグローバル変数にしてしまいましたがstaticで良いですね。
それと、画面の書き換えは1秒間隔で良いのですか?
シューティングゲームとのことなので普通は1/60秒周期かなと。
Re:自機の移動について
softyaさん
返信ありがとうございます。
そうですか・・・
すみません。exeファイルと画像だけでしたので、ソースコードはわかりません。
fatensさん
返信ありがとうございます。
>それと、画面の書き換えは1秒間隔で良いのですか?
>シューティングゲームとのことなので普通は1/60秒周期かなと。
static DWORD befoer_time,befoer,Count0t;
DWORD now_time,t;
static int count=0;
long long team=0;
TCHAR buff[100];
DWORD cnt;
static long long surprus_Time=0;
now_time=timeGetTime();
if(!befoer_time)
if(surprus_Time<=0){
else
{
if(team>0)
wsprintf(buff,_T("%u\n"),(now_time-befoer_time)+team);
OutputDebugString(buff);
befoer_time=timeGetTime();
cnt=timeGetTime();
t=cnt-befoer;
if(t>=1000)
{
これでは1/60秒周期にならないのでしょうか。
できたらどこを直せばよいのかおしえてくださるとありがたいです。
ご指摘よろしくお願いします。
返信ありがとうございます。
そうですか・・・
すみません。exeファイルと画像だけでしたので、ソースコードはわかりません。
fatensさん
返信ありがとうございます。
>それと、画面の書き換えは1秒間隔で良いのですか?
>シューティングゲームとのことなので普通は1/60秒周期かなと。
static DWORD befoer_time,befoer,Count0t;
DWORD now_time,t;
static int count=0;
long long team=0;
TCHAR buff[100];
DWORD cnt;
static long long surprus_Time=0;
now_time=timeGetTime();
if(!befoer_time)
befoer_time=timeGetTime();if(!befoer)
befoer=timeGetTime();surprus_Time+=1000/FPS-(long long)(now_time-befoer_time);
if(surprus_Time<=0){
team=0;}
else
{
if(team!=surprus_Time)
team=surprus_Time;
surprus_Time=0;
++count;}
if(team>0)
Sleep(team);
wsprintf(buff,_T("%u\n"),(now_time-befoer_time)+team);
OutputDebugString(buff);
befoer_time=timeGetTime();
cnt=timeGetTime();
t=cnt-befoer;
if(t>=1000)
{
cnt=t;
FpsDraw=count*1000/t;
count=0;
befoer=timeGetTime();}
これでは1/60秒周期にならないのでしょうか。
できたらどこを直せばよいのかおしえてくださるとありがたいです。
ご指摘よろしくお願いします。
Re:自機の移動について
読みにくいのでとりあえずインデントを直してください。
あと、スペルミスも
befoer → before
surprus → surplus
team → ?
あと、スペルミスも
befoer → before
surprus → surplus
team → ?
Re:自機の移動について
すみません。
static DWORD before_time,befoer,Count0t;
DWORD now_time,t;
static int count=0;
long long IdleTime =0;
TCHAR buff[100];
DWORD cnt;
static long long surplus_Time=0;
now_time=timeGetTime();
if(!befoer_time)
befoer_time=timeGetTime();
if(!befoer)
befoer=timeGetTime();
surplus_Time+=1000/FPS-(long long)(now_time-befoer_time);
if(surplus_Time<=0){
IdleTime =0;
}
else
{
if(IdleTime!=surplus_Time)
IdleTime=surplus_Time;
surplus_Time=0;
++count;
}
if(IdleTime>0)
Sleep(IdleTime);
wsprintf(buff,_T("%u\n"),(now_time-before_time)+IdleTime);
OutputDebugString(buff);
before_time=timeGetTime();
cnt=timeGetTime();
t=cnt-before;
if(t>=1000)
{
cnt=t;
FpsDraw=count*1000/t;
count=0;
before=timeGetTime();
}です。
Re:自機の移動について
>そうですか・・・
>すみません。exeファイルと画像だけでしたので、ソースコードはわかりません。
ソース無しでWin32APIしか使っていないと言うのはなぜ分かったのでしょうか?
そのexeファイルのある場所を教えてもらませんか。
>すみません。exeファイルと画像だけでしたので、ソースコードはわかりません。
ソース無しでWin32APIしか使っていないと言うのはなぜ分かったのでしょうか?
そのexeファイルのある場所を教えてもらませんか。
Re:自機の移動について
説明文に書いてありました。
サイトならあります。
http://www14.atpages.jp/kawae/shot.html
ただいまは工事中で取れないみたいなのですが。
今持っていますが、流しますか?
ただファイルが、ありすぎて全部流すのは出来ないのですが。
サイトならあります。
http://www14.atpages.jp/kawae/shot.html
ただいまは工事中で取れないみたいなのですが。
今持っていますが、流しますか?
ただファイルが、ありすぎて全部流すのは出来ないのですが。
Re:自機の移動について
>ただいまは工事中で取れないみたいなのですが。
>今持っていますが、流しますか?
いえ、大丈夫です。
同サイトのパズルを見た限りでは、Win32APIしか使っていない様ですね。
使っている関数から、裏画面制御はしていると思います。
FPS制御と裏画面処理だけでティアリングを完全には押さえ込めないなずなんですけどね。
>今持っていますが、流しますか?
いえ、大丈夫です。
同サイトのパズルを見た限りでは、Win32APIしか使っていない様ですね。
使っている関数から、裏画面制御はしていると思います。
FPS制御と裏画面処理だけでティアリングを完全には押さえ込めないなずなんですけどね。
Re:自機の移動について
裏画面処理はしているつもりでいるのですが、これだけでは足りないということでしょうか。。。
http://www.play21.jp/board/formz.cgi?ac ... 7165#47165
http://www.play21.jp/board/formz.cgi?ac ... 7165#47165
Re:自機の移動について
>このサイトのパズル、ティアリングは起きてないのですが、?のところが微妙にブレて見えてしまうのは
あれ?
Vistaだとティアリングが発生しづらいので、私が気づかなったのかも知れませんね。
じゃあ、exeだけをzipしてメールで送ってもらえますか?
公開してしまうと作者さんの再配布の問題があると思いますので。
あれ?
Vistaだとティアリングが発生しづらいので、私が気づかなったのかも知れませんね。
じゃあ、exeだけをzipしてメールで送ってもらえますか?
公開してしまうと作者さんの再配布の問題があると思いますので。
Re:自機の移動について
>今度はどうでしょうか?
>自分に送ってみましたが、無事届いています。
うーん。だめですね。
自分で送ったのは届くんですけどね。
こちらに送ってみてもらえます?
<スパムが嫌なのでメールアドレスは削除>

>自分に送ってみましたが、無事届いています。
うーん。だめですね。
自分で送ったのは届くんですけどね。
こちらに送ってみてもらえます?
<スパムが嫌なのでメールアドレスは削除>

Re:自機の移動について
使っているAPIの一覧です。
USER32.BeginPaint
GDI32.BitBlt
USER32.ChangeDisplaySettingsA
KERNEL32.CloseHandle
GDI32.CreateCompatibleBitmap
GDI32.CreateCompatibleDC
KERNEL32.CreateFileA
GDI32.CreateFontA
USER32.CreateWindowExA
USER32.DefWindowProcA
GDI32.DeleteDC
GDI32.DeleteObject
USER32.DestroyWindow
USER32.DispatchMessageA
USER32.EndPaint
USER32.EnumThreadWindows
KERNEL32.ExitProcess
USER32.FindWindowA
KERNEL32.GetACP
KERNEL32.GetCommandLineA
KERNEL32.GetCPInfo
KERNEL32.GetCurrentThreadId
USER32.GetDC
KERNEL32.GetEnvironmentStrings
KERNEL32.GetFileType
KERNEL32.GetLastError
KERNEL32.GetLocalTime
USER32.GetMessageA
KERNEL32.GetModuleFileNameA
KERNEL32.GetModuleHandleA
GDI32.GetObjectA
KERNEL32.GetOEMCP
KERNEL32.GetProcAddress
KERNEL32.GetProcessHeap
KERNEL32.GetStartupInfoA
KERNEL32.GetStdHandle
GDI32.GetStockObject
KERNEL32.GetStringTypeW
USER32.GetSystemMetrics
KERNEL32.GetTimeZoneInformation
KERNEL32.GetVersion
KERNEL32.GetVersionExA
KERNEL32.GlobalMemoryStatus
KERNEL32.HeapAlloc
KERNEL32.HeapFree
USER32.InvalidateRect
KERNEL32.LCMapStringA
USER32.LoadCursorA
USER32.LoadIconA
USER32.LoadImageA
KERNEL32.LoadLibraryA
USER32.MessageBoxA
USER32.MoveWindow
WINMM.PlaySoundA
USER32.PostQuitMessage
KERNEL32.RaiseException
USER32.RegisterClassExA
USER32.ReleaseDC
KERNEL32.RtlUnwind
GDI32.SelectObject
USER32.SendMessageA
GDI32.SetBkMode
KERNEL32.SetConsoleCtrlHandler
KERNEL32.SetFilePointer
KERNEL32.SetHandleCount
GDI32.SetTextColor
USER32.SetTimer
USER32.SetWindowLongA
USER32.SetWindowPos
USER32.ShowCursor
USER32.ShowWindow
GDI32.TextOutA
KERNEL32.TlsAlloc
KERNEL32.TlsFree
KERNEL32.TlsGetValue
KERNEL32.TlsSetValue
USER32.TranslateMessage
MSIMG32.TransparentBlt
KERNEL32.UnhandledExceptionFilter
USER32.UpdateWindow
KERNEL32.VirtualAlloc
KERNEL32.VirtualFree
KERNEL32.WriteFile
USER32.wsprintfA
特にティアリングを予防するためのAPIは見当たりませんね。
ごく普通のAPIばっかりです。
って事で中でDirectXとかOpenGLとかも使ってないことが確認出来ました。
まぁ、だから困ったなって話なんですけどね。
USER32.BeginPaint
GDI32.BitBlt
USER32.ChangeDisplaySettingsA
KERNEL32.CloseHandle
GDI32.CreateCompatibleBitmap
GDI32.CreateCompatibleDC
KERNEL32.CreateFileA
GDI32.CreateFontA
USER32.CreateWindowExA
USER32.DefWindowProcA
GDI32.DeleteDC
GDI32.DeleteObject
USER32.DestroyWindow
USER32.DispatchMessageA
USER32.EndPaint
USER32.EnumThreadWindows
KERNEL32.ExitProcess
USER32.FindWindowA
KERNEL32.GetACP
KERNEL32.GetCommandLineA
KERNEL32.GetCPInfo
KERNEL32.GetCurrentThreadId
USER32.GetDC
KERNEL32.GetEnvironmentStrings
KERNEL32.GetFileType
KERNEL32.GetLastError
KERNEL32.GetLocalTime
USER32.GetMessageA
KERNEL32.GetModuleFileNameA
KERNEL32.GetModuleHandleA
GDI32.GetObjectA
KERNEL32.GetOEMCP
KERNEL32.GetProcAddress
KERNEL32.GetProcessHeap
KERNEL32.GetStartupInfoA
KERNEL32.GetStdHandle
GDI32.GetStockObject
KERNEL32.GetStringTypeW
USER32.GetSystemMetrics
KERNEL32.GetTimeZoneInformation
KERNEL32.GetVersion
KERNEL32.GetVersionExA
KERNEL32.GlobalMemoryStatus
KERNEL32.HeapAlloc
KERNEL32.HeapFree
USER32.InvalidateRect
KERNEL32.LCMapStringA
USER32.LoadCursorA
USER32.LoadIconA
USER32.LoadImageA
KERNEL32.LoadLibraryA
USER32.MessageBoxA
USER32.MoveWindow
WINMM.PlaySoundA
USER32.PostQuitMessage
KERNEL32.RaiseException
USER32.RegisterClassExA
USER32.ReleaseDC
KERNEL32.RtlUnwind
GDI32.SelectObject
USER32.SendMessageA
GDI32.SetBkMode
KERNEL32.SetConsoleCtrlHandler
KERNEL32.SetFilePointer
KERNEL32.SetHandleCount
GDI32.SetTextColor
USER32.SetTimer
USER32.SetWindowLongA
USER32.SetWindowPos
USER32.ShowCursor
USER32.ShowWindow
GDI32.TextOutA
KERNEL32.TlsAlloc
KERNEL32.TlsFree
KERNEL32.TlsGetValue
KERNEL32.TlsSetValue
USER32.TranslateMessage
MSIMG32.TransparentBlt
KERNEL32.UnhandledExceptionFilter
USER32.UpdateWindow
KERNEL32.VirtualAlloc
KERNEL32.VirtualFree
KERNEL32.WriteFile
USER32.wsprintfA
特にティアリングを予防するためのAPIは見当たりませんね。
ごく普通のAPIばっかりです。
って事で中でDirectXとかOpenGLとかも使ってないことが確認出来ました。
まぁ、だから困ったなって話なんですけどね。
Re:自機の移動について
>というかすごいです!?
>どうやって調べたんですか!?
リバースエンジニアリング関係のデバッガ・ツールです。
悪い用途にも使えるので、ここに書くのは止めて置きます。
>どうやって調べたんですか!?
リバースエンジニアリング関係のデバッガ・ツールです。
悪い用途にも使えるので、ここに書くのは止めて置きます。
Re:自機の移動について
お話戻って済みません。
関係ないかも。で、申し訳ないのですが、
WM_PAINTに入っているSetWindowText()の位置が気になりました。
BeginPaint()とEndPaint()の間のBitBlt()で裏画面から一発転送。なのだと思うので、関係なさそうには思えるのですが、その前でやってるSetWindowText()がタイミング的になんか足を引っ張ったりはしないかと。
ちょっとコメントアウトしてみるか、
// _stprintf(buff,_T("%.1f\n"),FpsDraw);
// SetWindowText(hWnd,buff);
BeginPaint()の前かEndPaint()の後ろにはじき出すか、
// クライアント領域の再描画処理
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
// オフスクリーンからウィンドウに転送
BitBlt(hdc,0,0,CLIENT_WIDTH,CLIENT_HEIGHT,g_hdcOff,0,0,SRCCOPY);
EndPaint(hWnd,&ps);
// EndPaint()の後ろにSetText()を移動してみる
_stprintf(buff,_T("%.1f\n"),FpsDraw);
SetWindowText(hWnd,buff);
return 0;
してみると、よさげ。になったりしないでしょうか。
あてずっぽうでごめんなさい。
関係ないかも。で、申し訳ないのですが、
WM_PAINTに入っているSetWindowText()の位置が気になりました。
BeginPaint()とEndPaint()の間のBitBlt()で裏画面から一発転送。なのだと思うので、関係なさそうには思えるのですが、その前でやってるSetWindowText()がタイミング的になんか足を引っ張ったりはしないかと。
ちょっとコメントアウトしてみるか、
// _stprintf(buff,_T("%.1f\n"),FpsDraw);
// SetWindowText(hWnd,buff);
BeginPaint()の前かEndPaint()の後ろにはじき出すか、
// クライアント領域の再描画処理
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
// オフスクリーンからウィンドウに転送
BitBlt(hdc,0,0,CLIENT_WIDTH,CLIENT_HEIGHT,g_hdcOff,0,0,SRCCOPY);
EndPaint(hWnd,&ps);
// EndPaint()の後ろにSetText()を移動してみる
_stprintf(buff,_T("%.1f\n"),FpsDraw);
SetWindowText(hWnd,buff);
return 0;
してみると、よさげ。になったりしないでしょうか。
あてずっぽうでごめんなさい。
Re:自機の移動について
> できたら教えていただきたいので大変恐縮なのですが、
> メールで教えてくださらないでしょうか?
softyaさんがどのように判断されるかは別ですが、
今までに出ているヒントから自分で調べられない人には必要のないツールです。
ツールを教えれば今度はツールの使い方の質問をするようになるだけです。
替わりに私は入門書を教えましょう。
ふざけた本ですが入門にはなります。
『解析魔法少女美咲ちゃん』
> メールで教えてくださらないでしょうか?
softyaさんがどのように判断されるかは別ですが、
今までに出ているヒントから自分で調べられない人には必要のないツールです。
ツールを教えれば今度はツールの使い方の質問をするようになるだけです。
替わりに私は入門書を教えましょう。
ふざけた本ですが入門にはなります。
『解析魔法少女美咲ちゃん』