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

#51
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.
#52
El problema persiste.

Buscare acerca de "wstring"...
#53
Aún no controlo mucho C++. Estoy aprendiendo. Gracias por la aclaración. Voy a intentar hacerlo con vectores (que acabo de aprender a usarlos en C++).

Haré lo siguiente:
- Voy a leer el fichero linea a linea.
- Deshacer las lineas letra a letra.
- Transformar las letras en enteros.
- Colocar los enteros en vectores.
- Si existen coincidencias: sustituir los enteros existentes por los enteros de los caracteres que quiero que salgan.
- Transformar los enteros en caracteres.
- Meter carácter por carácter en el fichero.

A ver si así lo consigo sacar... ya contaré. Si con el script anterior, una de cada dos salía correctamente como yo quería... esto tendrá que funcionar por huevos. Es pura lógica. Poder puede (por que alguna vez ha salido [insisto]), pero por alguna razón (seguro que la que tu decías) no hace lo siempre bien.


(Seguro que para el Lunes lo tengo comprobado) Ya contaré... Gracias de nuevo por la colaboración.
#54
Uff. Me sigue dando el mismo error.

El problema es en la orden "string.replace()". A partir de hay el codigo comprueba si se ha echo bien, de lo contrario vuelve a empezar. Y ahí es donde entra en bucle. Vuelve a empezar, no lo hace bien, ve que no lo ha echo bien, vuelve a empezar, no lo hace bien, ve que no lo ha echo bien, vuelve a empezar, no lo hace bien, ve que no lo ha echo bien, vuelve a empezar...

No se trata de mostrar en consola, se trata de reescribir el fichero. Pero aún así el error se produce en la sentencia "string.replace()".

Gracias de todos modos. Seguro que en el futuro esta parte tambien me sirve.
#55
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.
#56
¿Y no hay algo como el "window.setTimeout(run(), 17);" de javascript pero para C++?

Ademas en javascript la "rellamada" de run() se hace antes de Act() y Paint() para que se hagan 60fps lo mas reales posibles. Sino tardaría 17 milisegundos despues de calcularlo y dibujarlo todo.

Mejor se hace antes y si ha dado tiempo a calcularlo todo y dibujarlo todo para cuando han pasado esos 17 milisegundos, bien. Sino, a por el siguiente frame.
#57
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/