elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  AYUDA! Problemas en la creación de un juego C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: AYUDA! Problemas en la creación de un juego C++  (Leído 2,522 veces)
kyzo98

Desconectado Desconectado

Mensajes: 13



Ver Perfil
AYUDA! Problemas en la creación de un juego C++
« en: 26 Febrero 2015, 23:46 pm »

Hola amigos,

Estaba intentando programar un juego típico de nave vs asteroides con disparos y tal...
Hasta ahora todo iva sobre ruedas, pero a partir de que empezé a crear lists tengo problemas, os los comento haber si me puede ayudar alguien:


1-Desde que cree el list<BALA*> y sus respectivas funciones, la nave se mueve muy torpe, incluso deja de moverse.
2-Dede que cree el list<AST*> y sus respectivas funciones hay partes de la interfaz que desaparencen, como trozos de el borde superior, y letras de la palabra Salut.

Les dejo tooooooodo el código a continuación por si me quieren intentar ayudar:
Gracias de antemano!


Código:
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<stdlib.h>
#include<list>
using namespace std;

#define ARRIBA 72
#define IZQUIERDA 75
#define DERECHA 77
#define ABAJO 80


void gotoxy(int x, int y){
    HANDLE hCon;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD dwPos;
    dwPos.X = x;
    dwPos.Y = y;

    SetConsoleCursorPosition(hCon, dwPos);
         
}

void OcultarCursor(){
    HANDLE hCon;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cci;
    cci.dwSize = 2;
    cci.bVisible = FALSE;
   
    SetConsoleCursorInfo(hCon,&cci);
   
}

void pintar_limites(){
     for(int i = 2 ; i<78 ; i++){
           gotoxy(i,3); printf("%c",205);
           gotoxy(i,33);printf("%c",205);
     }
     for(int i = 4 ; i<33 ; i++){
           gotoxy(2,i); printf("%c",186);
           gotoxy(77,i);printf("%c",186);
     }
     
     gotoxy(2,3);  printf("%c",201);
     gotoxy(2,33); printf("%c",200);
     gotoxy(77,3); printf("%c",187);
     gotoxy(77,33);printf("%c",188);
     
}

class NAVE{
    int x,y;
    int corazones;
    int vidas;
public:
    NAVE(int _x, int _y, int _corazones, int _vidas): x(_x),y(_y),corazones(_corazones), vidas(_vidas){}
    int X(){ return x;}
    int Y(){ return y;}
    void COR() { corazones--; }
    void pintar();
    void borrar();
    void mover();
    void pintar_corazones();
    void morir();
};

void NAVE::pintar(){
    gotoxy(x,y);  printf("  %c",30);
    gotoxy(x,y+1);printf(" %c%c%c",40,207,41);
    gotoxy(x,y+2);printf("%c%c %c%c",30,190,190,30);
   
}

void NAVE::borrar(){
     gotoxy(x,y);  printf("     ");
     gotoxy(x,y+1);printf("     ");
     gotoxy(x,y+2);printf("     ");
     
}

void NAVE::mover(){
     if(kbhit()){
                 char tecla = getch();
                 borrar();
                 if(tecla == 'a' && x > 3) x--;
                 if(tecla == 'd' && x+5 < 77) x++;
                 if(tecla == 'w' && y > 4) y--;
                 if(tecla == 's' && y+3 < 33) y++;
                 if(tecla == 'e')corazones--;
                 pintar();
                 pintar_corazones();
            }
}

void NAVE::pintar_corazones(){
     
    gotoxy(50,2); printf("Vidas %d",vidas);
    gotoxy(64,2); printf("Salud");
    gotoxy(70,2); printf("     ");
    for(int i = 0 ; i < corazones; i++){
          gotoxy(70+i,2); printf("%c",3);
    }
}

void NAVE::morir(){
    if(corazones == 0){
          borrar();
          gotoxy(x,y);   printf(" *** ");
          gotoxy(x,y+1); printf("*****");
          gotoxy(x,y+2); printf(" *** ");
          Sleep(200);
         
          borrar();
          gotoxy(x,y);   printf(" * * ");
          gotoxy(x,y+1); printf("  *  ");
          gotoxy(x,y+2); printf(" * * ");
          Sleep(200);
          borrar();
         
          vidas--;
          corazones = 3;
          pintar_corazones();
          pintar();
               
    }   
}

class AST{
    int x,y;
public:
    AST(int _x, int _y):x(_x),y(_y){}
    void pintar();
    void mover();
    void choque(class NAVE &N);
};

void AST::pintar(){
    gotoxy(x,y); printf("%c",184);     
}

void AST::mover(){
    gotoxy(x,y); printf(" ");
    y++;
    if(y > 32){
        x = rand()%71 + 4;
        y = 4;     
    }
    pintar();
}

void AST::choque(class NAVE &N){
    if( x >= N.X() && x < N.X()+5 && y >= N.Y() && y <= N.Y()+2){
         N.COR();
         N.borrar();
         N.pintar();
         N.pintar_corazones();
         x = rand()%71 + 4;
         y = 4;
    }     
}

class BALA{
    int x,y;
public:
    BALA(int _x, int _y):x(_x),y(_y){}
    int X() { return x;}
    int Y() { return y;}
    void mover();
    bool fuera();   
};

