第一人称射击游戏C++控制台版(未完成)

更新时间:2023-05-30 20:58:15 阅读: 评论:0

第⼀⼈称射击游戏C++控制台版(未完成)
⼀、在控制台中显⽰画⾯
使⽤cout⽅式显⽰时刷新速度较慢,不能满⾜游戏需求。 游戏的显⽰借助windows函数。
#include<iostream>
using namespace std;
#include<Windows.h>大口啃
//定义屏幕宽度、⾼度
int nScreenWidth = 120;
int nScreenHeight = 40;
int main()
六级考试题型英标读音{
/
/ Create Screen Buffer 创建屏幕缓冲区
wchar_t *screen = new wchar_t[nScreenWidth*nScreenHeight];
HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); SetConsoleActiveScreenBuffer(hConsole);
DWORD dwBytesWritten = 0;
//游戏循环
while (1)
{
// Display Frame    显⽰
screen[nScreenWidth * nScreenHeight - 1] = '\0';
WriteConsoleOutputCharacter(hConsole, screen, nScreenWidth * nScreenHeight, { 0,0 }, &dwBytesWritten);
}
}
⼆、
地图
//地图
reviewint nMapWidth = 16;    // World Dimensions
int nMapHeight = 16;
//玩家位置X、Y、⾓度
float fPlayerX = 0.0f;  // Player Start Position
float fPlayerY = 0.0f;
float fPlayerA = 0.0f;  // Player Start Rotation
/
/ 创建地图  Create Map of world space # = wall block, . = space  wstring map;
map += L">>>#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
alevel国际学校
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L">>>#";
地图与实际的对应
my family(玩家视⾓有限)
(玩家视线)
通过视线与墙⾯的碰撞检测,⽣成玩家看到的画⾯。
for (int x = 0; x < nScreenWidth; x++)
{
// For each column, calculate the projected ray angle into world space
float fRayAngle = (fPlayerA - fFOV / 2.0f) + ((float)x / (float)nScreenWidth) * fFOV;//从左半边到右半边  float fDistanceToWall = 0.0f; //
bool bHitWall = fal;
float fEyeX = sinf(fRayAngle); //视线⽅向对应的单位分量 Unit vector for ray in player space
float fEyeY = cosf(fRayAngle);
//增量⽅式判断视线撞墙
while (!bHitWall && fDistanceToWall<fDepth)
{
fDistanceToWall += 0.1f;
int nTestX = (int)(fPlayerX + fEyeX * fDistanceToWall);
int nTestY = (int)(fPlayerY + fEyeY * fDistanceToWall);
// 检查视线达到边界  Test if ray is out of bounds
if (nTestX < 0 || nTestX >= nMapWidth || nTestY < 0 || nTestY >= nMapHeight)
{
会计证取消
bHitWall = true;  // Just t distance to maximum depth
fDistanceToWall = fDepth;
}
el
{
//检查视线是否遇到墙体
if (map[nTestY*nMapWidth + nTestX] == '#')
{
bHitWall = true;
在线中翻英
}
}
}
//计算到天花板和地板的距离
int nCeiling = (float)(nScreenHeight / 2.0) - nScreenHeight/((float)fDistanceToWall);
int nFloor = nScreenHeight - nCeiling;
for (int y = 0; y < nScreenHeight; y++)
{
// Each Row
if (y < nCeiling) //天花板
screen[y*nScreenWidth + x] = ' ';
el if (y > nCeiling && y <= nFloor)
screen[y*nScreenWidth + x] = '#';
el // 地板 Floor
{
screen[y*nScreenWidth + x] = ' ';
}
}
}
三、左右移动,其中⽤tp2-tp1来获得⼀帧花费的时间,使得运动看起来更流畅。
turkey怎么读#include<chrono>          //时间相关
auto tp1 = chrono::system_clock::now();
auto tp2 = chrono::system_clock::now();
//游戏循环
while (1)
{
//计算时间
tp2 = chrono::system_clock::now();
chrono::duration<float>elapdTime = tp2 - tp1;
tp1 = tp2;
float fElapdTime = unt(); //⼀帧的时间
// Handle CCW Rotation
if (GetAsyncKeyState((unsigned short)'A') & 0x8000)
fPlayerA -= (0.1f)*fElapdTime;
if (GetAsyncKeyState((unsigned short)'D') & 0x8000)谨慎行事
fPlayerA += (0.1f)*fElapdTime;
做到这⾥(视频的19:06),当我继续往下做的时候发现图像显⽰的很奇怪,⽅块都串⾏显⽰,看起来像乱码。但是参考之前的俄罗斯⽅块中的控制台设置⽅法,改变控制台之后还是没有改变。

本文发布于:2023-05-30 20:58:15,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/128521.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:视线   游戏   时间   控制台   玩家
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图