1
0
mirror of https://github.com/borgesdan/xn65 synced 2024-12-29 21:54:47 +01:00

Implementa Mouse

This commit is contained in:
Danilo 2024-04-16 19:27:05 -03:00
parent 3274acf478
commit 796bceb034
10 changed files with 147 additions and 30 deletions

View File

@ -3,7 +3,7 @@
#
# Add source to this project's executable.
add_executable (xna WIN32 "xna.cpp" "xna.h" "platform/window-dx.cpp" "platform/device-dx.cpp" "platform/adapter-dx.cpp" "platform/swapchain-dx.cpp" "platform/rendertarget-dx.cpp" "platform/texture-dx.cpp" "platform/blendstate-dx.cpp" "platform/game-dx.cpp" "platform/clock-dx.cpp" "csharp/stream.cpp" "platform/gdevicemanager-dx.cpp" "platform/vertexinput-dx.cpp" "platform/shader-dx.cpp" "platform/rasterizerstate-dx.cpp" "platform/vertexbuffer-dx.cpp" "platform/indexbuffer-dx.cpp" "common/matrix.cpp" "platform/constbuffer-dx.cpp" "platform/databuffer-dx.cpp" "platform/samplerstate-dx.cpp" "platform/spritebatch-dx.cpp" "platform/spritefont-dx.cpp" "platform/depthstencilstate-dx.cpp" "platform/keyboard-dx.cpp")
add_executable (xna WIN32 "xna.cpp" "xna.h" "platform/window-dx.cpp" "platform/device-dx.cpp" "platform/adapter-dx.cpp" "platform/swapchain-dx.cpp" "platform/rendertarget-dx.cpp" "platform/texture-dx.cpp" "platform/blendstate-dx.cpp" "platform/game-dx.cpp" "platform/clock-dx.cpp" "csharp/stream.cpp" "platform/gdevicemanager-dx.cpp" "platform/vertexinput-dx.cpp" "platform/shader-dx.cpp" "platform/rasterizerstate-dx.cpp" "platform/vertexbuffer-dx.cpp" "platform/indexbuffer-dx.cpp" "common/matrix.cpp" "platform/constbuffer-dx.cpp" "platform/databuffer-dx.cpp" "platform/samplerstate-dx.cpp" "platform/spritebatch-dx.cpp" "platform/spritefont-dx.cpp" "platform/depthstencilstate-dx.cpp" "platform/keyboard-dx.cpp" "platform/mouse-dx.cpp")
if (CMAKE_VERSION VERSION_GREATER 3.12)
set_property(TARGET xna PROPERTY CXX_STANDARD 20)

View File

