Hej ,ostatnio zabrałem się za pisanie swojej pierwszej banalnej gry w c++ , jest bardzo prosta ,polega tylko na omijaniu spadających obiektów . Na początek (w trakcie tworzenia gry) nie przejmowałem się zbytnio migającym ekranem konsoli . Teraz jednak chciał bym się skupić na poprawie wydajności gry . Słyszałem o podwójnym buforowaniu , jednak nie wiem jak się za to zabrać . Dziękuje za wszelką pomoc i komentarze na dole podałem kod gry , wiem jest fatalny :)
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
using namespace std;
void fail(int p)
{
system("cls");
cout<<"koniec gry ,no niestety ):"<<endl;
cout<<"suma zdobytych ponktow : "<<p<<endl;
cout<<"ale dobrze ci szlo (:";
getch();
getch();
exit(0);
}
void game_end(int px,int py,int mx,int my,int mx2,int my2,int mx3,int my3,int p) //sprawdzenie czy meteoryty nie sa rowne graczowi
{
if((px==mx||px==mx2||px==mx3)&&(py==my||py==my2||py==my3))
{
fail(p);
}
}
void terrain_generator(int player_x,int player_y,int monster_x,int monster_y,int monster_x2,int monster_y2, int monster_x3,int monster_y3)
{
int z = 20; //generowanie planszy (tablic)
char pole[z][z];
char player_intervace = 30;
char monster_intervace = 254;
for(int i=0; i<z; i++)
{
for(int j=0; j<z; j++)
{
pole[i][j]=' ';
}
}
pole[player_x][player_y]=player_intervace;
pole[monster_x][monster_y]=monster_intervace;
pole[monster_x2][monster_y2]=monster_intervace;
pole[monster_x3][monster_y3]=monster_intervace;
for(int i=0; i<z; i++)
{
for(int j=0; j<z; j++)
{
cout<<pole[i][j];
}
cout<<endl;
}
}
void try_only_monster_y_generator(int &monster_x, int &monster_y,int &monster_x2, int &monster_y2, int &monster_x3, int &monster_y3)
{
srand(time(NULL)); //nadawanie meteorytom losowych wartoœci
monster_x=0;
monster_x2=0;
monster_x3=0;
monster_y=rand()%20;
monster_y2=rand()%20;
monster_y3=rand()%20;
}
void monster_logic(int &monster_x, int &monster_y,int &monster_x2, int &monster_y2,int &monster_x3, int &monster_y3,int player_x,int player_y)
{
if(monster_x>18 || monster_x2>18 || monster_x3>18) try_only_monster_y_generator(monster_x, monster_y,monster_x2, monster_y2,monster_x3, monster_y3);
else monster_x++;
monster_x2++;
monster_x3++; //ruch meteorytow dopuki nie s¹ na samym dole
}
int render_monsters_for_start()
{
srand(time(NULL)); //generowanie meteorytow na sam poczatek gry
int x = rand()%20;
return x;
}
void gra()
{
int player_x = 17; //poczatkowe pozycje elementow
int player_y = 10;
int monster_x = 0;
int monster_y = render_monsters_for_start();
int monster_x2 = 0;
int monster_y2 = render_monsters_for_start();
int monster_x3 = 0;
int monster_y3 = render_monsters_for_start();
char znak = 0;
int punkty=0;
while(true) //gowna petla gry
{
system("cls");
terrain_generator(player_x,player_y,monster_x,monster_y,monster_x2,monster_y2,monster_x3,monster_y3);
monster_logic(monster_x,monster_y,monster_x2,monster_y2,monster_x3,monster_y3,player_x,player_y); //ruch potworow
game_end(player_x,player_y,monster_x,monster_y,monster_x2,monster_y2,monster_x3,monster_y3,punkty);
if (kbhit()==0) // nie wcisnieto klawisza
{
continue;
}
znak = getch();
if(znak=='A') //gdy jest wcisniety caps-lock
{
znak='a';
}
if(znak=='D')
{
znak='d';
}
switch(znak) //poruszanie graczem
{
case 'a':
{
if(player_y>0) player_y--;
else player_y = 0;
}
break;
case 'd':
{
if(player_y<19) player_y++;
else player_y = 19;
}
break;
}
punkty++;
}
}
void menu()
{
cout<<"###### ####### ####### # # ######### ######### "<<endl;
cout<<"# # # # # # # # # "<<endl;
cout<<"# # # # # ## # # "<<endl;
cout<<"###### # # # # ######### # "<<endl;
cout<<"## # # # # ######### # "<<endl;
cout<<"# # # # # ## # # "<<endl;
cout<<"# # # # # # # # # "<<endl;
cout<<"# # ####### ####### # # ######### # "<<endl;
cout<<endl;
cout<<endl;
cout<<"witamy w grze rocket v0.1 (moja pierwsza gra)"<<endl;
cout<<"celem gry jest unikanie spadajacych meteorytow"<<endl;
cout<<endl;
cout<<"kliknij dowolny klawisz aby zaczac : "<<endl;
getch();
system("cls");
}
int main()
{
system("color 0b");
menu();
gra();
return 0;
}