私はタワー防衛ゲームに取り組んでいます。ユーザーがマウスをクリックするタイルを選択する必要があります(今はタイルの周りに枠線を描いています)。今ではコードが時々動作していますし、それをよりうまく動作させる方法がわかりません。今すぐ領域をクリックすると、タイルが選択され、時にはすぐに選択解除され、それ以外の時間には選択解除されるコードがあります。私はマウスを押し下げたままの状態で、マウスを「クリック」します。私が必要とするのは、マウスボタンが押されている時間に関係なく、タイルを選択せずにタイルを選択することです。私はセットアップにmouseinputと同様に格納する変数を持っている私のゲームのクラスでSDL C++マウス入力処理トグル効果
MouseInput.h
#pragma once
#include <SDL.h>
class MouseInput
{
public:
MouseInput();
~MouseInput();
void Update();
bool GetMouseButton(int index);
SDL_Event GetEvent();
bool GetPressed();
bool GetReleased();
private:
void GetButtonStates();
private:
bool mouseArray[3];
int x, y;
bool justReleased;
bool justPressed;
SDL_Event e;
};
MouseInput.cpp
#include "Input.h"
MouseInput::MouseInput()
:
x(0),
y(0),
justReleased(false),
justPressed(false)
{
SDL_PumpEvents();
for (int i = 0; i < 3; i++)
{
mouseArray[i] = false;
}
}
MouseInput::~MouseInput()
{
}
void MouseInput::Update()
{
SDL_PollEvent(&e);
justReleased = false;
justPressed = false;
if (e.type == SDL_MOUSEBUTTONDOWN && e.button.button == SDL_BUTTON_LEFT)
justPressed = true;
else if (e.type == SDL_MOUSEBUTTONUP && e.button.button == SDL_BUTTON_LEFT)
justReleased = true;
}
bool MouseInput::GetPressed()
{
return justPressed;
}
bool MouseInput::GetReleased()
{
return justReleased;
}
bool MouseInput::GetMouseButton(int index)
{
if (index <= 3 && index >= 1)
{
return mouseArray[index - 1];
}
return false;
}
SDL_Event MouseInput::GetEvent()
{
return e;
}
void MouseInput::GetButtonStates()
{
SDL_PollEvent(&e);
if (e.type == SDL_MOUSEBUTTONDOWN)
{
// 1 = Left; 2 = Center; 3 = Right
mouseArray[e.button.button - 1] = true;
}
if (e.type == SDL_MOUSEBUTTONUP)
{
mouseArray[e.button.button - 1] = false;
}
}
:私のマウス入力クラスは、次のように設定されていますクリックされたタイルの座標。また、マウスが押されたかどうかを確認する変数pressed
があります。私の更新機能では、マウスが押されていないかどうかを確認します。マウスが押されていない場合は、マウスが押されたかどうかを確認して、ゲームがマウス位置の座標を取得できるかどうかを確認します。私のゲームでは
マウスクラス
bool clicked; // In my custom Mouse.h file and set to false in constructor
MouseInput input; // In my custom Mouse.h file
Mouseクラスの更新()
input.Update(); // Calls the MouseInput updating
if (input.GetPressed() && !clicked)
{
clicked = !clicked;
printf("OK");
}
//else if (clicked && input.GetReleased())
else if (clicked && input.GetPressed()) // Somewhat works. It works almost like before. If I click the mouse it shows up then sometimes when I click again it works, and other times I have to click a couple times
{
clicked = !clicked;
}
を
std::pair<int, int> coords; // Will store the coordinates of the tile position that the mouse rests in
bool pressed; // If the mouse was pressed (i should call it toggle because it's true if the mouse was pressed once, then false if the mouse was pressed again, then true...ect.)
更新機能:私はので、ここでクレイジーに聞こえる私のコードのいくつかを知っていますクラス私はちょうどマウスのクリックがtrueであるかどうかを確認し、必要なものを描画します
if (mouse.GetClicked())
{
// Draw what I need here.
// Currently is only drawn when I hold down the mouse
// And not drawn when I release the mouse.
}
次に、タイルの周りに四角形を描いているとき、私はpressed = true
の場合にのみ描画します。それ以外の場合は描画されません。このコードは時々動作し、他の時は動作しません。私が望む効果を得るために、私は実際にマウスをすばやくクリックしなければなりません。私がしなければ、マウスボタンを押したままにして四角がちょうど点滅しているように見えることがあります。
無関係ですが、 'GetMouseButton'では' -1 'ではなく 'index> = 1'を意味すると思います。 – hnefatl
あなたは正しいです。なぜ私が-1を持っているのか分かりません。それは理にかなっていない。 – Vince