DXライブラリにおけるマウス入力機能

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
marumine
記事: 5
登録日時: 6年前

DXライブラリにおけるマウス入力機能

#1

投稿記事 by marumine » 2年前

DXライブラリでマウス入力のライブラリを作ってみました。
押した瞬間(Press)、押してる間(Hold)、離した瞬間(Release)の機能があり
実際に意図した動作になっているので問題ないように思えるのですが
他の人の意見を聞いてみたくてここに公開してみました。
この実装では問題があるとか、普通ならこうしたほうが良いといった事があればコメントお願いします。

MouseInput.h

コード:

#pragma once

class MouseInput
{
	int curX, curY;
	int prevCurX, prevCurY;
	int wheel_cnt;
	int leftState,leftPrevState;
	int rightState,rightPrevState;
public:
	MouseInput();
	~MouseInput();

	int GetStateMouse();
	int getX();
	int getY();
	int getMoveX();
	int getMoveY();
	int GetPress(int Code);
	int GetHold(int Code);
	int GetRelease(int Code);
};
MouseInput.cpp

コード:

#include"MouseInput.h"
#include<DxLib.h>

MouseInput::MouseInput()
{
	leftState = 0,leftPrevState = 0;
	rightState = 0,rightPrevState = 0;
	curX = 0, curY = 0;
	prevCurX = curX, prevCurY = curY;
}

MouseInput::~MouseInput()
{

}

int MouseInput::GetStateMouse()
{
	prevCurX = curX, prevCurY = curY;
	GetMousePoint(&curX, &curY);

	if (GetMouseInput() & MOUSE_INPUT_LEFT)
	{
		leftPrevState = leftState;
		leftState++;
	}
	else
	{
		leftPrevState = leftState;
		leftState = 0;
	}

	if (GetMouseInput() & MOUSE_INPUT_RIGHT)
	{
		rightPrevState = rightState;
		rightState++;
	}
	else
	{
		rightPrevState = rightState;
		rightState = 0;
	}
	return 0;
}

int MouseInput::getX()
{
	return curX;
}

int MouseInput::getY()
{
	return curY;
}

int MouseInput::getMoveX()
{
	return curX - prevCurX;
}

int MouseInput::getMoveY()
{
	return curY - prevCurY;
}

int MouseInput::GetHold(int Code)
{
	if (Code == MOUSE_INPUT_LEFT)
	{
		return (leftState > 1) ? leftState : 0;
	}
	if (Code == MOUSE_INPUT_RIGHT)
	{
		return (rightState > 1) ? rightState : 0;
	}
	return -1;
}

int MouseInput::GetPress(int Code)
{
	if (Code == MOUSE_INPUT_LEFT)
	{
		return (leftState == 1) ? 1 : 0;
	}
	if (Code == MOUSE_INPUT_RIGHT)
	{
		return (rightState == 1) ? 1 : 0;
	}
	return -1;
}

int MouseInput::GetRelease(int Code)
{
	if (Code == MOUSE_INPUT_LEFT)
	{
		if (leftPrevState > 0 && leftState == 0)
		{
			return 1;
		}
		return 0;
	}
	if (Code == MOUSE_INPUT_RIGHT)
	{
		if (rightPrevState > 0 && rightState == 0)
		{
			return 1;
		}
		return 0;
	}
	return -1;
}
使用例

コード:

#include<DxLib.h>
#include"MouseInput.h"


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	ChangeWindowMode(true);

	if (DxLib_Init() != 0 || SetDrawScreen(DX_SCREEN_BACK) != 0)return -1;

	MouseInput mouse;

	while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		//マウスの状態を取得
		mouse.GetStateMouse();

		//マウスの左を押した瞬間
		if (mouse.GetPress(MOUSE_INPUT_LEFT))
		{
			DrawString(0, 0, "Press", 0xffffff);
		}
		if (mouse.GetHold(MOUSE_INPUT_LEFT))
		{
			DrawString(0, 16, "Hold", 0xffffff);
		}
		if (mouse.GetRelease(MOUSE_INPUT_LEFT))
		{
			DrawString(0, 32, "Release", 0xffffff);
		}

		ScreenFlip();
	}

	DxLib_End();

	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: DXライブラリにおけるマウス入力機能

