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ú

Mensajes - Desiresportal

#41
La cuestion es: ¿se puede programar juegos que utilicen directX en codeblocks?

He encontrado algo pero no veo que me sirva de mucho. (https://www.youtube.com/watch?v=IqIiYDXFAtk)

Por lo que veo en el video se puede usar directX en codeblocks, pero entiendo que se utiliza software que no es de microsoft (lo digo por el programa que se descarga en el video). ¿Esto puede suponer algun problema para hacer juegos comerciales?

Tampoco encuentro tutoriales de programacion en directX en castellano. ¿Alguna sugerencia?

Otra cuestion que me surge es... ¿se pueden combinar DirectX y OpenGL en un mismo juego y que el usuario pueda elegir cual usar? He visto que hay juegos que permiten elegir el motor grafico a utilizar, pero me pregunto si se puede hacer eso en codeblocks.

He buscado y todo lo que he encontrado era para visualStudio o dev-c++. Me gustaría no tener que cambiar de programa para desarrollar mis juegos.

Gracias de antemano.
#42
Lo cierto es que al final me decanté por utilizar la funcion "display" para hacer ambos procesos. Primero "act" y despues "paint". Y utilizo la funcion "idle" de OpenGL para que se produzca la animacion cuando el usuario no pulsa nada.

Doy por cerrado el tema. Y gracias por la ayuda.
#43
Programación General / Re: Movimiento local 3D
17 Febrero 2016, 19:20 PM
Uff... ahora mismo ando algo perdido de tiempo, pero cuando pueda trataré de ponerlo en practica.

Gracias por la explicación. Si que es largo el proceso, pero una vez que se tiene hecho es solo copiar y pegar. Y si se entiende el proceso es fácil modificarlo para ajustarlo a las nuevas necesidades.

Si me surge alguna duda mas, preguntaré aquí mismo.

Gracias de nuevo.
#44
Programación General / Re: Movimiento local 3D
9 Febrero 2016, 18:29 PM
A ver. Vayamos por puntos.

Cuando dices "arbitrario" en una matriz, ¿te refieres a valores que puedo cambiar y valores que no? ¿O te refieres a valores que son aleatorios? Como me digas que son valores aleatorios me quedo peor que antes.

Por otra parte, yo utilizo "glTranslatef()" y "glRotatef()" para mover el centro del objeto que voy a dibujar. Despues dibujo los vertices y elimino las transformaciones realizadas. Para ser mas concretos lo hago con el siguiente orden:

glTranslatef(objPruebas1.x, objPruebas1.y, objPruebas1.z);

glRotatef(objPruebas1.rotX, 1.0, 0.0, 0.0);
glRotatef(objPruebas1.rotY, 0.0, 1.0, 0.0);
glRotatef(objPruebas1.rotZ, 0.0, 0.0, 1.0);


En mi caso los objetos tienen tres floats de posicion y tres floats de rotacion indicados en grados, no en radianes. Para dibujar no hay problema, el problema son otras cosas que quiero desarrollar y que no puedo hasta no tener una funcion para movimientos locales 3D.

Y por ultimo, cosillas que no alcanzo a entender:
- ¿Cual es la diferencia entre "rotar eje" y "rotar cubo"?
- ¿El vector unitario debo calcularlo? ¿O ya lo tengo y aún no lo sé?


Las imagenes las tendiendo y es justo lo que busco conseguir. El problema es el codigo. Hasta hace algun tiempo para mi los vectores solamente eran arrays de datos donde acumular variables, objetos, enemigos,... Pero ahora me encuentro en la necesidad de entender las matematicas para manejarlos.


Me estoy haciendo un lio con el "pseudocodigo" ese. Ponme un codigo para esto y ya trataré de entenderlo despues (que es lo que he hecho mogollon de veces [no siempre, pero muchas veces]). ¿Que debería poner en donde tengo "#5248596GIRLEP"?

struct objType {

float posX;
float posY;
float posZ;

float rotX;
float rotY;
float rotZ;

objType();

};

objType::objType() {

posX = 0.0;
posY = 0.0;
PosZ = 0.0;

rotX = 0.0;
rotY = 0.0;
rotZ = 0.0;

}

objType movimientoLocal(float XOrigen = 0.0, float YOrigen = 0.0, float ZOrigen = 0.0, float rotX = 0.0, float rotY = 0.0, float rotZ = 0.0, float desplazamientoX = 0.0, float desplazamientoY = 0.0, float desplazamientoZ = 0.0) {
objType tempObj;

/*
¿Cual es el codigo que debería poner aqui?
#5248596GIRLEP (Esto tan extraño es como referencia, nada mas.)
*/

tempObj.rotX = rotX;
tempObj.rotY = rotY;
tempObj.rotZ = rotZ;

return tempObj;
}

objType objPruebas;

int main() {

objPruebas.rotX = 154.2;
objPruebas.rotY = 362.4;
objPruebas.rotZ = 15.7;
objPruebas = movimientoLocal(objPruebas.posX, objPruebas.posY, objPruebas.posZ, objPruebas.rotX, objPruebas.rotY, objPruebas.rotZ, 1.2, 0.0, 0.0);

cout << "La posicion del objeto es: {" << objPruebas.posX << "," << objPruebas.posY << "," << objPruebas.posZ << "}" << endl;

return 0;
}


Como se puede ver he puesto tres ejes de desplazamiento. Esto se debe a que aveces puede ser util un eje u otro dependiendo de como este distribuida la malla del objeto. Aveces el eje X del objeto puede representar el adelante y atrás ("+X" y "-X") de este. Otras veces puede ser el eje Z ("+Z" y "-Z"). Es por tener a mano un código mas polivalente.

También es evidente que podría pasar el objeto por referencia e indicarle los valores de desplazamiento para ahorrarme pasar tantas variables, pero no sería tan polivalente. También habría que evitar que la función utilizase la estructura del objeto en cuestión, pero para el ejemplo es lo de menos. Ya me encargaré después de adecuarla a cada necesidad que me surja.

Como referencia, yo me sé manejar con el logic brick de desplazamiento de Blender. Es por eso que me gustaría tener una función similar en C++ (pero en otros lenguajes también me puede ser útil para el futuro).
#45
Programación General / Re: Movimiento local 3D
5 Febrero 2016, 16:23 PM
Si la verdad es que buscaba la rotacion de los tres ejes a mano para hacer mas cosas que simplemente el movimiento. Por supuesto utilizo "glRotatef()" para posicionar los objetos en su sitio y con su orientacion, pero necesito obtener el resultado del calculo hecho a mano para otras tareas del juego.

¿Se puede obtener de OpenGL la posicion de un objeto? Es decir, si sé que OpenGL puede rotar los objetos por mi, desplazarlos en cierto eje (del objeto, no de los ejes globales) y devolverme sus nuevas posiciones, lo haría mucho mas facil y seguramente mucho mas rapido.

Con dos angulos lo he logrado hacer perfecto, pero con el tercer angulo es donde se tuerce todo. La cuestion es que necesito utilizar los 3 ejes de rotacion.

Me guardo la pagina del enlace, pero ahora mismo no entiendo ni papa. Lo cierto es que a mi las matematicas avanzadas, poco. Soy mas de calculos sencillos. Tengo entendido que para el proceso que busco hay que tener minimo matematicas de bachiller. Justo donde no he llegado. Y el ingles no domino nada. Como mucho los lenguajes de programacion y palabras sueltas.

Muchas gracias por la respuesta. Intentaré hacer algo con ello este finde. El lunes comento.
#46
Programación General / Movimiento local 3D
4 Febrero 2016, 18:08 PM
Estoy buscando la forma de hacer que un cubo 3D de mueva sobre su eje X aun habiendolo rotado en todos sus ejes. Me esta siendo imposible encontrar algo util al respecto y me estoy empezando a hartar de no poder avanzar en mis videojuegos.

He visto que hay mucha teoria, pero no veo nadie que explique como aplicarlo sobre un objeto. He llegado a intentarlo con una formula que devuelve esta matriz: "[[1,0,0],[0,1,0],[0,0,1]]". Evidentemente los valores de esta matriz son el resultado de un objeto cuyos angulos son 0.

Mi pregunta es: ¿Como hago que un cubo se mueva sobre su eje X si su orientacion sobre sus ejes X, Y y Z no son igual a 0?

Se que para movimientos en mundos 2D se utiliza "X += cos(angulo_en_radianes)*desplazamiento" y "Y += sin(angulo_en_radianes)*desplazamiento". Pero en mundos 3D es mucho mas complejo y no llego a entenderlo del todo.
#47
Esperaba poder usar un comando de C++ para esta tarea. Según un libro que encontré en la biblioteca (algo antiguo, la verdad) para C# o turboC existe un comando que lo hace automaticamente.

Me parece que haré mi propio interprete. Gracias por todo. Doy el tema por cerrado.
#48

Cita de: MAFUS en 18 Diciembre 2015, 20:48 PM
Supongo a que te refieres a que buscas algo como un intérprete de C++. Buscando un poco por internet he encontrado lo siguiente CLIN que es un intérprete de c++, en el sabor de CLAN.
Si quieres algo más tradicional te puedes decantar por make, CMake, o algún IDE que usa esta tecnología. Tal vez te guste QT creator.

Por lo poco que he podido enterarme gracias al traductor, CLING es como una consola CMD pero que interpreta comandos de C++. Y no es lo que yo buscaba.


Cita de: ivancea96 en 18 Diciembre 2015, 23:19 PM
Si divides el código en diferentes archivos, o elaboras librerías, solo se debieran recompilar los archivos modificados. Luego, solo actuaría el linker para unir los códigos objeto (salvo que usaras librerías de enlace dinámico)

Hasta esta parte ya llego. Entiendo como funciona la inclusion de librerías (archivos que por lo general terminan en ".h").

Volveré a exponer lo que busco:

Digamos que tengo un motor de juegos ya compilado y un archivo de texto en la misma carpeta. Entonces quiero que al ejecutar el motor de juegos, este abra el archivo de texto e interprete su contenido. Preferiblemente me encantaría que el contenido fuese codigo en C++.

Lo que quiero con esto es modificar solamente el archivo de texto para terminar modificando el juego. Así no tendría que pasar por el compilado cada vez que quiera cambiar algo.

En resumen: Ejecuto el juego, el juego lee el txt, interpreta el contenido y modifica su funcionamiento en base al contenido. Tal y como hacen los navegadores con el contenido de una pagina web.
#49
Muy buenas:

He buscado al respecto y parece que solo existe para turboC o algo similar. Me preguntaba... ¿tambien habrá para C o C++?

Vereís, es que empiezo a estar harto de tener que compilar todo el codigo para cuando solamente hago un pequeño cambio. Cuando el codigo son tres sentencias no hay problema, se compila muy rapido. Pero cuando el codigo se hace algo largo, la espera por un cambio casi ridiculo se hace mas bien insoportable.

Es por eso que tengo la duda: ¿Se puede hacer que el programa tome el codigo de un fichero de texto plano y lo interprete al momento? Tambien me sirve que lo compile de forma temporal mientras el programa esté en marcha. La idea es modificar el codigo del archivo de texto plano y que directamente (con previo guardado de los cambios y reinicio del programa) surtan efecto los cambios realizados.

Pues eso es todo por ahora. Muchas gracias de antemano.
#50
Programación C/C++ / Re: Graficos con C++
2 Noviembre 2015, 20:31 PM
Gracias por la respuesta. He buscado informacion al respecto y me parece que ya he encontrado lo que necesitaba para medir el "elapsed_time" que tenía con GLUT.

Ahora con el tema de los graficos, he buscado y me he encontrado con la API de Widnows para los graficos 2D. Con la API de windows he conseguido dibujar pixel por pixel en pantalla sin necesidad de ninguna librería aparte. Por ahora la jugabilidad es nula y el renderizado es lento, pero de momento puedo empezar a hacer mis propias funciones de dibujado. No serán muy inovadoras, cometeré graves errores por el camino,... pero me lo pasaré bien aprendiendo las dificultades que conlleva.

Duda: He hecho las letras "A", "B" y "C" en una matriz multidimensional y las he volcado sobre un buffer (otra matriz multidimensional). Despues el buffer se muestra en pantalla. La representacion del buffer es totalmente correcta. Las letras de dibujan bien, pero cuando de dibujan del reves. Mi pregunta es: si la matriz de las letras se organiza de forma X, Y, ¿por que para dibujar sobre el buffer (X,Y) es necesario que se lea la letra de forma inversa (Y,X)?

Codigo de ejemplo:

bool defaultEngineFont[255][5][5]; // [Letra][Ancho][Alto] La fuente por defecto es de letras de 5*5.

void loadDefaultFont() {
// Esta funcion inicializa la fuente por defecto.

// Los pixeles deberían dibujarse de izquierda a derecha y de arriba hacia abajo. Teniendo prioridad de izquierda a derecha. Es decir, primero los X y despues los Y.

// De momento solo 3 letras. Y partiendo de "A" (ASCII 97).

// A
defaultEngineFont[0][0][1] = true;
defaultEngineFont[0][1][0] = true;
defaultEngineFont[0][1][2] = true;
defaultEngineFont[0][2][0] = true;
defaultEngineFont[0][2][2] = true;
defaultEngineFont[0][3][0] = true;
defaultEngineFont[0][3][1] = true;
defaultEngineFont[0][3][2] = true;
defaultEngineFont[0][4][0] = true;
defaultEngineFont[0][4][2] = true;
// B
defaultEngineFont[1][0][0] = true;
defaultEngineFont[1][0][1] = true;
defaultEngineFont[1][0][2] = true;
defaultEngineFont[1][1][0] = true;
defaultEngineFont[1][1][3] = true;
defaultEngineFont[1][2][0] = true;
defaultEngineFont[1][2][1] = true;
defaultEngineFont[1][2][2] = true;
defaultEngineFont[1][3][0] = true;
defaultEngineFont[1][3][3] = true;
defaultEngineFont[1][4][0] = true;
defaultEngineFont[1][4][1] = true;
defaultEngineFont[1][4][2] = true;
// C
defaultEngineFont[2][0][1] = true;
defaultEngineFont[2][0][2] = true;
defaultEngineFont[2][1][0] = true;
defaultEngineFont[2][1][3] = true;
defaultEngineFont[2][2][0] = true;
defaultEngineFont[2][3][0] = true;
defaultEngineFont[2][3][3] = true;
defaultEngineFont[2][4][1] = true;
defaultEngineFont[2][4][2] = true;
}

void drawText(string tempString = "", int x = 0, int y = 0, int r = 0, int g = 0, int b = 0, int tempBuffer[WINDOW_WIDTH][WINDOW_HEGHT][WINDOW_COMP] = engineScreenBuffer) {
if (tempString.size() > 0) {
if (WINDOW_COMP >= 3) {
for (int i=tempString.size() - 1; i >= 0; i--) {
cout << tempString[i] << " = " << int(tempString[i]) << endl;
// Sé que las letras son de 5*5. Gracias a eso sé los limites de cada letra y el limite de los "for".
for (int fory=4;0 <= fory;fory--) {
for (int forx=4; 0 <= forx; forx--) {
//cout << "forX: " << forx << endl;
if (defaultEngineFont[tempString[i] - 97][fory][forx]) {
// Añado un if para evitar el "overflow".
if (x + forx + (i*5) <= WINDOW_WIDTH && x + forx + (i*5) >= 0 && y+fory <= WINDOW_HEGHT && y+fory >= 0) {
tempBuffer[x + forx + (i*5)][y+fory][0] = r;
tempBuffer[x + forx + (i*5)][y+fory][1] = g;
tempBuffer[x + forx + (i*5)][y+fory][2] = b;
}
}
}
}
}
}
else {
cout << "De momento la funcion \"drawText()\" solo funciona con 3 componentes o mas." << endl;
}
}
}


Mi preocupacion es la linea "if (defaultEngineFont[tempString - 97][fory][forx]) {". Ese "forx" cuando debería ser el "fory" y viceversa... no me gusta.

Como ya he comentado, el buffer se muestra correctamente en pantalla. Si en el buffer X es 10, en la pantalla es el pixel 11 (Las matrices empiezan por 0 y los pixeles los contamos a partir del 1). Con el Y del buffer igual de bien.

A ver, que ahora dibuja bien. Yo solo quiero entender por que se produce algo tan raro. Para no tirarme de los pelos la proxima vez.

Muchas gracias de antemano. Y sigo esperando respuesta para dibujar directamente sobre la memoria grafica. Hasta otra.


PD: Olvidalo, olvidalo, olvidalo,... Ya he encontrado el problema. Yo. Me he confundido al poner en "true" los puntos de la matriz de las letras. Me he equivocado en las coordenadas. Cuando lo he escrito he pensado "linea 1 bloque 3 eso significa que X=0, Y=2". Tenia que ser al reves. X=2, Y=0. Fallo mio. Menos mal. Casi que me alegro de saberlo. Hasta otra.