Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - xRodak

#1
Hola ! Tengo un pequeño problema con la utilización de cierta variable global, les comento lo que tengo y el error que poseo:

Quiero crear una variable 'mMonsterData' global, que sea modificada en la clase World, y que la clase Monster pueda tener accedo a esa información modificada de la variable.

Monster.hpp

struct MonsterData;

class Monster : public Entity
{
    public:
        Monster();
    ......
};

namespace
{
    std::map<Monster::ID, MonsterData*> mMonsterData;
}


DataTables.hpp

struct MonsterData
{
   int                 hitpoints;
   unsigned int                    Type;
   unsigned int                    Size;
   unsigned int                    Element;
};


World.hpp

...
#include <Monster.hpp>
...
...


World.cpp

...
mMonsterData = Value; //<-- Inicializo mi variable con ciertos valores
...

//Más tarde

Monster(spawn.id, mTextures); // Aquí el error. Ignoren los argumentos.


Monster.cpp

#include <Monster.hpp>
#include <DataTables.hpp>

Monster::Monster(Monster::ID id, const TextureHolder& textures) //Error en el contructor de Monster
: Entity(mMonsterData[id]->hitpoints)  //<-- ERROR: mMonsterData[id]->hitpoints, si cambio esta expresion por un int, el error se corrige.
, mSprite(textures.get(mMonsterData[id]->texture)) // También debería dar error aquí
{

}


El error reside en que, mi variable 'global' modificada en World.cpp, se modificó, pero solo es utilizable en World.cpp. Desde allí puede acceder a mMonsterData[id]->hitpoints u otras de sus variables sin ningún problema. Pero al momento de querer obtener sus datos en el constructor de Monster, la aplicación de cae. Esto es porque mMonsterData aún no es inicializada en este contexto (siendo que debería ser una variable global (?) ).

Ese es mi problema, alguien sabe donde está el error? Cómo puedo hacer que al modificar dicha variable en World.cpp, estos valores modificados puedan ser obtenidos en el Monster.cpp?

Estuve averiguando sobre variables globales, y la keyword 'extern', pero estuve otro tipo de errores haciéndolo de esa manera, así que vamos por parte, primero sus opiniones.

Muchas gracias por leer y también gracias de antemano.

Saludos cordiales.
#2
Hola compañeros ! Me entró una duda sobre la definición de ciertas variables.

Supongamos tengo la siguiente enumeración:

namespace ENUM
{
    enum ID
    {
        a,
        b,
        c,
    };
}


Cuál sería una forma correcta de declarar un valor de dicha enumeración?

ENUM::ID       valor = ENUM::a;

o

unsigned int    valor = ENUM::a;

He visto ejemplo donde se utiliza la primera, pero según lo que he alcanzado a estudiar, la segunda sería más ideal.

Cómo sé cual de las dos debo utilizar dependiendo de cierto contexto?

Saludos y gracias de antemano.
#3
Hola compañeros ! He buscado y buscado acerca del error que poseo, y solo he logrado averiguarque es referente a la inicialización de variables y/o punteros, pero no he logrado corregirlo.

El error que poseo es el siguiente:

std::string::assign(std::string const&) ()

Según tiene que ver con la inicialización de mis clases, por lo que les dejo más o menos lo que poseo:

Account& account = *getContext().account;
account.createCharacter(Professions::Bloodge, *getContext().textures);
Character& character = account.getCharacter(account.getSlot());
character.setName(name); //<------ AQUÍ EL ERROR


Les explico como funciona:

'getContext.account' me regresa un puntero a un objeto Account. Este objeto YA FUE INICIALIZADO por lo que dicho puntero no debería tener fallos.
'account.createCharacter' crea un objeto Character nuevo en la cuenta.
'account.getCharacter' regresa una referencia a dicho personaje creado (la cuenta posee 3 Slots, por lo que se señala cual de los 3 personajes quiero obtener, con el getSlot, que devuelta el Slot actual en el cual estoy creando el personaje, para asegurarme de que obtenga el personaje recien creado, y no una referencia vacía u otro Character de los demás slots, evitando errores)

Guardo la referencia al personaje recién creado en la variable 'character'. Y luego procedo a asignarle un nombre. La variable 'name' contiene un string, no vacio (std::string name;)


Account.hpp

class Account
{
public:
    Account();
    void createCharacter(Professions::ID id, const TextureHolder& textures);
    Character& getCharacter(int n);
private:
    std::array<Character*, MAX_CHARACTERS> mCharacters;    //array que contiene punteros a Character, de tamaño MAX_CHARACTERS
    int currentChars;
    int currentSlot;
};


Account.cpp

Account::Account()
{
    currentChars = 0;
    currentSlot = -1;

    //Aquí señalo que inicialmente todos los punteros a objetos Character, serán punteros nulos, es decir, una cuenta sin personajes (Characters)
    mCharacters[0] = nullptr;
    mCharacters[1] = nullptr;
    mCharacters[2] = nullptr;
}

void Account::createCharacter(Professions::ID id, const TextureHolder& textures)
{
        //crea un nuevo personaje en un puntero
        std::unique_ptr<Character> newCharacter( new Character(id, textures));

        //hace que el array apunte a este nuevo Character creado, para asi guardar el nuevo personaje en la cuenta
        //currentSlot es el Slot en donde estoy creando el personaje, la función getSlot utilizada arriba devuelve este valor.
        mCharacters[currentSlot] = newCharacter.get();

        ++currentChars;

}

Character& Account::getCharacter(int n)
{
    std::cout << "n = " << n << std::endl;

    // retorna un personaje de la cuenta (retorna una referencia)
    return *mCharacters[n];
}


Character.hpp

class Character:
{
    public:
explicit Character(Professions::ID id, const TextureHolder& textures);
void setName(std::string& name);
std::string getName() const;

    private:
        std::string mName;

};


Character.cpp


Character::Character(Professions::ID id, const TextureHolder& textures)
{
}

void Character::setName(std::string& name)          //<------- Esta es la función que da el error
{
    std::cout << "setName activada" << std::endl;
    mName = name;                                              //<------- Esta es la linea del error
    std::cout << "Se dio el nombre con exito" << std::endl; //Obviamente esta linea no se imprime en la consola S:
}


std::string Character::getName() const
{
    return mName;
}




Es bastante código, pero el funcionamiento es super simple y fácil de entender, coloqué todo lo involucrado para que se entienda de donde puede provenir el error.

Espero que puedan ayudarme, estoy bastante desesperado, mucha gracias de antemano !
#4
Hola ! Llevo 2 días intentando reparar un error, y creo que ya estoy muy cerca de lograrlo, pero ya no doy más, así que les pido ayuda.

Sucede que tengo los siguientes errores

|323|error: expected class-name before '(' token
|323|error: expected '{' before '(' token
|324|error: expected constructor, destructor, or type conversion before ',' token
|324|error: expected constructor, destructor, or type conversion before '(' token


(El problema se presenta en la clase State, en la estructura Context, y en sus respectivos contructores, así que pueden ignorar el resto de las clases que desconozcan, las puse para que se entienda de qué trata el código.)

Mi código es de este estilo:

class State
{

   public:
       struct Context
       {
           //Constructor
           Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player);
           sf::RenderWindow* window;
           TextureHolder* textures;
           FontHolder* fonts;
           Player* player;
       };

   public:
       State(StateStack& stack, Context context);
       virtual ~State();
   private:
       Context mContext;
};


//Constructor de la estructura Context que está dentro de la clase State
//Este contructor debería guardar referencias (o punteros) a los recursos obtenidos por argumento
State::Context::Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player)
//Lista de inicialización
: State::Context::window(window)                        //Linea 323
, State::Context::textures(textures)                        //Linea 324
, State::Context::fonts(fonts)
, State::Context::player(player)
{

}

