2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DXライブラリで使用するキーやジョイパッドの入力を扱いやすくする

Posted at

初めに

この記事では、DXライブラリで使用するキージョイパッド入力をより使いやすくなるコードを書いていきます。
cppと.hのコードを書くので、コピーして使ってください。

初心者が書いているので多少の粗は許してお兄さん

紹介するコードでできること

・ボタンを押している間、ずっと反応
・ボタンを押した瞬間だけ反応
・ボタンを離した瞬間だけ反応

上記の事ができるようになります。

コード

Pad.h
// コントローラー
#pragma once

// コントローラーからの入力状態を取得する
namespace Pad
{
	void Update();					// パッドの入力状態取得
	bool IsPress(int button);		// 押し下げ判定(ボタンを押している間、ずっと反応)
	bool IsTrigger(int button);		// トリガー判定(ボタンを押した瞬間だけ反応)
	bool IsRelase(int button);		// 離した判定(ボタンを離した瞬間だけ反応)
}
Pad.cpp
#include "Pad.h"
#include <Dxlib.h>

namespace
{
	constexpr int kLogNum = 16;
	// 入力ログ 0が最新の状態
	int padLog[kLogNum];
}

namespace Pad
{
	// パッドの入力状態取得
	void Update()
	{
		// 現在のパッドの状態を取得
		int padState = GetJoypadInputState(DX_INPUT_KEY_PAD1);
		// ログの更新
		for (int i = kLogNum - 1; i >= 1; i--)
		{
			padLog[i] = padLog[i - 1];
		}
		// 最新の状態
		padLog[0] = padState;
	}

	// 押し下げ判定
	bool IsPress(int button)
	{
		return (padLog[0] & button);
	}

	// トリガー判定
	bool IsTrigger(int button)
	{
		bool isNow = (padLog[0] & button);	// 現在の状態
		bool isLast = (padLog[1] & button);	// 1フレーム前の状態
		return (isNow && !isLast);
	}

	// 離した判定
	bool IsRelase(int button)
	{
		bool isNow = (padLog[0] & button);	// 現在の状態
		bool isLast = (padLog[1] & button);	// 1フレーム前の状態
		return (!isNow && isLast);
	}
}

使い方

※更新処理を行う関数にPad::Update(); と書く必要があります。

例としてCircleMoveというクラスを作り、円を動かすプログラムを書いてみます。

CircleMove.h
#pragma once

class CircleMove
{
public:

	CircleMove();
	virtual ~CircleMove();


	void Init();	// 初期処理
	void Update();	// 更新処理
	void Draw();	// 描画処理

private:

	void Move();	// 移動

private:

	// 座標
	int m_posX;
	int m_posY;
};
CircleMove.cpp
#include "Pad.h"
#include <DxLib.h>
// この上のincludeがないとコントローラーが動きません
#include "CircleMove.h"

namespace
{
	// 円の半径サイズ
	constexpr int kRadiusScale = 32;

	// 移動量
	constexpr int kMoveDistance = 8;

	// 円のカラーコード(赤)
	constexpr int kColor = 0xff0000;
}

CircleMove::CircleMove():
	m_posX(),
	m_posY()
{
}

CircleMove::~CircleMove()
{
}

void CircleMove::Init()
{
	// 座標初期化
	m_posX = 0;
	m_posY = 0;
}

void CircleMove::Update()
{
	// パッドのアップデート処理
	Pad::Update();

	// 移動
	Move();
}

void CircleMove::Draw()
{
	// 座標の表示
	DrawFormatString(0, 0, 0xffffff, "m_posX : %d m_posY : %d", m_posX, m_posY);

	// 円の描画
	DrawCircle(m_posX, m_posY, kRadiusScale, kColor, true);
}

void CircleMove::Move()
{

	// パットで操作


	if (Pad::IsPress(PAD_INPUT_UP))			// 上入力
	{
		// 上に進む
		m_posY -= kMoveDistance;
	}
	else if (Pad::IsPress(PAD_INPUT_DOWN))	// 下入力
	{
		// 下に進む
		m_posY += kMoveDistance;
	}
	else if (Pad::IsPress(PAD_INPUT_LEFT))	// 左入力
	{
		// 左に進む
		m_posX -= kMoveDistance;
	}
	else if (Pad::IsPress(PAD_INPUT_RIGHT))	// 右入力
	{
		// 右に進む
		m_posX += kMoveDistance;
	}

}

このコードで十字キーもしくは、十字ボタンを押すことで、赤い円が上下左右に動きます。

もし、ボタンを押した瞬間だけ反応ボタンを離した瞬間だけ反応などに変更したい場合は、Pad::IsPress(PAD_INPUT_RIGHT)IsPress の部分をIsTriggerIsRelaseに変更してください。

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?