c言語
前提・実現したいこと
dxlibを使って簡単なマウスを使って線を引けるプログラム
発生している問題・エラーメッセージ
dxlibを使って簡単なマウスを使って絵(線)をかけるプログラムを作っているのですが 線を引くこと自体はできているのですがその線同士が繋がってしまってしまいます(線を 引き終わって別の場所に線を引こうとすると前の線の終点から今引こうとしてる始点が繋 がってしまう) 一応線と線の距離を求めて一定距離離れたら描画できないようにすればいいかなと思った んですがそれだとマウスを速く動かした時、線が描画されません どうすれば線同士が繋がらないようにできるのでしょうか
該当のソースコード
#include "DxLib.h" #include<math.h> const char TITLE[] = ""; const int WIN_WIDTH = 600; //ウィンドウ横幅 const int WIN_HEIGHT = 400;//ウィンドウ縦幅 int PrevMouseInput = 0; int MouseInput; bool isdown(int MouseBotton) { if (((MouseInput & MouseBotton) != (PrevMouseInput & MouseBotton)) && ((MouseInput & MouseBotton) != 0)) return true; return false; } #define BC 20000//黒線の制限 #define EC 20000//消しゴムの制限 int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow) { ChangeWindowMode(TRUE); //ウィンドウモードに設定 //ウィンドウサイズを手動では変更できず、かつウィンドウサイズに合わせて拡大できないようにする SetWindowSizeChangeEnableFlag(FALSE, FALSE); SetMainWindowText(TITLE); // タイトルを変更 SetGraphMode(WIN_WIDTH, WIN_HEIGHT, 32); //画面サイズの最大サイズ、カラービット数を設定(モニターの解像度に合わせる) SetWindowSizeExtendRate(1.0); //画面サイズを設定(解像度との比率で設定) SetBackgroundColor(255,255,255); // 画面の背景色を設定する //Dxライブラリの初期化 if (DxLib_Init() == -1) { return -1; } //(ダブルバッファ)描画先グラフィック領域は裏面を指定 SetDrawScreen(DX_SCREEN_BACK); //画像などのリソースデータの変数宣言と読み込み int BlackPenX = 0, BlackPenY = 0, Blackradiuss = 1;//書き始めのところ //線の構造体x,y座標、半径、色情報、切り替えフラグ typedef struct lineseg { int BlackLineX; int BlackLineY; int radius; int cr; int flag; }lines; lines bline[BC]; float px, py; int mousex = 0, mousey = 0;//mouse座標の取得 //int BlackPenX, BlackPenY, Blackradiuss; // //黒線の初期化位置をBlackPenX,yに for (int i = 0; i < BC; i++) { bline[i].BlackLineX = BlackPenX, bline[i].BlackLineY = BlackPenY, bline[i].radius = Blackradiuss, bline[i].flag = 0,bline[i].cr=GetColor(0,128,0); } int clickX, clickY; int counttimer = 0;//描画数 int Ecounttimer = 0; int hanareflag = 0; int type = 0; int mousetouch = 0; //ゲームループで使う変数の宣言 char keys[256] = { 0 }; //最新のキーボード情報用 char oldkeys[256] = { 0 };//1ループ(フレーム)前のキーボード情報 // ゲームループ while (1) { //最新のキーボード情報だったものは1フレーム前のキーボード情報として保存 //最新のキーボード情報を取得 GetHitKeyStateAll(keys); //画面クリア ClearDrawScreen(); //--------- ここからプログラムを記述 ----------// //更新処理 //mouseがタッチ去れた時に建てる if ((GetMouseInput() & MOUSE_INPUT_LEFT) == 1) { mousetouch = 1; } if ((GetMouseInput() & MOUSE_INPUT_LEFT) == 0) { mousetouch = 0; } //消しゴムとペンの切り替えフラグ if (keys[KEY_INPUT_1] == 1) { type = 1; } else if (keys[KEY_INPUT_R] == 1) { type = 3; } else if (keys[KEY_INPUT_G] == 1) { type = 4; } else if (keys[KEY_INPUT_B] == 1) { type = 5; } if (type !=0) { //kaeflag = 1; if (keys[KEY_INPUT_2] == 1) { type = 0; } } //for (int i = 0; i < BC; i++) { if (type == 0) { bline[counttimer].cr = GetColor(0, 0, 0); } else if (type == 1) { bline[counttimer].cr = GetColor(255, 255, 255); bline[counttimer].radius = 13; } else if (type == 3) { bline[counttimer].cr = GetColor(255, 0, 0); } else if (type == 4) { bline[counttimer].cr = GetColor(0, 255, 0); } else if (type == 5) { bline[counttimer].cr = GetColor(0, 0, 255);; } //全部消すやつ if (keys[KEY_INPUT_0] == 1) { counttimer = 0; Ecounttimer = 0; } //黒線の方の処理 GetMousePoint(&mousex, &mousey); //GetMouseInput(); MouseInput = GetMouseInput(); //mouseが押されたらフラグを1に if ((GetMouseInput() & MOUSE_INPUT_LEFT) == 1){ GetMousePoint(&clickX, &clickY); for (int i = 0; i < BC; i++) { bline[i].flag = 1; } } //カーソル座標をクリック位置に for (int i = 0; i < BC; i++) { if (bline[i].flag == 1) { BlackPenX = clickX; BlackPenY = clickY; } //if (mousetouch == 0) break; } //点をmouse位置に if (BlackPenX != 0 && BlackPenY != 0) { bline[counttimer].BlackLineX = BlackPenX; bline[counttimer].BlackLineY = BlackPenY; //制限時間内であれば残像の描画を1ずつ増やす if (counttimer < BC&&mousetouch!=0) { counttimer++; } DrawFormatString(80, 5, GetColor(0, 0, 0), "%d", counttimer); } //線描画処理 点 for (int i = 1; i < counttimer; i++) { DrawPixel(bline[i].BlackLineX, bline[i].BlackLineY, bline[i].cr); //線と線の距離を求める double length = sqrt(((bline[i].BlackLineX - bline[i - 1].BlackLineX) * (bline[i].BlackLineX - bline[i - 1].BlackLineX)) + ((bline[i].BlackLineY - bline[i - 1].BlackLineY) * (bline[i].BlackLineY - bline[i - 1].BlackLineY))); //今はある程度距離が離れたら線結ばないようにしてるがmouseを速く動かしたときも線が途切れてしまう if (length < 6) { //前の点と今の点を結ぶ DrawLine(bline[i - 1].BlackLineX, bline[i - 1].BlackLineY, bline[i].BlackLineX, bline[i].BlackLineY, bline[i].cr, 3); } } if (type == 0) { DrawLine(BlackPenX, BlackPenY, BlackPenX + Blackradiuss, BlackPenY + Blackradiuss, GetColor(0, 0, 0)); } if (isdown(MOUSE_INPUT_LEFT)) { DrawFormatString(300, 200, GetColor(0, 0, 0), "osareta"); } //説明書きのところ DrawFormatString(0, 0, GetColor(0, 0, 0), "全削除:0"); if (type == 0) { DrawFormatString(0, 50, GetColor(0, 0, 0), "消しゴム:1 OFF"); } else { DrawFormatString(0, 50, GetColor(0, 0, 0), "消しゴム:1 ON"); } //--------- ここまでにプログラムを記述 ---------// ScreenFlip();//(ダブルバッファ)裏面 // 20ミリ秒待機(疑似60FPS) WaitTimer(20); // Windows システムからくる情報を処理する if (ProcessMessage() == -1) { break; } // ESCキーが押されたらループから抜ける if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) { break; } } //Dxライブラリ終了処理 DxLib_End(); return 0; }
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/14 16:34
2021/05/14 18:44
2021/05/15 01:53