void BALA::mover(){
    gotoxy(x,y); printf(" "); 
    y--;
    gotoxy(x,y); printf(".");       
}

bool BALA::fuera(){
    if(y == 4) return true;
    return false;     
}

int main(){
   
    OcultarCursor();
    pintar_limites();
    NAVE N(37,30,3,3);
    N.pintar();
    N.pintar_corazones();
   
    list<AST*> A;
    list<AST*>::iterator itA;
    for(int i=0; i<5; i++){
         A.push_back(new AST(rand()&75 + 3, rand()&5 + 3));
    }
   
    list<BALA*> B;
    list<BALA*>::iterator it;
   
    bool game_over = false;
    while(!game_over){
           
            if(kbhit()){
                char tecla = getch();
                if(tecla == 'b') 
                B.push_back(new BALA(N.X()+2, N.Y()-1));     
            }
           
            for(it = B.begin(); it != B.end(); it++){
                (*it)->mover(); 
                if((*it)->fuera()){
                    gotoxy((*it)->X(),(*it)->Y()); printf(" ");
                    delete(*it);
                    it = B.erase(it);     
                }     
            }
           
            for(itA = A.begin(); itA != A.end(); itA++){
                 (*itA)->mover();
                 (*itA)->choque(N);   
            }
           
            N.morir();
            N.mover();
            Sleep(30);
           
    }
system("pause");
    return 0;
}


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: AYUDA! Problemas en la creación de un juego C++
« Respuesta #1 en: 27 Febrero 2015, 10:10 am »

Tu problema se debe a un mal diseño.

La respuesta simple es que lees del teclado en funciones diferentes, por lo que si decides mover la nave pero la pulsación de la tecla la recibe la función que lanza las balas... pues ni lanzas bala ni te mueves.

La respuesta técnica es que estás asignando demasiadas responsabilidades a las clases:

* La clase nave debería encargarse de almacenar la información de la nave. No debería saber pintarse ni tampoco interpretar las teclas para moverse. Lo mismo es aplicable para bala y asteroide

* Para pintar el escenario lo ideal sería tener una clase nueva, por ejemplo class Escena, a la que le facilitas la nave, los asteroides y las balas y ella se encarga de representar todo

* El control del teclado debe estar centralizado en un único punto y, en función de la tecla que se pulse, realizar una acción u otra.

Tu piensa que una clase no debe ser algo mastodóntico. Es mucho mejor crear clases sencillas con responsabilidades bien definidas. Si, por ejemplo, cargas a la clase "Nave" con la responsabilidad de saber pintarse y después resulta que tienes que hacer que el juego funcione tanto en consola como con opengl, vas a llenar la clase de código que no necesita... eso es mejor dejárselo a otra clase diferente.

Un saludo.


En línea

kyzo98

Desconectado Desconectado

Mensajes: 13



Ver Perfil
Re: AYUDA! Problemas en la creación de un juego C++
« Respuesta #2 en: 27 Febrero 2015, 15:07 pm »

Tu problema se debe a un mal diseño.

La respuesta simple es que lees del teclado en funciones diferentes, por lo que si decides mover la nave pero la pulsación de la tecla la recibe la función que lanza las balas... pues ni lanzas bala ni te mueves.

La respuesta técnica es que estás asignando demasiadas responsabilidades a las clases:

* La clase nave debería encargarse de almacenar la información de la nave. No debería saber pintarse ni tampoco interpretar las teclas para moverse. Lo mismo es aplicable para bala y asteroide

* Para pintar el escenario lo ideal sería tener una clase nueva, por ejemplo class Escena, a la que le facilitas la nave, los asteroides y las balas y ella se encarga de representar todo

* El control del teclado debe estar centralizado en un único punto y, en función de la tecla que se pulse, realizar una acción u otra.

Tu piensa que una clase no debe ser algo mastodóntico. Es mucho mejor crear clases sencillas con responsabilidades bien definidas. Si, por ejemplo, cargas a la clase "Nave" con la responsabilidad de saber pintarse y después resulta que tienes que hacer que el juego funcione tanto en consola como con opengl, vas a llenar la clase de código que no necesita... eso es mejor dejárselo a otra clase diferente.

Un saludo.


Gracias por la información, todavia estoy aprendiendo como ves. Gracias por la explicación, me pondré a corregirlo.

Un saludo y gracias de nuevo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda en la creacion de un juego en flash
Diseño Gráfico
3dw1n 1 1,995 Último mensaje 30 Enero 2006, 21:17 pm
por ™Carlos.®
Proyecto - creacion de un juego MMORPG 3D « 1 2 3 4 »
Diseño Gráfico
EnRiKe. 30 22,980 Último mensaje 27 Febrero 2010, 05:29 am
por miguelinis
Creacion de un juego
Programación General
Criistian5 3 2,431 Último mensaje 2 Mayo 2013, 17:24 pm
por Saberuneko
Ayuda. Creación bot para juego online.
Programación General
andresjame 8 8,453 Último mensaje 28 Febrero 2015, 16:29 pm
por patilanz
Consejos para creacion de juego!
Programación Visual Basic
Brian1511 2 2,036 Último mensaje 24 Enero 2015, 01:50 am
por Brian1511
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines