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 - Desiresportal

#1
Buenas.

He estado programando un visualizador de imagenes muy simple usando WINAPI, stb_image.h y (en la ultima version) OpenGL.

Mi codigo parte de este que encontre aqui: https://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/

El caso es que usando unicamente WINAPI el programa sufre unos FPS terribles. Con OpenGL los FPS aumentan ligeramente, pero sigue ser fluido.

He notado que otros programas no usan ni el 5% de CPU. Tal vez el 5% de un unico nucleo. Pero mi programa se come el 25% de la CPU (Core i5 9400f). El 100% de un nucleo.

Y cuando me ha dado por mirar el rendimiento del programa en el que me basaba para hacer el mio (el del link de arriba), la CPU hace exactamente lo mismo. Y lo mejor, la grafica (ASUS RX570 ROG Strix 8GB OC) se pone al 100% para dibujar unicamente un punto en pantalla.  :xD

Por lo que veo hasta mi antiguo motor de juegos basado en OpenGL (estoy en proceso de actualizarlo para usar GLSL y mas adelante Vulkan) me dispara el consumo de CPU.

Pues eso. Que no sé por donde tirar. ¿Como reduzco el consumo de CPU de mi programa?

Toda ayuda es bienvenida.

PD: No sé manejar multihilos (aun), así que si podemos descartarlo como parte de la solucion, mejor.
#2
Programación C/C++ / Punteros en estructuras
31 Octubre 2019, 18:27 PM
Estoy desarrollando alguna cosilla y utilizo una estructura similar a la siguiente para almacenar y manejar datos en binario.

Código (cpp) [Seleccionar]

struct datos {
void *data;
unsigned int length;

datos();
void operator=(datos rDatos);
~datos();
}

datos::datos() {
data = NULL;
length = 0;
}

void datos::operator=(datos rDatos) {
if (rDatos.length > 0 && rDatos.data != NULL) {
length = rDatos.length;
data = new unsigned char[length];
if (data != NULL) {
for (unsigned int a=0; a<length; a++) {
((unsigned char *)data)[a] = ((unsigned char *)rDatos.data)[a];
}
}
}
}

datos::~datos() {
if (data != NULL) {
delete[] (unsigned char *)data;
}
}


Si hago algo como lo siguiente, se me cierra el programa con un error.

Código (cpp) [Seleccionar]

datos miVariable;

// Despues de ponerle datos a la variable....

miFuncion(miVariable);


El caso es que he visto que el problema desaparece cuando el destructor de la estructura no elimina el buffer de datos. Y eso me va a llevar inevitablemente a llenar la memoria. O sino, me lleva a estar pendiente de liberar la memoria en cada programa que haga uso de mi pequeña libreria.

¿Porque ocurre esto? ¿Como puedo hacer correctamente el operador de copia y el destructor de la estructura para manejarlo como una variable mas? (O al menos como un string, por ejemplo)

Muchas gracias por adelantado.
#3
Muy buenas a todos.

Estoy teniendo un problemilla tecnico con un programa (mas bien libreria) que estoy haciendo. Intento poder elegir los altavoces (o auriculares) por los que emito los sonidos.

OpenAL puede abrir el dispositivo de salida por defecto cuando se lo pido a él usando "alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER)". Sin embargo, cuando obtengo el nombre del dispositivo con WinAPI y se lo paso a OpenAL para que abra ese, no lo hace.

¿Porque? No lo sé. Solo sé que el dispositivo por defecto OpenAL dice llamarlo como "Generic Hardware".

Os pongo un codigo de ejemplo para que veais el proceso que sigo y me digais como hacer que OpenAL me saque el sonido por el dispositivo de salida que elija yo.



#include <windows.h>
#include <AL/al.h>
#include <AL/alc.h>
#include <iostream>
using namespace std;

int main() {
int speakerID = 0;

WAVEOUTCAPSA outCaps;
waveOutGetDevCaps(speakerID, &outCaps, sizeof(WAVEOUTCAPSA));

ALCdevice speaker = alcOpenDevice(outCaps.szPname);

if (speaker == NULL) {
cout << "No se ha podido abrir el dispositivo de salida indicado." << endl;
}

return 0;
}



Sé que la funcion "waveOutGetDevCaps()" me devuelve un nombre supuestamente valido porque es el mismo que me da un programa de karaoke.

Ademas, ya tengo desarrollada la parte del uso del microfono y funciona correctamente usando el mismo procedimiento pero con sus respectivas funciones.

¿Que hago mal? ¿Tengo que incluir alguna DLL para que el programa funcione correctamente? (Por ahora solo uso "OpenAL.dll" y "wrap_oal.dll".) ¿Estar usando un ordenador portatil puede ser un problema? (Lo digo por el uso de altavoces u auriculares.)

Un saludo y gracias de antemano.
#4
He terminado un programa y me he topado con un par de bugs.

Uno de ellos tiene que ver con obtener el tamaño de un archivo. Utilizo el siguiente codigo para obtener el tamaño del archivo:

Código (cpp) [Seleccionar]


#define __USE_FILE_OFFSET64
#define __USE_LARGEFILE64
#define __USE_LARGEFILE

// Mucho codigo despues...

unsigned int getFileSize(string fileName) {
    unsigned int tempReturn = 0;

    FILE *temp = fopen64(fileName.c_str(), "rb");

    if (temp != NULL) {
        feeko64(temp, 0, SEEK_END);
        tempReturn = ftello64(temp);
        fclose(temp);
    }

    return tempReturn;
}



El caso es que pese a usar "fopen64()" e incluir los "#define" para usar archivos largos, no supera los 2GB. Estoy haciendo pruebas con un archivo de 2,7GB y me dice que el tamaño es de 2GB.

¿Alguna idea de como puedo solucionarlo?

Lo incluyo todo correctamente y el compilador no me da ningun error. ¿Tendría que añadir algun parametro mas a la orden de compilado?

Uso ubuntu y codeblocks. Supongo que esto es portable a Windows y para mi proximo proyecto necesito dejarlo zanjado porque lo desarrollaré para ambos sistemas operativos.
#5
Despues de haberlo abandonado al olvido cuando adquirí un portatil mas potente hace ya años, me acordé hace tan solo unos dias de que tenía por casa una maquina de consumo electrico relativamente bajo.

Hace unas semanas terminé escribiendo un programa que no requiere potencia, sino tiempo para llevar a cabo sus tareas. Fue entonces, cuando buscando la forma de dejar funcionando el programa durante horas con el menor consumo electrico posible, recordé tener a mano algo similar a una raspberry pi.

Esta maquina se le parece bastante en especificaciones si no contamos con pantalla, teclado, touchpad, bateria....

El caso es que despues de mas de 5 años el fabricante ya no parece darle soporte. Cuando ejecuto un "sudo apt-get update" me aparecen un porron de alertas diciendo que no puede descargar los paquetes desde una web que tiene pinta de ser del fabricante. Eso claramente es un problemon.

Aparte de intentar instalar el compilador g++ y no conseguirlo, he conseguido compilar en otra maquina el programa para este portatil y que "funcione". El tema es que ahora me aparece como que no tengo instalado el paquete "libstdc++6". Lo he intentado instalar y nada. Me dice que no hay nada que descargar ni instalar.

Hasta ahora he manejado varias opciones que no consigo saber como llevarlas a cabo y cada cual me gusta menos pero tiene pinta de que voy a tener que hacerlas para solucionar los problemas que se me presentan. ¿Que hago?
- Instalarle otro sistema operativo linux no tan capado como el que incluyó el fabricante.
- Cambiar las direcciones de busqueda de paquetes con "sudo apt-get install" para instalar desde las fuentes originales de linux.
- Solucionar solo los problemas que me presenta por ahora el sistema operativo capado y solucionar mas adelante los que se me vayan presentando.

Como comprendereis, prefiero instalar un sistema operativo linux sin limitaciones del fabricante para poder usar la maquina sin muchos mas problemas en el futuro.

¿Me podeis ayudar? ¿Que debería hacer? ¿Por donde debería empezar?

Ya intenté instalar una version de Ubuntu para ARM desde una tarjeta SD booteable. No conseguí nada. La maquina se apagaba automaticamente al no encontrar ningun sistema operativo para cargar.
#6
Estoy familiarizado con el comilador g++ que trae Ubuntu. Sé que puedo ejecutar un programa compilado con la terminal desde la propia terminal.

El caso es que lo quiero tener tan facil como hacer doble click. Por el programa que por fin he terminado, por el programa que estoy haciendo ahora y los programas que vaya a hacer en el futuro.

Sé que puedo hacerlo con g++. Compilar en la terminal y obtener un programa que se vé como un rombo morado es algo que hice a modo de pruebas y a dia de hoy no recuerdo cual fue la orden que utilice. Ni siquiera recuerdo donde encontré las instrucciones al respecto. Solo sé que no he vuelto a encontrarlo ni a compilarlo obteniendo un ejecutable con el icono del rombo morado.

¿Cual es el parametro que tengo que poner a g++ para que compile mi codigo C++ creandome un ejecutable que aparece como un rombo morado en el explorador de archivos? ¿Es indispensable hacer la compilacion en dos ordenes haciendo primero el archivo ".o"?

Por ahora solo son programas de consola. No sé si esto es un problema. ¿Puede que una actualizacion haya cambiado algo de g++ impidiendo hacer ejecutables tan facil como antes?
#7
Hace ya bastante tiempo desarrollé una version de pruebas de mi motor de juegos para Android. La idea era comprobar la viabilidad de desarrollar un motor de juegos en Android Studio cuyo funcionamiento fuese muy similar al que ya logré en C++ o en javascript.

Por supuesto encontré algunos obstaculos y algunas capacidades extra que por ejemplo javascript no me podía ofrecer (al menos en entorno web).

Una de las partes que me chocó fue hacer una funcion (o metodo) tan larga que me saltó el siguiente mensaje al compilarlo: "I/art: Method exceeds compiler instruction limit: 17940 in boolean miFuncion(int)". Al parecer no salta siempre. Solo cuando la funcion supera cierto punto en la ejecucion de sus instrucciones.

Al final el juego se ejecuta, pero hay ciertas instrucciones de la funcion que jamas llegarán a cumplir su objetivo. ¿Alguna sugerencia? ¿Alguna que no implique hacer un conjunto de funciones mas pequeñas y complicar mas aún el codigo fuente?

Supongo que se puede configurar el compilador para no tener ese limite ya que si se tratase de un error propiamente dicho ni siquiera me daría el juego compilado.

Debo añadir que en lugar de crear clases y metodos me lié a hacerlo todo con un solo script y como consecuencia tengo un codigo fuente de mas de 5000 lineas que a Android Studio le cuesta un poco procesar con un Core i3 para colorear las fuentes y demas. ¿Eso puede ser un problema? Aunque la programacion podría considerarse que no esta orientada a objetos, el funcionamiento del motor es simple ya que funciona casi como una maquina de estados. Me basé en OpenGL ya que así lo veia mas facil.

En resumen: me alarma mucho que una funcion larga impida el correcto funcionamiento del juego final. ¿Hay alguna forma de evitarlo? ¿Alguna que sea facil, no implique dividir la funcion en funciones mas pequeñas y que tampoco implique crear un proceso en segundo plano?

Un saludo y gracias.
#8
Buenos dias.

Estoy tratando de hacer un programa para conectarse a internet y recibir los datos de una URL por medio de los sockets. Todo programado a lo "bestia". (Usando los sockets directamente sin librerias que me lo faciliten)

El caso es que haciendo pruebas me he dado cuenta que el programa tarda muchisimo en darse cuenta que la conexion se ha perdido. Supongo que eso es bueno para conexiones lentas. Para que la espera prolongada de una respuesta con una conexion lenta no sea sinonimo de desconexion. Pero yo quiero que no tarde tanto. Sobre todo cuando descargo una pagina web desde una URL cuyo header no indica el tamaño de lo que va a descargar.

¿Como detecto la desconexion del socket o la perdida de la conexion del equipo a internet?

Para las pruebas uso ubuntu, programo en C++, uso el comando "select()" para usar sockets no bloqueantes (este comando es totalmente nuevo para mi) y uso el movil para dar wifi al portatil. Para forzar la perdida de conexion del programa apago la zona wifi del movil. Aún no he logrado que esta forma de forzar la desconexion haga que mi programa deje de intentar seguir recibiendo datos. (Lo he dejado en bucle con "select()" y un contador durante mas de 10 minutos. No se ha bloqueado, pero tampoco ha detectado la perdida de la conexion.)

Un saludo y gracias de antemano.
#9
Java / Duda: ¿Como hago esto en Java?
20 Diciembre 2017, 15:06 PM
Muy buenas.

Por la razón que sea he empezado a programar en Java y tengo una duda al respecto. En C++ podía hacer algo como lo siguiente para hacer una programación final mas adaptable:


Código (cpp) [Seleccionar]
// Codigo para usar como parte de una libreria

void (*funcionLibreria)(int value);

void asignarFuncionLibreria(void (*funcionAsignada)(int value)) {
funcionLibreria= funcionasignada;
}


// Codigo para desarrollar en un proyecto

void funcionDefinidaPorMi(int value) {
// Codigo de la funcion en cuestion.
}

// Algo de codigo despues...

funcionLibreria(5);



¿Como puedo hacer algo así en Java?

He buscado algo para Java, pero solo encuentro callbacks que me parecen mas difíciles de usar. Sino, lo único que encuentro es para javascript.

Quiero desarrollar una librería que ya sé que va a ser muy larga y rebuscar en el código Java para adaptarlo a cada proyecto me parece una locura.

Me sería de gran ayuda. Gracias de antemano.
#10
¿Cual es el codigo necesario para disponer de una funcion que lee varios argumentos? Tengo entendido que se puede llamar a funciones como "glutInitDisplayMode()" y que se pueden pasar varios argumentos separados por "|".

He buscado sobre el tema y he visto que en la definicion de la funcion el argumento es "unsigned int mode", pero no he encontrado nada mas. ¿Como hace la funcion para separar los argumentos que se le pasan? ¿Tiene algo que ver que los valores que recibe sean potencias de 2? (0,1,2,4,8,16,32,64,...)

No me urge, pero me gustaría entenderlo por si en un futuro me ayuda a reducir un codigo extenso.
#11
El tema es el siguiente: Me lie a hacer pruebas con un archivo PNG y ahora estoy casi a punto de escribir un programa para sacarles a los archivos PNG un array con el mapa de bits en él. Pero, ya que estoy, me he decidido a sacar los datos de mas tipos de archivos. El problema es que si el formato PNG ya era dificil, los demas formatos que tengo en mi lista son aún mas dificiles de encontrar.

¿Alguien me puede pasar enlaces a web que expliquen la estructura de los siguientes formatos?:
- TGA
- JPEG
- A (los archivos que utilizan los compiladores)
- LIB (tambien los archivos que utilizan los compiladores)
- MP3
- OGG
- MP4
- GIF
- DLL

Y ya puestos: ¿Algun enlace en el que se muestren ejemplos de como sacar los datos por medio de algun script?

He buscado en internet, y nada. He buscado en archivos de dichos formatos palabras clave que me ayudasen a buscar en internet, y nada. Estoy perdido en este tema. Sé que hay programas muy buenos que se pueden descargar y utilizar, pero me gusta entender lo que hay detras de estos programas y la mejor manera es hacerlos uno mismo.
#12
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.
#13
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.
#14
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.
#15
Programación C/C++ / Graficos con C++
7 Octubre 2015, 16:50 PM
Muy buenas. He estado buscando en internet y no encuentro nada util (o al menos actualizado) que solucione mi pequeño problema.

Actualmente utilizo la librería Glut para un proyecto que estoy desarrollando. Utilizo OpenGL para los graficos en tiempo real.

Hasta aqui todo bien.

Ahora empiezo a pensar que me gustaría hacer mi propia librería grafica. Pero tranquilidad, que solo para graficos 2D. Aunque tal vez en un futuro... Por ahora lo dejaré en graficos 2D.

El problema es que busco y busco como dibujar pixel por pixel pero no encuentro nada. Lo unico que encuentro son tutoriales que utilizan librerías como "graphics.h" o "dos.h" y su funcion "int86()". Personalmente prefiero la librería "dos.h", pero esperaba algo mas actualizado que este tutorial: http://www.miclase-online.com/tutoriales/computacion/programacion/proggraficac.pdf.

Lo que busco es mas bien algo como utilizar punteros y dibujar sobre la memoria grafica cambiando el valor almacenado. Por ejemplo: si el color negro fuese 0,0,0 y el blanco 255,255,255 para dibujar en rojo tendría que poner 255,0,0 en la posicion de memoria correcta. Al menos algo así tengo entendido con los buffers de memoria y los mapas de bits. Igual estoy completamente equivocado.

Por otra parte y ya que deseo eliminar la librería Glut de mi proyecto,.. ¿como obtengo el "elapsed time" sin usar Glut? ¿Se puede obtener utilizando la librería "time.h"? Si es así, ¿como? No me sirve eso de "se que el programa tarda 30 milisegundos entre frames y me dedico a hacer time+=30". No puedo saber el tiempo que tardará entre frames y necesito una precision de milisegundos.

El proyecto en el que estoy metido tiene dos partes y una de ellas no requiere utilizar graficos. Por eso me parece absurdo incluir Glut para obtener el "elapsed time".

Por ahora esas son mis dudas. Muchas gracias por adelantado.
#16
Pues eso, que tengo un problema con un programilla que estaba haciendo en C++.

La idea es un programa que elimina todos los comentarios de un codigo .js y los saltos de linea vacios. Se que estas cosas no afectan al rendimiento del juego o programa que contiene el codigo, pero a la hora de descargarlo tardará menos, serán menos megas en la tasa mensual y será un poquito mas rapida la carga del juego cuando se descarga la web.

Ademas, los comentarios solo me interesan a mi, no a los jugadores. Y los saltos de linea igual.

Ya que estaba haciendo el programa para suprimir parte del codigo me pregunté... ya que javascript tiene problemas para reconocer las tildes, eñes y caracteres "especiales"... ¿por que no hacer que los vaya sustituyendo según los encuentre? Al fin y al cabo una palabra con tilde solo se encuentra en el dialogo de personajes o en los comentarios y es un rollo cambiarlos manualmente todos. Y los comentarios serán borrados.

Pues aqui empieza el problemón.

Teniendo un archivo.js de referencia para pruebas:

apertura de exclamacion "¡"

a con tilde "á"
e con tilde "é"
i con tilde "í"
o con tilde "ó"
u con tilde "ú"

A con tilde "Á"
E con tilde "É"
I con tilde "Í"
O con tilde "Ó"
U con tilde "Ú"

ny "ñ"

NY "Ñ"


Y el siguiente codigo para el "depurador.cpp":

#include <iostream>
#include <windows.h>
#include<fstream>
using namespace std;

void buscar_y_reemplazar_todos(string& frase, string buscar, string reemplazar) {
int pos=frase.find(buscar);
while (pos!=string::npos) {
frase.replace(pos, buscar.size(), reemplazar);
pos=frase.find(buscar, pos + reemplazar.size());
}
}

void eliminar_desde(string& frase, string buscar) {
int pos=frase.find(buscar);
frase.replace(pos, (frase.size() - pos), "\n");
}

void eliminar_hasta(string& frase, string buscar) {
int pos=frase.find(buscar);
frase.replace(0, (pos + buscar.size()), "");
}

void eliminar_punto_punto(string& frase, string buscar_principio, string buscar_final) {
int pos_ini = frase.find(buscar_principio);
int pos_fin = frase.find(buscar_final);
frase.replace(pos_ini, ((pos_fin - pos_ini) +  buscar_final.size()), "");
}

int main() {
bool comentando=false, todo_correcto=false;
string linea, out_text, nombre_fichero;
ifstream archivo;
getline(cin, nombre_fichero);
buscar_y_reemplazar_todos(nombre_fichero, "\n", "");
while (!todo_correcto) {
archivo.open(nombre_fichero.c_str());
if (archivo.is_open()) {
getline(archivo, linea);
while (!archivo.eof()) {
//Añado el final de linea para no tener errores.
linea = linea + "\n";
//Eliminar tabulaciones
buscar_y_reemplazar_todos(linea, "\t", "");
//Sustituir las letras especiales por sus correcciones para javascript
buscar_y_reemplazar_todos(linea, "á", "\\xE1");
buscar_y_reemplazar_todos(linea, "é", "\\xE9");
buscar_y_reemplazar_todos(linea, "í", "\\xED");
buscar_y_reemplazar_todos(linea, "ó", "\\xF3");
buscar_y_reemplazar_todos(linea, "ú", "\\xFA");
buscar_y_reemplazar_todos(linea, "ñ", "\\xF1");
buscar_y_reemplazar_todos(linea, "Á", "\\xC1");
buscar_y_reemplazar_todos(linea, "É", "\\xC9");
buscar_y_reemplazar_todos(linea, "Í", "\\xCD");
buscar_y_reemplazar_todos(linea, "Ó", "\\xD3");
buscar_y_reemplazar_todos(linea, "Ú", "\\xDA");
buscar_y_reemplazar_todos(linea, "Ñ", "\\xD1");
buscar_y_reemplazar_todos(linea, "¿", "\\xBF");
buscar_y_reemplazar_todos(linea, "¡", "\\xA1");

//Si no existe "function" ni "else if" en la linea actual, eliminar espacios (en python no hay nada al respecto, pero puede ayudar)
/*if (linea.find("function") == string::npos && linea.find("else if") == string::npos && linea.find("var ") == string::npos) {
buscar_y_reemplazar_todos(linea, " ", "");
}*/
if ((linea!="\n") && (linea.find("/*")==string::npos) && (comentando==false) && (linea.find("*/")==string::npos)) {
if (linea.find("//")!=string::npos) {
//Parto la cadena en dos en la subcadena "//"
eliminar_desde(linea, "//");
//Sumo "\n" a la primera parte de la cadena recien partida
}
if (linea!="\n") {
//Se aplica el contenido de la linea a la salida
out_text = out_text + linea;
}
}
if (linea.find("/*")!=string::npos && linea.find("*/")!=string::npos) {
//Quedaria especificar el caso pero aqui habria un comentario que eliminar. En python se dejaba y se advertía de la linea en la que estaba para eliminarlo manualmente.
//Las posibilidades son:
// - Principio-Final
// - Medio-Final
// - Principio-Medio
while (!(linea.find("/*")!=string::npos && linea.find("*/")!=string::npos)) {
eliminar_punto_punto(linea, "/*", "*/");
}
}
else if (linea.find("/*")!=string::npos) {
//Habría que ver si tiene codigo antes (por si acaso)
if (linea.find("/*")!= 0) {
eliminar_desde(linea, "/*");
out_text = out_text + linea;
}
comentando=true;
}
else if (linea.find("*/")!=string::npos) {
//Habría que ver si tiene codigo despues (por si acaso)
eliminar_hasta(linea, "*/");
out_text = out_text + linea;
comentando=false;
}
getline(archivo, linea);
}
out_text = out_text + linea;

//buscar_y_reemplazar_todos(linea, "¡", "\\xA1");
archivo.close();

if (out_text.find("") == string::npos && out_text.find("Ã") == string::npos && out_text.find("š") == string::npos && out_text.find("‰") == string::npos) {
ofstream archivo2;
//if (archivo2.is_open()) {
archivo2.open(nombre_fichero.c_str());
archivo2 << out_text;
archivo2.close();
cout << "Parece que todo ha salido bien." << endl;
todo_correcto = true;
system("pause");
//}
//else {
//cout << "Ha habido un error al escribir el archivo." << endl;
//system("pause");
//}
}
else {
cout << "Error de traduccion. Volviendo a intentarlo..." << endl;
out_text="";
}
}
else {
system("color 0c");
cout << "Ha habido un error." << endl;
todo_correcto = true;
system("pause");
}
}
return 0;
}



Me encuentro con algunos errores un poco inquietantes. Si ejecuto una vez el depurador puede que lo haga bien. Pero la siguiente ejecucion aparecen caracteres erroneos en el archivo.js. Sustituye bien los caracteres y no hay problema a la hora de escribirlo en el fichero. El problema es que en la orden string.replace("blablabla"); pone por delante algo como "Ã", "", "‰" o "š". Pero no siempre.

Lo que me deja perplejo es que a diferentes ejecuciones, diferentes resultados. Y es como si llevase la cuenta. Si no le dejo escribirlo en el archivo.js, como que no esta contento por que a la proxima ejecucion sigue haciendolo mal. (en este codigo se queda clavado en errores, de hay que sepa que lo hace mal y no vuelve a hacerlo bien nunca. [aúnque reinicie el equipo, sigue hacendolo mal.])

En fin. ¿Alguien que pueda revisar el codigo y aclararme la equivocacion?

Por si tiene algo que ver... uso windows 7 64bit, CodeBlocks 13.12 y el codigo tal cual lo veis.

Un saludo y gracias.

Agradecería tambien que quien responda, se suscriba o siga este tema por si me surgen mas dudas. (ha habido veces que alguien responde y no vuelve a pasar nunca para ver si existen mas cuestiones o ver si realmente ha servido de algo.)

PD: También lo hice en python, pero como que las "\" no deja meterlas bien en los strings.
#17
Muy buenas!:

He estado buscando y no encuentro lo que yo busco.

Tengo cierta experiencia programando juegos en Blender. Mientras aprendía a programar para Blender en python, toque Python (lo que viene siendo el programa en consola) y PyGame. Despues aprendí a programar en PHP y javascript en un curso. Despues pude aplicar lo aprendido de javascript para aprender Canvas. (para quien no sepa: lo que aprendí de canvas es mostrar imagenes. Lo demas realmente no es mas que javascript puro y duro.) Y ahora estoy a tope con C++.

Estoy viendo cosillas. Mirando por un lado y por otro. Aún no consigo nada realmente extraordinario o medianamente bueno como para estar orgulloso, y ya estoy buscando como hacer un juego.

El caso es: En los juegos que he echo en javascript funcionan de la siguiente forma:

Una funcion run() llama a Act(), Paint() y run() (si se llama a sí misma). Esta ultima pasados 0.017s.

Al llamarse a si misma en ese intervalo de tiempo se obtiene el bucle que engloba al juego.

Despues en Act() se hacen los calculos con las teclas que se pulsan y se dejan de pulsar.
Y por ultimo Paint() muestra el estado actual de los calculos de forma visual al jugador (dibujando el cubito en player.x=25 o player.x=500).

Busco hacer juegos a base de puro codigo. Nada de usar motores externos que despues dan errores que no tienen nada que ver con mi codigo. (Eso mismo me paso con Blender y por eso lo dejé de lado.)

Lo que quiero saber es: ¿Hay algo como el run() que acabo de explicar? ¿Se puede hacer en C++ que una funcion se llame a sí misma al cabo de X segundos o milisegundos sin que en ningún momento el programa quede como "no responde"? ¿Como lo hago exactamente? (se coger las teclas pulsadas y el ratón con OpenGL [mas o menos...])

(lo ideal como respuesta es: sentencia(parametros), forma de uso de la sentencia, librería necesaria para usarla y tipos de los parametros [int, double, char, string, boolean, matriz, tupla].)

Datos extra por si falta informacion:
- Utilizo Codeblocks 13.12.
- Sigo los tutoriales de minidosis.org.
- Tengo windows 7 64 bits.
- Estoy enfocado a usar OpenGL. (Por cabezonería. No pienso en hacer juegos DirectX.)
- Ya tengo todo lo necesario para correr OpenGL. (he echo pruebas)

Ejemplos de juegos que he echo en javascript: http://desiresportal.esy.es/juegos/