State::State(StateStack& stack, State::Context context)
//Lista de inicialización 2, llama al constructor de Contexto
: mContext(State::Context(*(context.window),*(context.textures),*(context.fonts),*(context.player)))
{

}


Según lo que tengo entendido, la lista de inicialización del contructor de Context debería estar correcta, pero ambas en conjuntos me entra la duda. Podría alguien decirme donde está el error en las listas de inicialización, o si debo utilizar otra forma para resolver el problema?

Muchas gracias de antemano.
#5
Estoy seguro que el error debe ser muy evidente, así que pido disculpas de antemano por preguntar algo tan básico.

Lo que sucede, es que tengo una clase y una estrucura:

class MyClass
{
public:
void onCommand(const [b]Command[/b]& command, sf::Time dt);
};

struct Command
{
std::function<void([b]SceneNode[/b]&, sf::Time)> action;
unsigned int category;
};


Y si las escribo de esta forma en mi codigo, me da el siguiente error:

|157|error: 'Command' does not name a type|

Supuse que haciendo el orden contrario obtendría un error similar, así que declaré la estructura al inicio del código para señalarle al código que mi estructura si existía en algún lado. Entonces lo escribí de esta forma:


struct Command;

class MyClase
{
public:
void onCommand(const [b]Command[/b]& command, sf::Time dt);
};

struct Command
{
std::function<void([b]SceneNode[/b]&, sf::Time)> action;
unsigned int category;
};


Por lo que conseguí repararlo.

Pero ahora, la función onCommand me da error al llamar a command.category:

void SceneNode::onCommand(const Command& command, sf::Time dt)
{
   [b]command.category;[/b]
}


Acaso tambien debo declarar esta variable de mi estructura al comienzo del código? Si tuviera muchas variables deberái declararlas todas? Hay alguna otra solución.

Muchas gracias de antemano, espero que se haya entendido el problema.

Saludos.
#6
Hola ! Estoy estudiándome un libro, y de repente me aparece una función del tipo como señalé más arriba como método de una clase.

Y ya me ha aparecido unas 3 veces, así que supongo que debe ser importante. Podría alguien decirme que significa el 'const' a la derecha de la declaración de la función, así como también aparece en su definición?

return_type funtion(type arg) const;

Gracias de antemano.
#7
Bueno, primero les comento lo que busco.

Quiero crear un juego aventura/rpg en 2D. Para ello, he aprendido C++ a fondo, anteriormente ya conocía python, por lo que tengo mucho conocimiento sobre programación y sobre como llevar a cabo un buen código (o al menos eso creo).

El juego que quiero crear quiero que sea similar al Ragnarok Battle Offline en lo que es gráfica: [youtube=640,360]https://www.youtube.com/watch?v=aIoAwqUJqJs[/youtube]

Pero, donde puedo aprender a programar la animación?, los movimientos de personajes, efectos, todo lo que tiene que ver con gráfica en 2D?
Tengo conocimiento de estructura de datos, string, I/O, vectores, etc, etc, todo lo que corresponde a programación en si en c++. Quiero aprender programación gráfica (quiero empezar con SFML). Pero tengo entendido que esta libreria solo me da herramientas para llevar a cabo la parte gráfica de mi juego, pero por ejemplo, cómo puedo aprender la forma correcta de ejercer una animación eficiente en mi juego (con animación me refiero, a que mi personaje tenga una imagen distinta para atacar, caminar, saltar, recibir daño, etc). Claro, es parte de lo que yo mismo debo aprender a programar como programador, de hecho, actualmente tengo muchas ideas en mi cabeza de como hacerlo, pero me gustaría algun documento que me enseñe la forma correcta, para partir bien desde el comienzo y poder ir complementándolo luego, evitando un mal código.

Muchas gracias de antemano.