将分屏多人游戏添加到C ++游戏 [英] Adding split-screen multiplayer to c++ game

查看:151
本文介绍了将分屏多人游戏添加到C ++游戏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用libnds在c ++中为NDS编码,但是这个问题不是NDS特定的.我目前有一个基于文本的游戏,其中顶部屏幕仅显示徽标,而您在底部屏幕上玩.

I am coding for the NDS in c++ with libnds, but this question is not NDS-Specific. I currently have a text-based game in which the top screen just displays a logo, and you play on the bottom screen.

因此,我想添加一种单DS多人游戏,其中一个在顶部屏幕上播放,另一个在底部屏幕上播放.我在两个屏幕上都设置文本引擎没有问题,我只需要找到一种在多人游戏中有效编码的方法.下面我写了它的摘要或简化版本.

So I want to add a type of single-DS multiplayer in which one player plays on the top screen, and the other on the bottom. I dont have a problem with setting up the text engine with both screens, I just need to find a method of efficiently coding in multiplayer. Below I wrote a summary or simplified version of it.

注意:consoleClear()会清除屏幕,并且游戏停止的唯一点是暂停功能.

Note: consoleClear() clears the screen and the only spot where the game stops is att the pause function.

//Headers

void display(int x,int y,const char* output))
{
    printf("\x1b[%d;%dH%s", y, x,output);
}

void pause(KEYPAD_BITS key) //KEYPAD_BITS is an ENUM for a key on the NDS
{
    scanKeys();
    while (keysHeld() & key)
    {
        scanKeys();
        swiWaitForVBlank();
    }
    while (!(keysHeld() & key))
    {
        scanKeys();
        swiWaitForVBlank();
    }
    return;
}

void pause() //Only used to simplify coding
{
    pause(KEY_A);
    return;
}

int main(void)
{
    //Initializations/Setup
    while (1)
    {
        if (rand()%2==1) //Say Hello
        {
            if (rand()%3!=1) //To Friend (greater chance of friend than enemy)
            {
                display(6,7,"Hello Friend!");
                display(6,8,"Good greetings to you.");
                pause();
                consoleClear(); //Clears text
                display(6,7,"Would you like to come in?");
                pause();
                //Normally more complex complex code (such as interactions with inventories) would go here
            }
            else //To enemy
            {
                display(6,7,"Hello enemy!");
                display(6,8,"I hate you!");
                pause();
                consoleClear();
                display(6,7,"Leave my house right now!!!");
                pause();
            }
        }
        else //Say goodbye
        {
            if (rand()%4==1) //To Friend (lesser chance of friend than enemy)
            {
                display(6,7,"Goodbye Friend!");
                display(6,8,"Good wishes to you.");
                pause();
                consoleClear();
                display(6,7,"I'll see you tomorrow.");
                pause();
                consoleClear();
                display(6,7,"Wait, I forgot to give you this present.");
                pause();
            }
            else //To enemy
            {
                display(6,7,"Goodbye enemy!");
                display(6,8,"I hate you!");
                pause();
                consoleClear();
                display(6,7,"Never come back!!");
                pause();
                consoleClear();
                display(6,7,"Good riddance!"); //I think I spelt that wrong...
                pause();
            }
        }
    }
}

我知道gotos令人困惑,可以认为是一个坏习惯,但是我想不出更好的方法.我的集成多人游戏版本:

I know gotos are confusing and can be considered a bad habit, but I cant think of a better way. My version of integrating multiplayer:

//Headers and same functions

int game(int location)
{
    switch (location)
    {
    case 1: goto one; break;
    case 2: goto two; break;
    case 3: goto three; break;
    case 4: goto four; break;
    case 5: goto five; break;
    case 6: goto six; break;
    case 7: goto seven; break;
    case 8: goto eight; break;
    case 9: goto nine; break;
    case 10: goto ten; break;
    default: break;
    }

    if (rand()%2==1) //Say Hello
    {
        if (rand()%3!=1) //To Friend (greater chance of friend than enemy)
        {
            display(6,7,"Hello Friend!");
            display(6,8,"Good greetings to you.");
            return 1;
one:;
            consoleClear(); //Clears text
            display(6,7,"Would you like to come in?");
            return 2;
two:;
            //Normally more complex complex code (such as interactions with inventories) would go here
        }
        else //To enemy
        {
            display(6,7,"Hello enemy!");
            display(6,8,"I hate you!");
            return 3;
three:;
            consoleClear();
            display(6,7,"Leave my house right now!!!");
            return 4;
four:;
        }
    }
    else //Say goodbye
    {
        if (rand()%4==1) //To Friend (lesser chance of friend than enemy)
        {
            display(6,7,"Goodbye Friend!");
            display(6,8,"Good wishes to you.");
            return 5;
five:;
            consoleClear();
            display(6,7,"I'll see you tomorrow.");
            return 6;
six:;
            consoleClear();
            display(6,7,"Wait, I forgot to give you this present.");
            return 7;
seven:;
        }
        else //To enemy
        {
            display(6,7,"Goodbye enemy!");
            display(6,8,"I hate you!");
            return 8;
eight:;
            consoleClear();
            display(6,7,"Never come back!!");
            return 9;
nine:;
            consoleClear();
            display(6,7,"Good riddance!"); //I think I spelt that wrong...
            return 10;
ten:;
        }
        return -1;
    }
}
int main(void)
{
    //Initializations/Setup
    int location1 = -1, location2 = -1;
    location1 = game(location1);
    location2 = game(location2);
    while (1)
    {
        scanKeys(); //Whenever checking key state this must be called
        if (keysDown() & KEY_A) //A key is used to continue for player1
            location1 = game(location1);
        if (keysDown() & KEY_DOWN) //Down key is used to continue for player2
            location2 = game(location2);
    }
}

除了这种方法是一种不好的做法之外,在实际的源代码中,我还需要添加数百个goto,这太浪费时间了.

Aside from this method being a bad practice, in the actual source code, I have hundreds of gotos I would need to add which would be too time consuming.

感谢您的帮助.如果有人有任何问题或答案,请询问/答复.

Any help is appreciated. If anyone has the slightest of a question, or answer, please ask/reply.

虽然这样做不是优选的,但如果有人有办法的话,我愿意从头开始重写游戏.

Though it is not preferred to do so, I am willing to rewrite the game from scratch if someone has a method to do so.

推荐答案

在每种情况下都使用if-else条件语句是一个首先想到的简单解决方案.

Using if-else conditional statements for each case is a simple solution that comes first to mind.

例如:

int game(int i){
  if(i == 1){
    //first case code here.
  }
  else if(i == 2){
    //second case code here.
  }
  //....
  return 0;
}

每种情况下的代码甚至都可以放入其他函数中,这些函数将根据每种条件而被调用. 对于您的情况,这可能就足够了.

The code in each case can even be put in other functions that will be invoked depending on each condition. This will probably be enough for your case.

一个更灵活的解决方案(但要复杂得多)是 分发表 . 想法是为每个所需的功能提供单独的功能,并将它们的指针放在数组中.然后,您可以使用这些函数指针通过索引表来调用它们.如果您要执行一系列的执行(函数调用)并且想要轻松地将其设置为完成,或者希望根据输入而获得不同的结果而无需更改程序,则这将非常有用.

A more flexible solution (but much more complex) is a dispatch table. The idea is to have separate functions with each desired functionality, and put pointers of them in an array. Then, you can call them by indexing the table, using those function pointers. This can be extremely helpful if you have a sequence of executions (function invokes) to be done and you want to set it done easily, or you want to have different results depending on your input, without changing your program.

下面有一个例子. 如果将std :: cout替换为printf并将 iostream 替换为 stdio 库,则此代码也可以在C语言中使用.

There is an example below. This code can be used in C too, if you replace std::cout with printf and iostream with stdio library.

#include <iostream>

using namespace std;

// Arrays start from 0.
// This is used for code
// readability reasons.
#define CASE(X) X-1 

typedef void (*chooseCase)();

// Functions to execute each case.
// Here, I am just printing
// different strings.
void case1(){
    cout<< "case1" << endl;
}

void case2(){
    cout<< "case2" << endl;
}

void case3(){
    cout<< "case3" << endl;
}

void case4(){
    cout<< "case4" << endl;
}

//Put all the cases in an array.
chooseCase cases[] = {
    case1, case2, case3, case4
};

int main()
{
    //You can call each scenario
    //by hand easily this way:
    cases[CASE(1)]();
    cout << endl;

    //Idea: You can even set in another
    // array a sequence of function executions desired.
    int casesSequence[] = {
        CASE(1), CASE(2), CASE(3), CASE(4),CASE(3),CASE(2),CASE(1)
    };
    //Execute the functions in the sequence set.
    for(int i = 0; i < (sizeof(casesSequence)/sizeof(int)); ++i){
        cases[casesSequence[i]]();
    }

    return 0;
}

这将在输出上打印:

case1

case1
case2
case3
case4
case3
case2
case1

这篇关于将分屏多人游戏添加到C ++游戏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