今天的主题:忍者飞镖(仍然利用自己写的向量和矩阵实现)
介绍:飞镖丢出后能够返回原来的位置
注意点:
1.在没有任何操作的情况下,飞镖围绕正方形顺时针公转并自转
2.按下空格后,飞镖丢出,延当前的-Y方向运动,可以连续按键,直至所有飞镖全部飞出,正方形无论何种情况都是可以自由移动的
3.飞镖与屏幕正上方碰撞后,立即返回,朝向为自己的原定位置(此位置无论飞镖在与否,都会公转),到达指定位置后,继续公转与自转
难点:
飞镖的自转公转
先看效果吧
#include <iostream>
#include <windows.h>
#include <vector>
#include "vector2.h"
#include "matrix3.h"
#pragma comment(lib, "Msimg32.lib")
//定义一些窗口常量
#define _CLIENT_PW 640 //屏幕像素宽
#define _CLIENT_PH 480 //屏幕像素高
#define _FRAME_PER_SECOND 40 //屏幕每秒刷新帧数
#define _FRAME_SLEEPTIME (1000/_FRAME_PER_SECOND) //每帧休息时间
#define _PI 3.1415 //pai
//全局窗口句柄
HWND g_hWnd = nullptr;
//窗口活动
BOOL g_Active = FALSE;
//函数声明
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void GameInit();
void GameRun();
void GameEnd();
//程序入口点
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//填充窗口类别结构体
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszMenuName = nullptr;
wc.lpszClassName = __TEXT("My3D");
//注册窗口类别结构体
RegisterClass(&wc);
//根据客户区矩形计算窗口矩形
int screen_pw = GetSystemMetrics(SM_CXSCREEN);
int screen_ph = GetSystemMetrics(SM_CYSCREEN);
RECT r =
{
(screen_pw - _CLIENT_PW) / 2,
(screen_ph - _CLIENT_PH) / 2,
r.left + _CLIENT_PW,
r.top + _CLIENT_PH
};
//校准窗口矩形
AdjustWindowRect(&r, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, FALSE);
//创建窗口
g_hWnd = CreateWindow(
wc.lpszClassName,
__TEXT("My3D"),
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
r.left, r.top, r.right - r.left, r.bottom - r.top, //窗口左上角位置和宽高
HWND_DESKTOP,
NULL,
wc.hInstance,
NULL);
//更新窗口
UpdateWindow(g_hWnd);
//显示窗口
ShowWindow(g_hWnd, nCmdShow);
//游戏初始化
GameInit();
//消息循环
MSG msg = {
};
while (WM_QUIT != msg.message)
{
//下面的代码表示,一旦有消息就调用消息处理函数来处理消息
if (