実現したいこと
Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.14.8
C++20
DXライブラリ Ver 3.24f
を使用して、プログラミングをしています。
ディスプレイに背景画像と画像A(キャラクター)を描画するのですが、
画像Aが止まっているときは残像のようなものが見えないのですが、
画像Aを動かしているときには、画像Aの動く方向の画像端のほうに、
背景との合成のような残像のようなものが見えました。
画像Aはキャラクターを描画していると思ってもらえばわかりやすいと思いますが、
画像Aが単純な四角画像の場合は画像端のみ残像があるように見えるのですが、
実際のキャラクターの画像を描画した場合、
特にジャンプなどの斜め移動をする動きをするとき、キャラクターの全体に残像がかかって、かなり見づらいのです。
画像AがBMP画像でも現象が起きます。
テストではウィンドウモードにしていますが、フルスクリーンでも現象が起きます。
また、画面をキャプチャソフトで録画した場合の録画動画でも現象が確認できました。
とりあえずの背景、キャラクター画像はこの質問の最後のほうに張り付けてあります。
これが自分の環境に特有のものなのか、
どんな環境でも起きる現象なのか、
あるいは原因は何か、解決策があれば知りたいです。
該当のソースコード
C++
1//test.h 2#pragma once 3 4#include "DxLib.h" 5 6//変数、関数宣言 7extern int dGraphHandle1; 8extern int dGraphHandle2; 9extern bool dFlag; 10extern int dX; 11extern int dY; 12 13inline void dP_X(int i) { int n = dX; dX = n + i; } 14inline void dP_Y(int i) { int n = dY; dY = n + i; } 15 16void dGraphMove(); 17 18//test.cpp 19#include "test.h" 20 21//変数、関数定義 22int dGraphHandle1 = 0; 23int dGraphHandle2 = 0; 24bool dFlag = 0; 25 26int dX = 0; 27int dY = 0; 28 29void dGraphMove() 30{ 31 //画像を読み込む 32 if (dFlag == false) 33 { 34 dGraphHandle1 = DxLib::LoadGraph("キャラクター画像.png"); 35 dGraphHandle2 = DxLib::LoadGraph("背景画像.png"); 36 37 dFlag = true; 38 } 39 40//描画先を裏画面にする 41 DxLib::SetDrawScreen(DX_SCREEN_BACK); 42//画面をクリアする 43 DxLib::ClearDrawScreen(); 44 45//キャラクターの移動速度 46 int speed = 10; 47 48//上下左右移動 49 if (DxLib::CheckHitKey(KEY_INPUT_UP) != 0) 50 { 51 dP_Y(-speed); 52 } 53 else if (DxLib::CheckHitKey(KEY_INPUT_DOWN) != 0) 54 { 55 dP_Y(speed); 56 } 57 58 if (DxLib::CheckHitKey(KEY_INPUT_LEFT) != 0) 59 { 60 dP_X(-speed); 61 } 62 else if (DxLib::CheckHitKey(KEY_INPUT_RIGHT) != 0) 63 { 64 dP_X(speed); 65 } 66 67//描画の際のブレンドモード無し 68 DxLib::SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0); 69 70//背景、キャラクター描画 71 DxLib::DrawGraph 72 ( 73 0, 74 0, 75 dGraphHandle2, 76 TRUE 77 ); 78 79 DxLib::DrawGraph 80 ( 81 dX, 82 dY, 83 dGraphHandle1, 84 TRUE 85 ); 86 87//裏画面を表画面に描画 88 DxLib::ScreenFlip(); 89} 90 91//main.cpp 92#pragma once 93#include "test.h" 94 95//FPS制御のための変数 96unsigned long long dNow = 0; 97unsigned long long dStart = 0; 98bool dFlag_Time = 0; 99int dCount = 0; 100 101double dOneFrame = 1000000 / 60; 102 103//main関数 104int WINAPI _tWinMain( 105 [[maybe_unused]] _In_ HINSTANCE hInstance, 106 [[maybe_unused]] _In_opt_ HINSTANCE hPrevInstance, 107 [[maybe_unused]] _In_ LPSTR lpCmdLine, 108 [[maybe_unused]] _In_ int nCmdShow) 109{ 110 111 //ウィンドウモードに変更 112 DxLib::ChangeWindowMode(true); 113 DxLib::SetGraphMode(1900, 1080, 32); 114 115 if (DxLib_Init() == -1) // DXライブラリ初期化処理 116 { 117 return -1; // エラーが起きたら直ちに終了 118 } 119 120 //描画先を裏画面にする 121 DxLib::SetDrawScreen(DX_SCREEN_BACK); 122 123 //ループ処理 124 while ((DxLib::ProcessMessage() == 0) && (DxLib::CheckHitKey(KEY_INPUT_ESCAPE) == 0)) 125 { 126 //FPS処理の初期化 127 if (dFlag_Time == false) 128 { 129 dStart = DxLib::GetNowHiPerformanceCount(); 130 dFlag_Time = true; 131 } 132 133 //現在の時間 134 dNow = DxLib::GetNowHiPerformanceCount(); 135 136 unsigned long long dif = dNow - dStart; 137 138 //FPS制御 139 if (dif >= (dOneFrame * dCount)) 140 { 141 142 //裏画面セット、クリア、 143 //キャラクターの座標移動、 144 //ブレンドモード無し、背景、キャラクターの描画、 145 //ダブルバッファリング 146 dGraphMove(); 147 148 ++dCount; 149 150 //1秒ごと(1000000ミリ秒)に開始時間、カウントをリセット 151 if (dif >= 1000000) 152 { 153 dStart = DxLib::GetNowHiPerformanceCount(); 154 dCount = 0; 155 } 156 } 157 158 } 159 160 DxLib_End(); // DXライブラリ使用の終了処理 161 162 return 0; // ソフトの終了 163 164}

回答1件
あなたの回答
tips
プレビュー