Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //instalar las ncurses antes sudo apt-get install libncurses-dev
- //compilacion g++ -std=c++11 -o pelota pelota.cpp -lncurses
- //Estudio de una pelota que rebota en la pantalla en ncurses
- //Antonio Villanueva Segura
- #include <ncurses.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h> //usleep
- #include <stdlib.h> /* srand, rand */
- #include <string>
- using namespace std ;
- class pelota{
- public:
- pelota(WINDOW *win,int x,int y,string obj);
- void run ();
- bool contact(int x,int y);
- protected:
- WINDOW *win;
- void move (int &x,int &y);//logica del movimiento
- void print (int &x,int &y);//imprime objeto
- int x,y,max_x,max_y;//coordenadas y maximos
- bool dir_x,dir_y;//direccion
- string objeto;//objeto a mover
- int tempo;
- };
- /***********************************************************************/
- pelota ::pelota(WINDOW *win,int x=1,int y=1,string obj="O"):win(win),x(x),y(y),dir_x(true),dir_y(true),objeto(obj){
- getmaxyx(win,max_y,max_x); /* get the number of rows and columns */
- move(x,y);
- curs_set(0);
- noecho();
- srand (time(NULL));//inicializa aleatorios
- }
- /***********************************************************************/
- void pelota::move (int &x,int &y){//logica del movimiento
- if (tempo++ <5000){return ;}
- erase();
- tempo=0;
- dir_x ? x++: x--;
- dir_y ? y++: y--;
- //choque en los extremos
- if (x>max_x-3){dir_x^=1;}//inversa trayectoria
- if (y>max_y-3){dir_y^=1;}
- if (x<=1){dir_x^=1;}
- if (y<=1) {dir_y^=1;}
- }
- /***********************************************************************/
- void pelota::run (){
- move(x,y);
- mvprintw(y,x,objeto.c_str());
- }
- /***********************************************************************/
- bool pelota::contact(int objx,int objy){//choque raqueta
- //la pelota esta en un area, cuadrado de 3x3 con centro la raqueta ?
- objx--;
- objy--;
- //centro objx,objy
- for (int linea=0;linea<3;linea++){
- for(int col=0;col<3;col++){
- if ((objx+linea)==x && (objy+col)==y){
- dir_x^=1;//inversa la trayectoria
- dir_y^=1;
- return true;}
- }
- }
- return false;
- }
- class raqueta : public pelota{
- public:
- raqueta (WINDOW *win,int x,int y,string obj);
- void run ();
- int getX()const;
- int getY()const;
- private:
- void move (int &x,int &y);//logica del movimiento raqueta
- int tecla;
- };
- /***********************************************************************/
- raqueta ::raqueta(WINDOW *win,int x=1,int y=1,string obj="O") :pelota(win,x,y,"|"){}
- /***********************************************************************/
- void raqueta::move (int &x,int &y){//logica del movimiento
- timeout (0);//no bloquea lectura
- tecla=getch();//lee teclado
- if (x<max_x/2){
- switch (tecla){ //raqueta Izq.
- case '7':--y;erase();break;
- case '1':++y;erase();break;
- }
- }else {
- switch (tecla){ //raqueta Izq.
- case '9':--y;erase();tecla=0;break;
- case '3':++y;erase();tecla=0;break;
- }
- }
- //tecla=0;//Reset
- if (y<2){y=2;}
- if (y>max_y-3){y=max_y-3;}
- }
- /***********************************************************************/
- void raqueta::run (){
- move(x,y);
- mvprintw(y,x,objeto.c_str());
- }
- /***********************************************************************/
- int raqueta::getX()const{
- return x;
- }
- /***********************************************************************/
- int raqueta::getY() const{
- return y;
- }
- /***********************************************************************/
- /***********************************************************************/
- class juego {
- public:
- juego ();
- void run ();
- private:
- void pista();
- WINDOW *win; //ventana curses
- void initVideo();//inicializa video ncurses
- int max_x,max_y;
- };
- /***********************************************************************/
- juego::juego (){
- win=initscr(); /* Crea la ventana curses mode*/
- }
- /***********************************************************************/
- void juego::run (){
- pelota p(win,40,12);
- raqueta der(win,79,24);
- raqueta izq(win,1,1);
- while (true){//Bucle principal juego
- //erase();
- pista();
- der.run(); //ejecuta raqueta derch.
- izq.run();//ejecuta raqueta izq.
- p.contact(izq.getX(),izq.getY());//choque pelota raqueta
- p.contact(der.getX(),der.getY());//choque pelota raqueta
- p.run();//ejecuta pelota
- pista();
- refresh ();
- //usleep(100000);
- }
- };
- /***********************************************************************/
- void juego::initVideo(){//inicializa video ncurses
- win=initscr(); /* Crea la ventana curses mode*/
- clear(); /* Borra la pantalla entera bajo ncurses */
- refresh(); /* Actualiza la ventana con los cambios */
- curs_set(FALSE); // Don't display a cursor
- noecho();
- cbreak();
- timeout(1);
- keypad(win, TRUE);
- getmaxyx(win,max_y,max_x); /* get the number of rows and columns */
- }
- void juego:: pista(){
- for (int y=1;y<max_y-3;y++){
- mvprintw(y,37,"|");
- refresh();
- }
- }
- /***********************************************************************/
- /***********************************************************************/
- /***********************************************************************/
- int main (){
- juego game;
- game.run();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement