试图阻止一个字符块移动到另一个字符块

Trying to stop a block of characters from moving into another block of characters

本文关键字:字符 一个 移动 另一个      更新时间:2023-10-16
    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

相关文章: