A basic framwork and the jumping Steve.
This commit is contained in:
parent
f68a9f1019
commit
7f9985d5eb
|
@ -0,0 +1,25 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.2.32526.322
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "1mGame", "1mGame.vcxproj", "{8E1FE2C8-6B0D-4DC7-AE36-026A1ED8D525}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{8E1FE2C8-6B0D-4DC7-AE36-026A1ED8D525}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{8E1FE2C8-6B0D-4DC7-AE36-026A1ED8D525}.Debug|x64.Build.0 = Debug|x64
|
||||
{8E1FE2C8-6B0D-4DC7-AE36-026A1ED8D525}.Release|x64.ActiveCfg = Release|x64
|
||||
{8E1FE2C8-6B0D-4DC7-AE36-026A1ED8D525}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {B82BAF57-C01C-4194-9774-CCE0AE107D86}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,98 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{8e1fe2c8-6b0d-4dc7-ae36-026a1ed8d525}</ProjectGuid>
|
||||
<RootNamespace>My1mGame</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<OutDir>$(SolutionDir)bin\</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<OutDir>$(SolutionDir)bin\</OutDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>Imm32.lib;d2d1.lib;Windowscodecs.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>Imm32.lib;d2d1.lib;Windowscodecs.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="GameObject.ixx" />
|
||||
<ClCompile Include="Graphics.cpp" />
|
||||
<ClCompile Include="Graphics.ixx" />
|
||||
<ClCompile Include="Input.ixx" />
|
||||
<ClCompile Include="Math.ixx" />
|
||||
<ClCompile Include="MegaEngine.cpp" />
|
||||
<ClCompile Include="MegaEngine.ixx" />
|
||||
<ClCompile Include="main.cpp" />
|
||||
<ClCompile Include="Steve.ixx" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="源文件">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="头文件">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="资源文件">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="main.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MegaEngine.ixx">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MegaEngine.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Graphics.ixx">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Graphics.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Input.ixx">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="GameObject.ixx">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Math.ixx">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Steve.ixx">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -0,0 +1,57 @@
|
|||
module;
|
||||
#include <d2d1.h>
|
||||
#include <wrl/client.h>
|
||||
|
||||
export module GameObject;
|
||||
|
||||
import Graphics;
|
||||
import Math;
|
||||
|
||||
export struct Texture
|
||||
{
|
||||
using BitMap = ::Microsoft::WRL::ComPtr<ID2D1Bitmap>;
|
||||
|
||||
BitMap bitmap;
|
||||
Vector2 size;
|
||||
Rect rect;
|
||||
|
||||
static Texture LoadFromFile(LPCWSTR uri)
|
||||
{
|
||||
Texture tex;
|
||||
tex.bitmap = Graphics::LoadImageFromFile(uri);
|
||||
auto s = tex.bitmap->GetPixelSize();
|
||||
tex.size = { (FLOAT)s.width, (FLOAT)s.height };
|
||||
tex.rect = { 0.f, 0.f, tex.size.x, tex.size.y };
|
||||
return tex;
|
||||
}
|
||||
};
|
||||
|
||||
export class GameObject
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
Texture imge;
|
||||
Vector2 Posi;
|
||||
Vector2 Anch;
|
||||
Vector2 Size;
|
||||
|
||||
GameObject() {}
|
||||
|
||||
virtual void OnStartUp() = 0;
|
||||
virtual void OnCleanUp() = 0;
|
||||
virtual void OnUpdate(float delta) = 0;
|
||||
virtual void OnLaterUpdate(float delta) = 0;
|
||||
|
||||
void OnRender()
|
||||
{
|
||||
Rect dst =
|
||||
{
|
||||
Posi.x - Size.x * Anch.x,
|
||||
Posi.y + Size.y * (1.f - Anch.y),
|
||||
Posi.x + Size.x * (1.f - Anch.x),
|
||||
Posi.y - Size.y * Anch.y,
|
||||
};
|
||||
Graphics::DrawBitMap(imge.bitmap, dst, imge.rect);
|
||||
}
|
||||
};
|
|
@ -0,0 +1,114 @@
|
|||
module;
|
||||
#include <d2d1.h>
|
||||
#include <wrl/client.h>
|
||||
#include <wincodec.h>
|
||||
#include <cassert>
|
||||
|
||||
module Graphics;
|
||||
|
||||
using namespace D2D1;
|
||||
using namespace ::Microsoft::WRL;
|
||||
|
||||
constexpr D2D1_RECT_F SteveRect{ 1678,2,1766,96 };
|
||||
|
||||
ComPtr<ID2D1HwndRenderTarget> Graphics::RT = nullptr;
|
||||
ComPtr<IWICImagingFactory> Graphics::wic_factory = nullptr;
|
||||
Vector2 Graphics::RtSize{};
|
||||
//ComPtr<IWICImagingFactory> Graphics::wic_factory = nullptr;
|
||||
|
||||
void Graphics::Init(HWND hwnd)
|
||||
{
|
||||
ComPtr<ID2D1Factory> Factory = nullptr;
|
||||
auto hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, Factory.GetAddressOf());
|
||||
assert(hr == S_OK);
|
||||
|
||||
RECT rc;
|
||||
GetClientRect(hwnd, &rc);
|
||||
|
||||
hr = Factory->CreateHwndRenderTarget(
|
||||
RenderTargetProperties(),
|
||||
HwndRenderTargetProperties(hwnd, SizeU(rc.right-rc.left, rc.bottom-rc.top)),
|
||||
&RT
|
||||
);
|
||||
assert(hr == S_OK);
|
||||
|
||||
RtSize = { (FLOAT)(rc.right - rc.left), (FLOAT)(rc.bottom - rc.top) };
|
||||
|
||||
hr = CoCreateInstance(
|
||||
CLSID_WICImagingFactory,
|
||||
NULL,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_PPV_ARGS(&wic_factory)
|
||||
);
|
||||
assert(hr == S_OK);
|
||||
|
||||
}
|
||||
|
||||
void Graphics::BeginDraw()
|
||||
{
|
||||
RT->BeginDraw();
|
||||
}
|
||||
void Graphics::Clear()
|
||||
{
|
||||
RT->Clear({ .r = 0.96862745f, .g = 0.96862745f, .b = 0.96862745f, .a = 1.0f });
|
||||
}
|
||||
|
||||
void Graphics::Present()
|
||||
{
|
||||
RT->EndDraw();
|
||||
}
|
||||
|
||||
void Graphics::Finalize()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Graphics::DrawBitMap(const ComPtr<ID2D1Bitmap>& bitmap, D2D_RECT_F dst, D2D_RECT_F src)
|
||||
{
|
||||
if (!bitmap) return;
|
||||
dst.top = RtSize.y - dst.top;
|
||||
dst.bottom = RtSize.y - dst.bottom;
|
||||
RT->DrawBitmap(bitmap.Get(), dst, 1.0f, D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, src);
|
||||
}
|
||||
|
||||
ComPtr<ID2D1Bitmap> Graphics::LoadImageFromFile(LPCWSTR uri)
|
||||
{
|
||||
ComPtr<ID2D1Bitmap> img = nullptr;
|
||||
ComPtr<IWICBitmapDecoder> decoder = nullptr;
|
||||
ComPtr<IWICBitmapFrameDecode> source = nullptr;
|
||||
ComPtr<IWICFormatConverter> converter = nullptr;
|
||||
|
||||
auto hr = wic_factory->CreateDecoderFromFilename(
|
||||
uri,
|
||||
nullptr,
|
||||
GENERIC_READ,
|
||||
WICDecodeMetadataCacheOnLoad,
|
||||
&decoder
|
||||
);
|
||||
assert(hr == S_OK);
|
||||
|
||||
hr = decoder->GetFrame(0, &source);
|
||||
assert(hr == S_OK);
|
||||
|
||||
hr = wic_factory->CreateFormatConverter(&converter);
|
||||
assert(hr == S_OK);
|
||||
|
||||
hr = converter->Initialize(
|
||||
source.Get(),
|
||||
GUID_WICPixelFormat32bppPBGRA,
|
||||
WICBitmapDitherTypeNone,
|
||||
NULL,
|
||||
0.f,
|
||||
WICBitmapPaletteTypeMedianCut
|
||||
);
|
||||
assert(hr == S_OK);
|
||||
|
||||
hr = RT->CreateBitmapFromWicBitmap(
|
||||
converter.Get(),
|
||||
nullptr,
|
||||
&img
|
||||
);
|
||||
assert(hr == S_OK);
|
||||
|
||||
return img;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
module;
|
||||
#include <d2d1.h>
|
||||
#include <wrl/client.h>
|
||||
#include <wincodec.h>
|
||||
|
||||
export module Graphics;
|
||||
|
||||
import Math;
|
||||
|
||||
export class Graphics
|
||||
{
|
||||
template <class T>
|
||||
using ComPtr = ::Microsoft::WRL::ComPtr<T>;
|
||||
public:
|
||||
static void Init(HWND hwnd);
|
||||
static void BeginDraw();
|
||||
static void Clear();
|
||||
static void Present();
|
||||
static void Finalize();
|
||||
|
||||
static void DrawBitMap(const ComPtr<ID2D1Bitmap>& bitmap, D2D_RECT_F dst, D2D_RECT_F src);
|
||||
|
||||
static ComPtr<ID2D1Bitmap> LoadImageFromFile(LPCWSTR uri);
|
||||
private:
|
||||
static ComPtr<IWICImagingFactory> wic_factory;
|
||||
static ComPtr<ID2D1HwndRenderTarget> RT;
|
||||
static Vector2 RtSize;
|
||||
};
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
module;
|
||||
|
||||
export module Input;
|
||||
|
||||
export class KeyBoard
|
||||
{
|
||||
static bool KeyStatus[256];
|
||||
|
||||
public:
|
||||
static void Update(char keycode, bool status)
|
||||
{
|
||||
KeyStatus[keycode] = status;
|
||||
}
|
||||
static bool GetKey(char keycode)
|
||||
{
|
||||
return KeyStatus[keycode];
|
||||
}
|
||||
};
|
||||
|
||||
bool KeyBoard::KeyStatus[256]{};
|
|
@ -0,0 +1,16 @@
|
|||
module;
|
||||
#include <d2d1.h>
|
||||
|
||||
export module Math;
|
||||
|
||||
export
|
||||
{
|
||||
struct Vector2 : D2D1_POINT_2F
|
||||
{
|
||||
|
||||
};
|
||||
struct Rect : D2D1_RECT_F
|
||||
{
|
||||
|
||||
};
|
||||
}
|
|
@ -0,0 +1,183 @@
|
|||
module;
|
||||
#include <Windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <wincodec.h>
|
||||
#include <iostream>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
module MegaEngine;
|
||||
|
||||
import Input;
|
||||
|
||||
using namespace std;
|
||||
using namespace std::chrono;
|
||||
|
||||
void Game::Run()
|
||||
{
|
||||
StartUp();
|
||||
|
||||
while (PeekMsg() && !Done())
|
||||
{
|
||||
Update();
|
||||
Render();
|
||||
LaterUpdate();
|
||||
}
|
||||
|
||||
CleanUp();
|
||||
}
|
||||
|
||||
void Game::StartUp()
|
||||
{
|
||||
last = steady_clock::now();
|
||||
|
||||
CreateWnd();
|
||||
Graphics::Init(hwnd);
|
||||
|
||||
steve.OnStartUp();
|
||||
|
||||
}
|
||||
|
||||
void Game::Update()
|
||||
{
|
||||
auto now = steady_clock::now();
|
||||
delta = duration_cast<duration<float>>(now - last).count();
|
||||
last = now;
|
||||
steve.OnUpdate(delta);
|
||||
}
|
||||
|
||||
void Game::Render()
|
||||
{
|
||||
Graphics::BeginDraw();
|
||||
Graphics::Clear();
|
||||
|
||||
steve.OnRender();
|
||||
|
||||
Graphics::Present();
|
||||
}
|
||||
|
||||
void Game::LaterUpdate()
|
||||
{
|
||||
steve.OnLaterUpdate(delta);
|
||||
}
|
||||
|
||||
void Game::CleanUp()
|
||||
{
|
||||
steve.OnCleanUp();
|
||||
|
||||
Graphics::Finalize();
|
||||
|
||||
if (hwnd) DestroyWindow(hwnd);
|
||||
|
||||
auto hInst = GetModuleHandleW(nullptr);
|
||||
UnregisterClassW(L"1mGameWnd", hInst);
|
||||
}
|
||||
|
||||
void Game::CreateWnd()
|
||||
{
|
||||
auto hInst = GetModuleHandleW(nullptr);
|
||||
|
||||
WNDCLASSEXW wc =
|
||||
{
|
||||
sizeof(WNDCLASSEXW),
|
||||
CS_CLASSDC,
|
||||
WndProcSetUp,
|
||||
0,
|
||||
0,
|
||||
hInst,
|
||||
LoadIconW(nullptr, IDI_APPLICATION),
|
||||
LoadCursorW(nullptr, IDC_ARROW),
|
||||
CreateSolidBrush(0x808080),
|
||||
nullptr,
|
||||
wndClassName,
|
||||
nullptr
|
||||
};
|
||||
|
||||
wc.lpszClassName = L"1mGameWnd";
|
||||
|
||||
RegisterClassExW(&wc);
|
||||
|
||||
auto wnd_style = WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME;//WS_CAPTION | WS_SYSMENU;
|
||||
|
||||
RECT client_rect{ 0, 0, wndWidth, wndHeight };
|
||||
AdjustWindowRectEx(&client_rect, wnd_style, FALSE, 0u);
|
||||
|
||||
hwnd = CreateWindowExW
|
||||
(
|
||||
0L,
|
||||
L"1mGameWnd",
|
||||
L"1mGame",
|
||||
wnd_style,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
client_rect.right - client_rect.left,
|
||||
client_rect.bottom - client_rect.top,
|
||||
nullptr, nullptr, hInst, (LPVOID)this
|
||||
);
|
||||
|
||||
ShowWindow(hwnd, SW_SHOW);
|
||||
UpdateWindow(hwnd);
|
||||
}
|
||||
|
||||
bool Game::PeekMsg()
|
||||
{
|
||||
MSG msg;
|
||||
while (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE))
|
||||
{
|
||||
if (msg.message == WM_QUIT) return false;
|
||||
DispatchMessageW(&msg);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Game::Done()
|
||||
{
|
||||
return done;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK Game::WndProcSetUp(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (msg == WM_NCCREATE)
|
||||
{
|
||||
ImmDisableIME(GetCurrentThreadId());
|
||||
auto CreateData = reinterpret_cast<CREATESTRUCTW*>(lParam);
|
||||
auto wnd_ptr = reinterpret_cast<Game*>(CreateData->lpCreateParams);
|
||||
|
||||
SetWindowLongPtrW(hWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(&Game::WndProcThunk));
|
||||
SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(wnd_ptr));
|
||||
|
||||
return wnd_ptr->WndProc(hWnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
return DefWindowProcW(hWnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK Game::WndProcThunk(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
auto wnd_ptr = reinterpret_cast<Game*>(GetWindowLongPtrW(hWnd, GWLP_USERDATA));
|
||||
return wnd_ptr->WndProc(hWnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
LRESULT Game::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (msg)
|
||||
{
|
||||
case WM_KEYDOWN:
|
||||
KeyBoard::Update((char)wParam, true);
|
||||
break;
|
||||
case WM_KEYUP:
|
||||
KeyBoard::Update((char)wParam, false);
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
done = true;
|
||||
DestroyWindow(hwnd);
|
||||
hwnd = nullptr;
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
default:
|
||||
return DefWindowProcW(hWnd, msg, wParam, lParam);
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
module;
|
||||
#include <Windows.h>
|
||||
#include <vector>
|
||||
#include <wrl/client.h>
|
||||
#include <chrono>
|
||||
|
||||
export module MegaEngine;
|
||||
|
||||
import Input;
|
||||
import Graphics;
|
||||
import GameObject;
|
||||
import Steve;
|
||||
|
||||
using namespace std;
|
||||
using namespace std::chrono;
|
||||
|
||||
export class Game
|
||||
{
|
||||
public:
|
||||
static constexpr LPCWSTR wndClassName = L"1mGameWnd";
|
||||
static constexpr LPCWSTR gameTitle = L"1mGame";
|
||||
static constexpr int wndHeight = 450;
|
||||
static constexpr int wndWidth = 1050;
|
||||
|
||||
void Run();
|
||||
|
||||
private:
|
||||
Steve steve;
|
||||
steady_clock::time_point last;
|
||||
float delta;
|
||||
|
||||
HWND hwnd = nullptr;
|
||||
bool done = false;
|
||||
|
||||
void StartUp();
|
||||
|
||||
void Update();
|
||||
void Render();
|
||||
void LaterUpdate();
|
||||
|
||||
void CleanUp();
|
||||
|
||||
void CreateWnd();
|
||||
bool PeekMsg();
|
||||
bool Done();
|
||||
|
||||
static LRESULT CALLBACK WndProcSetUp(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT CALLBACK WndProcThunk(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
LRESULT WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
};
|
|
@ -1,3 +1,3 @@
|
|||
# MegaSteve
|
||||
|
||||
复刻Chrome的断网小游戏The Jumping Steve.
|
||||
复刻Chrome的断网小游戏 Steve: The Jumping Dinosaur.
|
|
@ -0,0 +1,81 @@
|
|||
module;
|
||||
#include <wrl/client.h>
|
||||
|
||||
export module Steve;
|
||||
|
||||
import GameObject;
|
||||
import Input;
|
||||
|
||||
export struct Steve : GameObject
|
||||
{
|
||||
float a, v, h;
|
||||
bool jumping = false;
|
||||
|
||||
enum Status { Idle, Running, Jumping, Freefall, Crawling, Dead } status;
|
||||
|
||||
virtual void OnStartUp() override
|
||||
{
|
||||
imge = Texture::LoadFromFile(L"steve.png");
|
||||
imge.rect = { 1678, 2, 1766, 96 };
|
||||
|
||||
Posi = { 94, 100 };
|
||||
Anch = { 0.5f,0 };
|
||||
Size = { 88, 94 };
|
||||
|
||||
a = v = h = 0.0f;
|
||||
}
|
||||
virtual void OnCleanUp() override
|
||||
{
|
||||
imge.bitmap = nullptr;
|
||||
}
|
||||
virtual void OnUpdate(float delta) override
|
||||
{
|
||||
switch (status)
|
||||
{
|
||||
case Steve::Idle:
|
||||
if (KeyBoard::GetKey(VK_SPACE)) status = Running;
|
||||
break;
|
||||
case Steve::Running:
|
||||
if (KeyBoard::GetKey(VK_SPACE))
|
||||
{
|
||||
status = Jumping;
|
||||
goto _jump_;
|
||||
}
|
||||
break;
|
||||
case Steve::Jumping:
|
||||
_jump_:
|
||||
if ((h < 60 || KeyBoard::GetKey(VK_SPACE)) && h < 120.f)
|
||||
{
|
||||
v = 1000.f;
|
||||
h += v * delta;
|
||||
Posi.y = 100 + h;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = Freefall;
|
||||
}
|
||||
break;
|
||||
case Steve::Freefall:
|
||||
a = -8000.f;
|
||||
v += a * delta;
|
||||
if (v < -1000) v = -1200;
|
||||
h += v * delta;
|
||||
Posi.y = 100 + h;
|
||||
if (Posi.y <= 100)
|
||||
{
|
||||
status = Running;
|
||||
Posi.y = 100;
|
||||
}
|
||||
break;
|
||||
case Steve::Crawling:
|
||||
break;
|
||||
case Steve::Dead:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
virtual void OnLaterUpdate(float delta) override
|
||||
{
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue