简单渲染流水管线C++代码实现(三)---实战之《忍者飞镖》

本文通过C++代码介绍了如何实现忍者飞镖的动态模拟,包括飞镖在正方形内顺时针公转并自转,以及在空格键触发下沿-Y方向飞出并碰撞反弹的机制。飞镖与屏幕顶部碰撞后会返回初始位置,继续公转和自转。文章重点探讨了飞镖的自转和公转实现难点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天的主题:忍者飞镖(仍然利用自己写的向量和矩阵实现)
介绍:飞镖丢出后能够返回原来的位置

注意点:
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 (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值