@ -32,6 +32,12 @@ namespace xna {
using BlendOperation = BlendFunction;
enum class ButtonState
{
Released,
Pressed,
};
enum class ColorWriteChannels {
Red,
Green,

View File

@ -135,6 +135,8 @@ namespace xna {
//Input
struct KeyboardState;
using PKeyboardState = std::shared_ptr<KeyboardState>;
struct MouseState;
using PMouseState = std::shared_ptr<MouseState>;
}
#endif

29
framework/input/mouse.hpp Normal file
View File

@ -0,0 +1,29 @@
#ifndef XNA_INPUT_MOUSE_HPP
#define XNA_INPUT_MOUSE_HPP
#include "../default.hpp"
namespace xna {
struct IMouseState {
ButtonState LeftButton{ 0 };
ButtonState RightButton{ 0 };
ButtonState MiddleButton{ 0 };
ButtonState XButton1{ 0 };
ButtonState XButton2{ 0 };
int X{ 0 };
int Y{ 0 };
int ScroolWheelValue{ 0 };
};
class IMouse {
public:
virtual ~IMouse() {}
static MouseState GetState();
static bool IsConnected();
static bool IsVisible();
static void IsVisible(bool value);
static void ResetScrollWheel();
};
}
#endif

View File

@ -20,23 +20,16 @@ namespace xna {
return _state.IsKeyUp(k);
}
private:
public:
DirectX::Keyboard::State _state{};
};
class Keyboard : public IKeyboard {
public:
friend class IKeyboard;
friend class GameWindow;
Keyboard() = default;
private:
inline static sptr<DirectX::Keyboard> initializeKeyboard() {
return New<DirectX::Keyboard>();
}
inline static sptr<DirectX::Keyboard> _dxKeyboard = initializeKeyboard();
public:
inline static sptr<DirectX::Keyboard> _dxKeyboard = New<DirectX::Keyboard>();
};
inline KeyboardState IKeyboard::GetState() {

View File

@ -0,0 +1,5 @@
#include "mouse-dx.hpp"
namespace xna {
}

View File

@ -0,0 +1,65 @@
#ifndef XNA_PLATFORM_MOUSE_DX_HPP
#define XNA_PLATFORM_MOUSE_DX_HPP
#include "../input/mouse.hpp"
#include <Mouse.h>
namespace xna {
struct MouseState : public IMouseState {
constexpr MouseState() = default;
constexpr MouseState(DirectX::Mouse::State const& dxMouseState) {
LeftButton = static_cast<ButtonState>(dxMouseState.leftButton);
RightButton = static_cast<ButtonState>(dxMouseState.leftButton);
MiddleButton = static_cast<ButtonState>(dxMouseState.leftButton);
XButton1 = static_cast<ButtonState>(dxMouseState.leftButton);
XButton2 = static_cast<ButtonState>(dxMouseState.leftButton);
X = dxMouseState.x;
Y = dxMouseState.y;
ScroolWheelValue = dxMouseState.scrollWheelValue;
}
};
struct Mouse : public IMouse {
public:
inline static sptr<DirectX::Mouse> _dxMouse = New<DirectX::Mouse>();
};
inline MouseState IMouse::GetState() {
if (!Mouse::_dxMouse)
return MouseState();
const auto state = Mouse::_dxMouse->GetState();
return MouseState(state);
}
inline bool IMouse::IsConnected() {
if (!Mouse::_dxMouse)
return false;
return Mouse::_dxMouse->IsConnected();
}
inline bool IMouse::IsVisible() {
if (!Mouse::_dxMouse)
return false;
return Mouse::_dxMouse->IsVisible();
}
inline void IMouse::IsVisible(bool value) {
if (!Mouse::_dxMouse)
return;
Mouse::_dxMouse->SetVisible(value);
}
inline void IMouse::ResetScrollWheel() {
if (!Mouse::_dxMouse)
return;
Mouse::_dxMouse->ResetScrollWheelValue();
}
}
#endif

View File

@ -1,5 +1,6 @@
#include "window-dx.hpp"
#include "keyboard-dx.hpp"
#include "mouse-dx.hpp"
namespace xna {
GameWindow::GameWindow() {
@ -140,6 +141,7 @@ namespace xna {
case WM_ACTIVATE:
case WM_ACTIVATEAPP:
Keyboard::_dxKeyboard->ProcessMessage(msg, wParam, lParam);
Mouse::_dxMouse->ProcessMessage(msg, wParam, lParam);
break;
case WM_SYSKEYDOWN:
if (!(wParam == VK_RETURN && (lParam & 0x60000000) == 0x20000000)) {
@ -151,6 +153,21 @@ namespace xna {
case WM_SYSKEYUP:
Keyboard::_dxKeyboard->ProcessMessage(msg, wParam, lParam);
break;
case WM_INPUT:
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_MOUSEWHEEL:
case WM_XBUTTONDOWN:
case WM_XBUTTONUP:
case WM_MOUSEHOVER:
Mouse::_dxMouse->ProcessMessage(msg, wParam, lParam);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);

View File

@ -49,18 +49,15 @@ public:
}
if (state.IsKeyDown(Keys::Down)) {
position.Y += 1 * gameTime.ElapsedGameTime.TotalMilliseconds();
}
oldState = currentState;
const auto currentState = Mouse::GetState();
if (currentState.LeftButton == ButtonState::Pressed && oldState.LeftButton == ButtonState::Released) {
points.push_back(Vector2(currentState.X, currentState.Y));
}
/*if (position.X > 1280 || position.X < 0)
vel *= -1;
if (gameTime.ElapsedGameTime.TotalMilliseconds() > 1) {
}
position.X += 0.05 * (gameTime.ElapsedGameTime.TotalMilliseconds() * vel);*/
//position.X += 2 * vel;
Game::Update(gameTime);
}
@ -68,7 +65,11 @@ public:
_graphicsDevice->Clear(Colors::CornflowerBlue);
spriteBatch->Begin();
spriteBatch->Draw(*texture, position, nullptr, Colors::White, 0, { 0,0 }, 0.5F, SpriteEffects::None, 0);
// spriteBatch->Draw(*texture, position, nullptr, Colors::White, 0, { 0,0 }, 0.5F, SpriteEffects::None, 0);
for (size_t i = 0; i < points.size(); ++i) {
spriteBatch->Draw(*texture, points[i], nullptr, Colors::White, 0, {0,0}, 0.5F, SpriteEffects::None, 0);
}
spriteBatch->End();
Game::Draw(gameTime);
@ -79,16 +80,14 @@ private:
PSpriteBatch spriteBatch = nullptr;
PTexture2D texture = nullptr;
Vector2 position{};
std::vector<Vector2> points;
MouseState currentState;
MouseState oldState;
float vel = 1;
};
int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow) {
/*FileStream stream("D:/VS_EXPBSLN_x64_enu.CAB");
auto pos = stream.Position();
auto len = stream.Length();
pos = stream.Position();*/
Game1 game;
game.Run();
return 0;
auto game = Game1();
const auto result = game.Run();
return result;
}

View File

@ -16,5 +16,6 @@
#include "platform/spritebatch-dx.hpp"
#include "common/color.hpp"
#include "platform/keyboard-dx.hpp"
#include "platform/mouse-dx.hpp"
// TODO: Reference additional headers your program requires here.