带有图形的c / c ++赛车游戏

Racing game in c/c++ with graphics

本文关键字:游戏 图形      更新时间:2023-10-16

我正在尝试使用图形在c/c ++中制作赛车游戏

到目前为止,我的问题是我无法在敌方汽车中获得颜色当我添加颜色时,它会闪烁

如何消除闪烁

这是我到目前为止制作的游戏。

#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#include<dos.h>
#include<process.h>
#include<stdlib.h>
void enemycar(int x, int y)
 {
  setcolor(15);
  rectangle(x+1,y,x+49,y+100);
  rectangle(x+1,y+25,x+49,y+75);
  setfillstyle( SOLID_FILL,YELLOW);
  floodfill((x+x+50)/2,(y+y+100)/2,15);
  setfillstyle(1,YELLOW);
  floodfill((x+x+50)/2,(y+y+40)/2,15);
  floodfill((x+x+50)/2,(y+y+160)/2,15);
  }
void mycar(int x, int y)
 {
  setcolor(15);
  rectangle(x+1,y,x+49,y+100);
  rectangle(x+1,y+25,x+49,y+75);
  setfillstyle(5,RED);
  floodfill((x+x+50)/2,(y+y+100)/2,15);
  setfillstyle(2,BLUE);
  floodfill((x+x+50)/2,(y+y+40)/2,15);
  floodfill((x+x+50)/2,(y+y+160)/2,15);
  }

void myclear(int x,int y)
 {
 setcolor(8);
 rectangle(x+1,y,x+49,y+100);
 rectangle(x+1,y+25,x+49,y+75);
 setfillstyle(SOLID_FILL,8);
 floodfill((x+x+50)/2,(y+y+100)/2,8);
 floodfill((x+x+50)/2,(y+y+40)/2,8);
 floodfill((x+x+50)/2,(y+y+160)/2,8);
 }

 void enemyclear(int x,int y)
 {
 setcolor(8);
 rectangle(x+1,y,x+49,y+100);
 rectangle(x+1,y+25,x+49,y+75);
// line(x+1,y,x+1,y+100);
// delay(500);
 }
void main()
 {
 int gdriver = DETECT,gmode;
 initgraph(&gdriver,&gmode,"C:\Turboc3\BGI");
  int x=300,y=350,ch,life=3,score=0;
  char choice;
  cout<<"nnnnnttt* THUNDER RACER *";
  cout<<"nttt ---------------";
  cout<<"nntLong long ago the state of Valencia was attacked by the";
  cout<<"nntenemies and were defeated. Every soldier and citizen was";
  cout<<"nntkilled except the beautiful princess Cindrella  and you";
  cout<<"nntwho survived. Enemies want to kill her and she is in your";
  cout<<"nntcar right now. If you have the guts save her from enemies'";
  cout<<"nntcars and marry her.";
  cout<<"nntSo all the best...";
  delay(200);
  for(int m=1;m<25;m++)
    for(int n=1;n<80;n++) {
        gotoxy(n,m);
        cout<<" ";
        }
  setcolor(RED);
  rectangle(20,60,200,120);
  rectangle(20,300,200,420);
  gotoxy(5,21);
  cout<<"Only Aditya & Anshul";
  gotoxy(5,22);
  cout<<"have saved her till";
  gotoxy(5,23);
  cout<<"now. So you can be";
  gotoxy(5,24);
  cout<<"the 3-rd";
  rectangle(249,0,401,getmaxy());
  setfillstyle(SOLID_FILL,8);
  floodfill(325,getmaxy()/2,RED);
  setcolor(RED);
  rectangle(20,200,200,250);
  gotoxy(5,15);
  cout<<"Press <Esc> to Exit";
  for(int level=1;(level<=5)&&(life>0);level++){
    if(level==1){
      gotoxy(5,5);
      cout<<"Your War Starts Now";
      gotoxy(5,7);
      cout<<"All the best";
      delay(500);
      gotoxy(5,5);
      cout<<"                    ";
      gotoxy(5,7);
      cout<<"            ";
      }
     else {
         gotoxy(5,5);
         cout<<"Next level.";
         delay(500);
         gotoxy(5,5);
         cout<<"           ";
         }
  for(int i=0;(i<15)&&(life>0);i++) {
    if((level==5)&&(i==14)){
       gotoxy(5,5);
       cout<<"You have won";
       gotoxy(5,6);
       cout<<"Wanna continue <y/n>";
       choice = getch();
       if ((choice=='y')||(choice=='Y'))
        main();
       else
        exit(0);
       }
    setcolor(RED);
    rectangle(420,125,600,175);
    gotoxy(55,10);
    cout<<"Level = "<<level;
    rectangle(420,250,600,300);
    gotoxy(55,18);
    cout<<"Lives = "<<life;
    rectangle(420,350,600,400);
    gotoxy(55,24);
    cout<<"Score = "<<score;
    int accident=0;
    int y1=1,x1=250+((rand()%3)*50);
    int y2=1,x2=250+((rand()%3)*50);
    score += 10;
    while(y1<getmaxy()-1)
    {
        enemyclear(x1,y1);
        enemyclear(x2,y2);
        y1++;
        y2++;
        if(accident == 1)
            break;
        enemycar(x1,y1);
        enemycar(x2,y2);
        mycar(x,y);
        delay(5-level);
        if(kbhit())
        {
            mycar(x,y);
            ch=getch();
            switch(ch) {
            case 27: exit(0);
            break;
            case 75:myclear(x,y);
                if(x>250)
                    x=x-50;
                    if((x==x1)||(x==x2))
                        if( ( ((y-y1)<100)&&((y-y1)>0) ) || ( ((y-y2)<100)&&((y-y2)>0) ) )
                        {
                            accident=1;
                            x=x+50;
                            mycar(x,y);
                            goto Next1;
                        }
                 mycar(x,y);
            break;
            case 77:myclear(x,y);
                if(x<350)
                    x=x+50;
                    if((x==x1)||(x==x2))
                        if( ( ((y-y1)<100)&&((y-y1)>0) ) || ( ((y-y2)<100)&&((y-y2)>0) ) )
                        {
                            accident=1;
                            x=x-50;
                            mycar(x,y);
                            goto Next1;
                        }
                mycar(x,y);
            break;
            case 72:myclear(x,y);
                if(y>0)
                      y=y-5;
                mycar(x,y);
             break;
             case 80:myclear(x,y);
                if(y<getmaxy()-105)
                    y=y+5;
                mycar(x,y);
             break;
            }
        }
        if((x==x1)||(x==x2))
            if( ( ((y-y1)<100)&&((y-y1)>0) ) || ( ((y-y2)<100)&&((y-y2)>0) ) )
                accident=1;

      Next1:
      if(accident==1){
        life =life-1;
        score -= 10;
        if(life==0) {
         gotoxy(5,5);
         cout<<"GAME OVER ";
         gotoxy(5,6);
         cout<<"You could not save";
         gotoxy(5,7);
         cout<<"her";
         break;
         }
        gotoxy(5,5);
        cout<<"You have lost 1 life";
        delay(500);
        gotoxy(5,5);
        cout<<"                    ";
        }
        }
  }
  }
 getch();
 }

我可以看到您通过将创建字符的调用分解为方法来模块化代码。这很好。

但是,由于您使用的是面向对象的语言C++,因此建议您尝试为每种字符类型创建一些

闪烁

闪烁

可能是因为您的图形库不是为高性能而设计的。我建议您尝试使用精灵。事实上,你可能希望使用像Cocos2d-x这样的开源2D游戏/精灵库。

游戏引擎能给我带来什么?

像我上面描述的游戏引擎,使用了很多多年来开发的性能技术,比如纹理打包、查找表等,来提供实时性能。学习所有这些技术仍然有必要,但是您可能不想从头开始重新实现它们(除非您正在开发自己的游戏引擎(。

要消除此处的闪烁,您可以通过使用函数来使用图形页面的概念:设置活动页面( (;和设置可视化页面( (;