#2

投稿記事 by みけCAT » 2年前

とりあえず、
  • 変数 wheel_cnt が、宣言されているだけで全く使用されていない。
  • MouseInput::GetStateMouse がせっかく int を返すのに、GetMousePoint のエラー処理がされていない。
  • leftPrevState = leftState; および rightPrevState = rightState; が、if文の両方の節に書かれている。
    prevCurX や prevCurY の処理と同様、前に出した方が良さそう。
  • leftState や rightState のインクリメント時のオーバーフローチェックが無い。
    多分20億フレームも連続して使うやつは居ないだろうからヨシ!
  • DrawString 関数で使う色を決め打ちしてしまうと、動く環境が限定されてしまい良くない。
    色を表す値は GetColor 関数を使って取得するべき。
あたりが気になりました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

marumine
記事: 5
登録日時: 6年前

Re: DXライブラリにおけるマウス入力機能

#3

投稿記事 by marumine » 2年前

>>#2
返信ありがとうございます。
* wheel_cntに関してこちらの機能は実装中で変数だけ宣言してる状態です。中途半端な状態ですみません。
* 色に関しては急遽サンプルを作るために横着しました。
* leftPrevStateとrightPrevStateはこんな感じで修正すればいいですかね

コード:

int MouseInput::GetStateMouse()
{
	prevCurX = curX, prevCurY = curY;
	leftPrevState = leftState;
	rightPrevState = rightState;

	if (GetMousePoint(&curX, &curY) == -1)
	{
		return -1;
	}

	if (GetMouseInput() & MOUSE_INPUT_LEFT)
	{
		leftState++;
	}
	else
	{
		leftState = 0;
	}

	if (GetMouseInput() & MOUSE_INPUT_RIGHT)
	{
		rightState++;
	}
	else
	{
		rightState = 0;
	}

	return 0;
}

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: DXライブラリにおけるマウス入力機能

#4

投稿記事 by あたっしゅ » 2年前

東上☆海美☆「
singleton 化してみたみみ。

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21299
// DXライブラリにおけるマウス入力機能 - ミクプラ(ja)
//
// for Visual Studio 2022 Preview on Windows11 Insider Preview
//
//
//#pragma once
#include<cstdlib>

#include<DxLib.h>


template <typename _T>


class Singleton {

protected:
	Singleton() = default;
	virtual ~Singleton() = default;
	Singleton(const Singleton& r) = default;
	Singleton& operator=(const Singleton& r) = default;

public:
	static _T* getIns() {
		static _T inst;
		return &inst;
	};

};


class MouseInput final: public Singleton<MouseInput>
{
	static int curX, curY;
	static int prevCurX, prevCurY;
	static int wheel_cnt;
	static int leftState, leftPrevState;
	static int rightState, rightPrevState;
	MouseInput();
	~MouseInput() = default;

public:
	static MouseInput* getIns() {
		static MouseInput inst;

		return &inst;
	};

	int GetStateMouse();
	int getX();
	int getY();
	int getMoveX();
	int getMoveY();
	int GetPress(int Code);
	int GetHold(int Code);
	int GetRelease(int Code);
};
//
//
//
//#include"MouseInput.h"
//#include<DxLib.h>
int MouseInput::curX, MouseInput::curY;
int MouseInput::prevCurX, MouseInput::prevCurY;
int MouseInput::wheel_cnt;
int MouseInput::leftState, MouseInput::leftPrevState;
int MouseInput::rightState, MouseInput::rightPrevState;


MouseInput::MouseInput()
{
	leftState = 0, leftPrevState = 0;
	rightState = 0, rightPrevState = 0;
	curX = 0, curY = 0;
	prevCurX = curX, prevCurY = curY;
}

#if 0
MouseInput::~MouseInput()
{

}
#endif

int MouseInput::GetStateMouse()
{
#if 0
	prevCurX = curX, prevCurY = curY;
	GetMousePoint(&curX, &curY);

	if (GetMouseInput() & MOUSE_INPUT_LEFT)
	{
		leftPrevState = leftState;
		leftState++;
	}
	else
	{
		leftPrevState = leftState;
		leftState = 0;
	}

	if (GetMouseInput() & MOUSE_INPUT_RIGHT)
	{
		rightPrevState = rightState;
		rightState++;
	}
	else
	{
		rightPrevState = rightState;
		rightState = 0;
	}
#else
	prevCurX = curX, prevCurY = curY;
	leftPrevState = leftState;
	rightPrevState = rightState;

	if (GetMousePoint(&curX, &curY) == -1)
	{
		return -1;
	}

	if (GetMouseInput() & MOUSE_INPUT_LEFT)
	{
		leftState++;
	}
	else
	{
		leftState = 0;
	}

	if (GetMouseInput() & MOUSE_INPUT_RIGHT)
	{
		rightState++;
	}
	else
	{
		rightState = 0;
	}
#endif
	return 0;
}


int MouseInput::getX()
{
	return curX;
}

int MouseInput::getY()
{
	return curY;
}

int MouseInput::getMoveX()
{
	return curX - prevCurX;
}

int MouseInput::getMoveY()
{
	return curY - prevCurY;
}

int MouseInput::GetHold(int Code)
{
	if (Code == MOUSE_INPUT_LEFT)
	{
		return (leftState > 1) ? leftState : 0;
	}
	if (Code == MOUSE_INPUT_RIGHT)
	{
		return (rightState > 1) ? rightState : 0;
	}
	return -1;
}

int MouseInput::GetPress(int Code)
{
	if (Code == MOUSE_INPUT_LEFT)
	{
		return (leftState == 1) ? 1 : 0;
	}
	if (Code == MOUSE_INPUT_RIGHT)
	{
		return (rightState == 1) ? 1 : 0;
	}
	return -1;
}

int MouseInput::GetRelease(int Code)
{
	if (Code == MOUSE_INPUT_LEFT)
	{
		if (leftPrevState > 0 && leftState == 0)
		{
			return 1;
		}
		return 0;
	}
	if (Code == MOUSE_INPUT_RIGHT)
	{
		if (rightPrevState > 0 && rightState == 0)
		{
			return 1;
		}
		return 0;
	}
	return -1;
}


//
//
//
//#include<DxLib.h>
//#include"MouseInput.h"


int WINAPI 
WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try
{
	ChangeWindowMode(true);

	if (DxLib_Init() != 0 || SetDrawScreen(DX_SCREEN_BACK) != 0)return -1;

	//MouseInput mouse;

	while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		//マウスの状態を取得
		MouseInput::getIns()->GetStateMouse();

		//マウスの左を押した瞬間
		if (MouseInput::getIns()->GetPress(MOUSE_INPUT_LEFT))
		{
			DrawString(0, 0, "Press", GetColor(255, 255, 255));
		}
		if (MouseInput::getIns()->GetHold(MOUSE_INPUT_LEFT))
		{
			DrawString(0, 16, "Hold", GetColor(255, 255, 255));
		}
		if (MouseInput::getIns()->GetRelease(MOUSE_INPUT_LEFT))
		{
			DrawString(0, 32, "Release", GetColor(255, 255, 255));
		}

		ScreenFlip();
	}

	DxLib_End();

	return EXIT_SUCCESS;
}
catch (...)
{
	exit( EXIT_FAILURE );
}


// end.
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

返信

“C言語何でも質問掲示板” へ戻る