在C ++中同时执行多个功能

时间:2012-11-20 18:19:04

标签: c++ function

我目前正在使用C ++。我需要制作一个数字捕手游戏,因此必须同时做两件事

  1. 移动角色
  2. 数字从顶部不断下降。
  3. 此外,我需要一次抛出多个号码。 我怎么能同时做所有这些?

6 个答案:

答案 0 :(得分:5)

您基于非常错误的前提。这并不要求同时做任何这样的事情。你所要做的就是做每件事然后更新。你需要得到一本关于非常基本的游戏架构的书。

答案 1 :(得分:1)

我相信您需要从项目开始并同时向他人学习。基本上,你不需要同时做所有这些,没有人在看你是否同时在幕后做,你只需要在向用户呈现结果之前完成所有操作。

答案 2 :(得分:0)

在某些情况下,我们需要调用多个功能。这就是线程发挥作用的地方。例如,在Windows上,您可以使用CreateThreadEx函数同时调用多个函数。但是,您必须处理线程的复杂性。

阅读有关线程的文章,您将获得其基本概念。

答案 3 :(得分:0)

我将从提倡游戏编程研究的其他答案中略微阐述,并提供一些基本的见解。

你的程序的主要任务是循环(直到游戏结束,或玩家累了),并在每次迭代时:

  • 计算游戏的当前状态,
  • 渲染视图,
  • 阅读播放器输入。

你不必按此顺序执行此操作,游戏应该足够快地运行,以使一切都同时发生。

游戏的状态实际上是游戏中所有元素的状态:

  • 背景,
  • 仍然是对象,
  • 移动物体,
  • 生成其他对象的对象,
  • 破坏其他物品的物品,
  • 播放器,

可能存在管理所有这些对象,不同对象的不同规则,对象之间的交互等的规则。您可以在引擎中对这些规则进行编码,并确保所有对象都得到更新。最简单的方法是遍历所有对象列表并逐个更新它们。

渲染基本上是遍历所有对象并根据其状态(颜色,位置等)在屏幕上绘制(如果它们可见)。

轮询输入就是这样:通过使用键盘,鼠标,触摸屏或您想要处理的任何其他输入设备来验证玩家是否做了一些输入。

在你的项目中,你的对象列表只是下降字符列表,主要规则是重力(或者是屏幕底部的恒定速度),输入是键盘。

如果您希望游戏在文本模式下运行,主要障碍是移动光标,获取非阻塞输入,清除屏幕。在UNIX上,查找 curses 库,它提供了所有必要的功能。

鉴于游戏的简单性,您的程序肯定会很快运行,因此您需要在循环中包含一个小的睡眠期。但是,最好具有一致的帧速率(至少30hz),这样您就可以测量完成工作所需的时间,并使进程在剩余时间内休眠以达到一个循环的正确时间。

最后一件事:不要查看这个项目的线程或并发编程,这样做无济于事。渲染必须在大多数图形设置中由一个单独的线程完成,并且您最终会进行大量的同步,除非您在线程之间使用消息传递(这将是一个有趣的练习,但保留在版本2中)。 p>

答案 4 :(得分:0)

The Matrix  falling numbers

如果你在Windows上的代码:

/* The Matrix  falling numbers */

#include <iostream>
#include <windows.h> 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
using namespace std;


#define KB_UP 72
#define KB_DOWN 80
#define KB_LEFT 75
#define KB_RIGHT 77
#define KB_ESCAPE 27
#define KB_F8 66


/* Variables*/

char screen_buffer[2000]={' '};
int y_coord[2000]={0};
int x=0, y=0,dy=0;
int XMAX=77;
int YMAX=23;
int KB_code=0;
bool QuitGame=false;
int platformX=35, platformY=23;

/* function prototypes*/

void gotoxy(int x, int y);
void clrscr(void);
void setcolor(WORD color); 
void simple_keyboard_input();  
void draw_falling_numbers();
void draw_platform();

/*  main  */

int main(void)
{
  /* generate random seed */
  srand ( time(NULL) );

  /* generate random number*/
  for(int i=0;i<XMAX;i++) y_coord[i]=   rand() % YMAX;

  while(!QuitGame)
  {
      /* simple keyboard input */
      simple_keyboard_input();

      /* draw falling numbers */
      draw_falling_numbers();

  }

  /* restore text color */
  setcolor(7);
  clrscr( );
  cout<<" \n";

  cout<<" \nPress any key to continue\n";
  cin.ignore();
  cin.get();

   return 0;
}

/* functions  */

void draw_falling_numbers()
{

    for(x=0;x<=XMAX;x++)
    {
        /* generate random number */
        int MatixNumber=rand() % 2 ;

        /* update falling number */
        y_coord[x]=y_coord[x]+1;

        if (y_coord[x]>YMAX) y_coord[x]=0;

        /* draw dark color */
        setcolor(2);
        gotoxy(x ,y_coord[x]-1); cout<<"  "<<MatixNumber<<"   ";

        /* draw light color */
        setcolor(10);
        gotoxy(x ,y_coord[x]); cout<<"  "<<MatixNumber<<"   ";
    }
    /* wait some milliseconds */
    Sleep(50);
    //clrscr( );
}


void draw_platform()
{
  setcolor(7);
 gotoxy(platformX ,platformY);cout<<"       ";

 gotoxy(platformX ,platformY);cout<<"ÜÜÜÜÜÜ";
 setcolor(7);
 Sleep(5);
}




void simple_keyboard_input()
{
    if (kbhit())
      {
            KB_code = getch();
            //cout<<"KB_code = "<<KB_code<<"\n";

            switch (KB_code)
            {

                case KB_ESCAPE:

                    QuitGame=true;

                break;

                case KB_LEFT:
                           //Do something
                    platformX=platformX-4;if(platformX<3) platformX=3;
                break;

                case KB_RIGHT:
                           //Do something     
                    platformX=platformX+4;if(platformX>74) platformX=74;
                break;

                case KB_UP:
                           //Do something                     
                break;

                case KB_DOWN:
                           //Do something                     
                break;

            }        

      }

}


void setcolor(WORD color)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
    return;
}


void gotoxy(int x, int y)
{
  static HANDLE hStdout = NULL;
  COORD coord;

  coord.X = x;
  coord.Y = y;

  if(!hStdout)
  {
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
  }

  SetConsoleCursorPosition(hStdout,coord);
}


void clrscr(void)
{
  static HANDLE hStdout = NULL;      
  static CONSOLE_SCREEN_BUFFER_INFO csbi;
  const COORD startCoords = {0,0};   
  DWORD dummy;

  if(!hStdout)               
  {
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hStdout,&csbi);
  }

  FillConsoleOutputCharacter(hStdout,
                             ' ',
                             csbi.dwSize.X * csbi.dwSize.Y,
                             startCoords,
                             &dummy);    
  gotoxy(0,0);
}

答案 5 :(得分:-1)

查看将包含openmp或pthreads的并发编程方法。我建议使用openmp的唯一原因是,如果你的时间有限,它很容易学习,并且在某种程度上,pthreads也非常容易理解。了解您正在使用的平台也很有帮助,以便每个人都能以更具体的方式回答问题。