【问题标题】:how do i update frames for a text based game我如何更新基于文本的游戏的帧
【发布时间】:2017-12-22 21:14:58
【问题描述】:

现在我在程序员和我试图制作一个基于文本的游戏方面有点好。我从今天开始,我做了一些世界地图,以后会更新,我会把它做得很大!但对于我的生活,我无法正确更新框架。我使用普通窗口,我把我的代码放在下面。请帮我彻底更新我的框架!

地图类和标头

#include<string>
#include <Windows.h>



class map {
protected:
    char mep[200][50];

public:
    map();
    ~map();
    void bs();
    void buildTree(int X, int Y);
    void addTree();
    void buildMap();
    void printMap(int X, int Y);
};

#include"map.h"


map::map() {
    buildMap();
    printMap(0, 0);
}
map::~map() {

}


void map::bs() {
    //this builds a square world later cool things like trees get added
    for (int x = 0; x<200; x++) {
        for (int y = 0; y<500; y++) {
            mep[x][y] = '_';

        }

    }
}


void map::buildTree(int X, int Y) {

    //¨    /\¨ [x][y-4] 
    //    /  \"[x][y-3] 
    //¨  /-o  \¨ [x][y-2]  
    //¨ /-o-o- \¨[x][y-1]  
    //¨ / o0-o \¨ [x][y]   
    //¨/o-ooo-  \¨[x][y+1] 
    //¨   ||||¨ [x][y+2] 
    //¨   ||||¨ [x][y+3] 

    mep[X][Y - 4] = '/'; mep[X + 1][Y - 4] = '\\';
    mep[X - 1][Y - 3] = '/'; mep[X][Y - 3] = ' '; mep[X + 1][Y - 3] = ' '; mep[X + 2][Y - 3] = '\\';
    mep[X - 2][Y - 2] = '/'; mep[X - 1][Y - 2] = '-'; mep[X][Y - 2] = 'o'; mep[X + 1][Y - 2] = ' '; mep[X + 2][Y - 2] = ' '; mep[X + 3][Y - 2] = '\\';
    mep[X - 3][Y - 1] = '/'; mep[X - 2][Y - 1] = '-'; mep[X - 1][Y - 1] = 'o'; mep[X][Y - 1] = '-'; mep[X + 1][Y - 1] = 'o'; mep[X + 2][Y - 1] = '-'; mep[X + 3][Y - 1] = ' '; mep[X + 4][Y - 1] = '\\';
    mep[X - 3][Y] = '/'; mep[X - 2][Y] = ' '; mep[X - 1][Y] = 'o'; mep[X][Y] = '0'; mep[X + 1][Y] = '-'; mep[X + 2][Y] = 'o'; mep[X + 3][Y] = ' '; mep[X + 4][Y] = '\\';
    mep[X - 4][Y + 1] = '/'; mep[X - 3][Y + 1] = 'o'; mep[X - 2][Y + 1] = '-'; mep[X - 1][Y + 1] = 'o'; mep[X][Y + 1] = 'o'; mep[X + 1][Y + 1] = 'o'; mep[X + 2][Y + 1] = '-'; mep[X + 3][Y + 1] = ' '; mep[X + 4][Y + 1] = ' '; mep[X + 5][Y + 1] = '\\';
    mep[X - 1][Y + 2] = '|'; mep[X][Y + 2] = '|'; mep[X + 1][Y + 2] = '|'; mep[X + 2][Y + 2] = '|';
    mep[X - 1][Y + 3] = '|'; mep[X][Y + 3] = '|'; mep[X + 1][Y + 3] = '|'; mep[X + 2][Y + 3] = '|';

}
void map::addTree() {
    buildTree(74, 69);
    buildTree(5, 6);
    //add 18 more
}
void map::buildMap() {
    bs();
    addTree();
}
void map::printMap(int X, int Y) {
    //this is what the players will see
    std::string viewMap[15];

    for (int x = 0; x<15; x++) {
        for (int y = 0; y <= 70; y++) {
            viewMap[x] += mep[Y + y][X + x];

        }
    }
    //this prints the visible map for the players
    std::cout << viewMap[1] + "\n" + viewMap[2] + "\n" + viewMap[3]
        + "\n" + viewMap[4] + "\n" + viewMap[5] + "\n" + viewMap[6]
        + "\n" + viewMap[7] + "\n" + viewMap[8] + "\n" + viewMap[9]
        + "\n" + viewMap[10] + "\n" + viewMap[11] + "\n" + viewMap[12]
        + "\n" + viewMap[13] + "\n" + viewMap[14] << std::endl;

}
int main()
{
    //this is my main im using it as an update frames right now
    while (1) {
//also i will have the world render and build it self as a whole first and only loop the frame update ik its given but ill say it anway
        map mp;
        mp.~map();
    }
}

【问题讨论】:

  • 不要手动调用析构函数。
  • 我一开始是使用析构函数来清除屏幕,我习惯于谷歌文档,它为我做上限。
  • 对象的析构函数会在对象的生命周期结束时自动调用。在极少数情况下应该显式调用它,而这不是其中之一。
  • 至于您的实际问题:答案将取决于您使用的终端类型。还有像 ncurses 这样的库可以抽象出底层的终端差异,让你的代码在各种平台上工作。
  • 嗨,所以在深入研究之后,我了解了我的问题,以及如何澄清我的问题并向你们说明我在问什么。我的游戏使用了一个基本的 while(1) 循环和 system("cls") ,我知道这很糟糕,但基本上是为了总结我的问题,我如何制作一个基本的帧 snyc 函数。我使用普通的视觉工作室,没有任何很酷的独特库,我有点不想改变它。我将如何制作一个简单的帧同步功能/类

标签: c++ text-based


【解决方案1】:

希望我的理解是正确的。

如果您的程序仅使用终端,您可以打印某个 ascii 字符以返回到行首。然后你就可以重写整个屏幕了。

\033[f

这是我用于基于终端的 ascii 游戏。 只需打印要覆盖的行数即可。

std::cout << "\033[f";

希望这是你的解决方案

【讨论】:

  • 嗨,所以在深入研究之后,我了解到了我的问题,以及如何澄清我的问题并向你们说明我在问什么。我的游戏使用了一个基本的 while(1) 循环和 system("cls"),我知道这很糟糕,但基本上是为了总结我的问题,我该如何制作一个基本的帧 snyc 函数。我使用普通的视觉工作室,没有任何酷炫、独特的库,我有点不想改变它。我将如何制作一个简单的帧同步函数/类??????
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2015-09-10
  • 2023-01-08
  • 1970-01-01
相关资源
最近更新 更多