试图阻止一个字符块移动到另一个字符块
Trying to stop a block of characters from moving into another block of characters
if(isEventMoveRight() == true)
{
if((playerX != 70) && (playerX+11 != 'T'))
{
playerX = playerX+1;
}
}
"T"是与玩家不同的角色块。假设我没有为T块或背景使用数组,我想我只为玩家使用一个数组。我不确定它是否正确使用了我为玩家设置的数组。事实上……我不知道如何使用数组为gameMap句号。
我将给你扼要地介绍一下我要做的事情。在主机上,我必须使用字符来创建游戏。我计划创造一些类似口袋妖怪的内容,即让玩家能够绕着屏幕奔跑并在到达窗口边缘时移动窗口,就像《塞尔达传说》那样。显然,我并不是在制作整个游戏,我只是在制作其中的一小部分,但这对我来说太过分了。我正在使用Visual Studio 2010,但我不得不使用一些家伙的代码,他做的帮助我们,但说实话,这似乎更多的是一个障碍,而不是帮助,因为所有的在线教程都是在VS2010中从头开始使用c++,而不是从他的代码。我首先想到我可以创建一个名为gameMap的数组,并使用两个for循环填充它的背景空间。然后在此基础上设置玩家阵列、障碍阵列和敌人阵列,使用相同的策略。但是由于一些奇怪的原因,我必须设置char的类型,这两个for循环将打印到数组[I][j] 里面的两个for循环,即使事先在代码中我已经明确地设置了数组中的内容。例如,
char array[2][2] = {
{ '*', '*',},
{ '*', '*',},
};
但是正如我说的,当我试图打印出数组时,它就像它完全忽略了我已经在数组中设置的内容,只是打印出一堆'星号'。很好背景,但当我想打印打印一堆星号的球员而不是正方形一长排打印它们,然后让它出现的唯一方法是当打印玩家数组,我有另一个for循环下面的打印出其余的控制台窗口的X,所以在这种情况下,70个字符的空格,但当然是完全错误的,甚至不是一个合适的解决方案。
虽然我不完全清楚你的问题,但我有一些想法…
if(isEventMoveRight() == true)
{
if((playerX != 70) && (playerX+11 != 'T'))
{
playerX = playerX+1;
}
}
你是指playerX+1
吗?无论哪种方式,看起来你不是在比较一个数组,而是数组中的值,它代表了一个你不能去的空间。看起来应该是这样的:
if(isEventMoveRight() == true)
{
if((playerX < maximumX) && worldGrid(playerX+1, playerY).isWalkable)
{
playerX = playerX+1;
}
}
其中worldGrid()是一个函数,它返回一个结构体的引用,该结构体告诉我们给定网格空间的属性。
至于打印/调试问题,请注意许多char
值不打印字母或数字。例如,你可能会打印一个退格字符或制表符,这会改变光标的位置,可能会或可能不会覆盖你想要看到的东西。因此,简单地打印字符可能不是调试char
值的最佳方法,您可能希望将char
值打印为int
。除非您专门使用字母字符或其他可打印字符。
您可以像这样将char转换为unsigned short:
(unsigned short)(0x00FF & charVariable);
根据我对这个问题的理解,其他的想法是……听起来你想要一个2D数组作为地图,其中数组中的某些角色代表不同的游戏资产,如砖块(不能穿过它)和地板(可以穿过它)。这些可能被存储为char
,所以你最多可以得到256种不同类型的面板/墙壁/楼梯等。这些东西不会在场景中移动,只会决定所有资产/道具/角色下面的地板看起来是什么样子。
(您可以将std::map与struct或单个16位int或其他可用作标志的int类型一起使用。基本上,你希望能够快速查找世界中每个空间块的属性,例如你是否可以穿过它,或者它是否滑,它是否水,等等。
那么您可能需要第二个数组来表示项的位置和类型。这些可能是宝箱、可破坏的门/洞穴或可移动的砖块。这些是玩家可以与之互动、拾取和/或在解谜中使用的道具。
我不认为你会希望角色(英雄和恶棍)出现在2D数组中。特别是,你不希望遍历一个巨大的数组只是为了找出字符的位置。你可能也不希望任何角色被锁定在网格空间中,除非你正在制作一款文本冒险游戏,否则你可能希望他们能够出现在地图上的方块之间(就像《塞尔达传说》)。对于英雄,你可能只拥有一些变量,例如位置和方向以及其他角色属性(如金币和生命值)。不需要2D数组
对于敌人,最好使用std::vector
或类似的容器,因为如果一个人死亡或刷出,它们的数量会发生变化。因为你可以像迭代数组一样迭代向量,所以你可以相对容易地在每个时间步更新所有敌人,并在他们被杀时设置一个标志,这样你就可以在更新循环后将他们从向量中移除。
如果你想拥有多个英雄,比如在本地多人游戏中,你也可以为英雄设置一个std::vector
。
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何检查一个c++字符串中有多少相同的字符/数字
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 关于字符数组,我正在尝试将数组中的每个字符分配给另一个值
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用动态分配将 char* 复制到另一个字符**
- 将字符向量复制到另一个向量
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 计算在同一位置至少包含一个常用字符的不同字符串对
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 如何检查一个字符是否与字符数组中的另一个字符匹配?
- C++:使用另一个字符将一个字符大写
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- C ++读取用户输入的字符一个一个符号
- 遍历数组或从打开的文件中获取字符 - 一个比另一个有什么优势
- 将文本文件的内容一个字符一个字符地读入矢量,不跳过空白或新行
- 这是更快和更有效的,处理一个字符一个字符作为字符或流