Guardar posicion de objetos!

Started by Goku jr, December 25, 2016, 11:21:55 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Goku jr

Buenas a todos!
lo primero de todo desearos Felices fiestas!! :D


Veamos por donde empiezo,el otro dia estaba programandome el tipico matamarcianos para enseñarselo a unos amigos,pero me cansaba que a la hora de colocar a los enemigos en pantalla
tenia que estar diciendole las x ,y por codigo.
entonces pense en programarme un pequeño "editor" o posicionador de objetos o procesos para guardarlos en un archivo,pensando que iba a ser facil de implementar,(a lo mejor lo es) pero yo soy muy burro.


digamos que yo tengo en codigo una variable global y  estructura asi :






Quote
global
int num_enemigo;


struct enemigo[99];
int posx;
int posy
end


Vale , y en mi programa,quiero que donde pulse con el raton,se ponga un enemigo,y se quede guardado en la memoria.
tal como asi.





Teniendo un proceso enemigo asi
Quote
process enemigo(x,y);
begin
graph=1;
loop
frame;
end
end





if(mouse.left));enemigo(mouse.x,mouse.y);num_enemigo=num_enemigo+1;

enemigo[num_enemigo].posx=mouse.x;
enemigo[num_enemigo].posy=mouse.y;
end










para luego hacer un :


Quotefwrite(archivo,enemigo);


y luego para cargar


Quote
fread(archivo,enemigo);
from 0 to num_enemigo;
mouse.x=enemigo[num_enemigo].posx;
mouse.y=enemigo[num_enemigo].posy;
enemigo(x,y);
end


fclose(archivo)


Pero claro,asi solo me guarda la ultima posicion del mouse.


Vamos que como siempre,no tengo idea de lo que estoy haciendo,y necesito una ayudita.


Saludos! y gracias
[/size]

DCelso

En el guardado.
Guarda primero el número de enemigos puestos
Luego un bucle haste ese valor y guardas cada estructura.
En la lectura. Lees primero el numero de enemigos.y ccon ese valor bucle y lees las estructuras

Para poner en pantalla
Al mouse left . esperas a que se suelte el left y después
Avanzas el número de enemigos. En ese nuevo numero guardas mouse.x. mouse.y
Creas también el proceso para que se vea.
Y listo.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Goku jr

Quote from: DCelso on December 25, 2016, 02:48:27 PM
En el guardado.
Guarda primero el número de enemigos puestos
Luego un bucle haste ese valor y guardas cada estructura.
En la lectura. Lees primero el numero de enemigos.y ccon ese valor bucle y lees las estructuras

Para poner en pantalla
Al mouse left . esperas a que se suelte el left y después
Avanzas el número de enemigos. En ese nuevo numero guardas mouse.x. mouse.y
Creas también el proceso para que se vea.
Y listo.


Muchas gracias
pero...
para guardar el numero de enemigos puestos deberia de hacer un :


Quotefwrite(archivo,num_enemigos);


luego un bucle hasta ese valor.. tengo que declaras otra variable auxiliar?
por ejemplo una que se llame num;
y hacer un :


Quote
from num=0 to num_enemigos;
fwrite(archivo,enemigo);
fclose(archivo);
end


Por que de ser asi,el guardado tendria que ser en "tiempo real" no? por que si no en cada guardado se machacarian los datos.. o me estoi liando mucho?


Saludos!










DCelso

fwrite y fread avanzan automáticamente el puntero a fichero.

fopen(..)
fwrite(enemigo[1])
fwrite(enemigo[2])
fclose()
guardaría dos estructuras enemigo una detrás de otra


fopen(..)
fread(enemigo[1])
fread(enemigo[2])
fclose()

leería bien a esos dos enemigos guardados.

Ahora bien. Tienes que guardar antes el número de enemigos para poder leerlo después y no leer mas estructuras de las que realmente hay guardadas.

num_enemigos =5
fopen(..)
fwrite(num_enemigos)
fwrite(enemigo[1])
fwrite(enemigo[2])
...
fclose()


fopen(..)
fread(num_enemigos)
for i = 0 i<num_enemigos ; i++
  fread(enemigo)
fclose()

En cuanto al guardado.

Debe ser una única vez al final, ya que necesitas guardar al principio de tu fichero el número de enemigos a guardar
si lo hicieras en tiempo de colcación de cada uno, a  priori no sabrías cuantos tendrías por lo que no podrias grabar el número de enemigos antes de las estructuras.

Podrías poner un botón que al hacer click en él se guardase, o que al cerrar con escape se guarde, o una tecla "g" para guardar.. y ahí harías siempre el fopen fwrites y fclose.

Para poder hacerlo en tiempo de colocación, deberías de o bien tener siempre el mismo número de enemigos, por ejemplo 10, y así siempre guardar como maximo 10 enemigos y leer siempre 10 enemigos, o bien crearte algun truco para pedir de antemano el numero de enemgios a insertar, guardar ese valor y luego ir gurdando en tiempo de colocación cada uno.

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Goku jr

Hola
gracias por la ayuda, mejor copio mi codigo entero aqui xD
Guardar parece que guarda correctamente,pero cargar y el mostrar los enemigos...no
Solo me muestra 1 enemigo y en la posicion 0,0







Quote
program Editor;
include "modules.h"
include "datpos.h"
include "gfxload.h"
include "enemigos.h"
global
int num=0;


begin
set_mode(640,480);
edita();
loop
frame;
end
end


process edita();
private;
i;
begin
mouse.graph=cursor;
loop
say("Numero:  "+num_enemigos);
if(mouse.left);enemigo1(mouse.x,mouse.y);
num_enemigos=num_enemigos+1;
enemigo[num_enemigos].posx=mouse.x;
enemigo[num_enemigos].posy=mouse.y;
end
if(key(_s));
archivo=fopen("nivel.txt",o_write);
for (i = 0; i<num_enemigos ;) i++;
fwrite(archivo,num_enemigos);
fwrite(archivo,enemigo);
end
fclose(archivo);
end
if(key(_l));
archivo=fopen("nivel.txt",o_Read);
for (i = 0; i<num_enemigos ;) i++;
fread(archivo,num_enemigos);
fread(archivo,enemigo);
end
fclose(archivo);
muestra();
end


frame;
end
end


process muestra();
begin
let_me_alone();
screen_clear();
fade_in();


enemigo1(x,y);
end


y el archivo enemigos.h



Quote
process enemigo1(x,y);
begin
file=fpg_enemigos;
graph=1;
loop
frame;
end
end


Saludos!

DCelso

#5

if (mouse.left)
  while (mouse.left) frame; end  // <-- pausa hasta que se suelte el botón del ratón.
  enemigo1(mouse.x,mouse.y);
  num_enemigos=num_enemigos+1;
  enemigo[num_enemigos].posx=mouse.x;
  enemigo[num_enemigos].posy=mouse.y;
end

if(key(_s));
  archivo=fopen("nivel.txt",o_write);
  fwrite(archivo,num_enemigos);
  for (i = 0; i<num_enemigos; i++)
    fwrite(archivo,enemigo[i]);
  end
  fclose(archivo);
end
if(key(_l));
  archivo=fopen("nivel.txt",o_Read);
  fread(archivo,num_enemigos);
  for (i = 0; i<num_enemigos ; i++)
     fread(archivo,enemigo[i]);
  end
  fclose(archivo);
end


;)
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

#6
Consejo:
intenta ser lo mas fiel posible al pseudocódigo que te den.
Si lees detenidamete el código debe de hacer lo mismo y en el mismo orden, línea a línea al pseudocódigo ( o pautas que tienes como ejemplo)

en tu caso, metiste dentro del for la lectura y escritura del número de enemigos. lo que se pretende guardar es si tienes dos enemigos uno en 10,20 y otro en 30,40. es lo siguiente:

2
10,20
30,40

y tu guardabas

2
10,20
2
10,20

ya que siempre pasabas la primera estructura de tu array "enemigo" es igual a "enemigo[0]" para fwrite.

y en la lectura la gerías nada más empezar porque antes del for deberías de haber leído el número de registros a leer.
en el ejemplo que puse primero lees el 2, y luego a continuacion con ese valor haces un for de dos iteraciones para leer los dos enemigos 10,20 y 30,40
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Goku jr

Muchas gracias de nuevo!


ahora al cargar,si que me carga correctamente,por un say que puse en el codigo,perooo.,,,llamame tonto,pero en el proceso enemigo deduzco que tengo que poner las coordenadas..



Quote

process enemigo1(x,y);
begin
file=fpg_enemigos;
graph=1;
x=enemigo[num_enemigos].posx;
y=enemigo[num_enemigos].posy;
loop
frame;
end
end


y directamente no me muestra ninguno XD


Dejo comprimido aqui todo el src y recursos, ocupa poquito.


Saludos y mil gracias.


Drumpi

Primero de todo: ¡¡felices fiestas!!

Segundo, perdón por no extenderme en la respuesta, estoy medio dormido y no me he leido todo el código. Simplemente decir que no es necesario guardar al principio el número de estructuras que va a contener el fichero, pues la función FEOF nos puede decir si hemos llegado al final del fichero al leerlo ;)
Si no, si tus formaciones se colocan en posiciones predefinidas, en lugar de guardar las posiciones podrías guardar el array bidimensional que indica qué enemigo hay en cada posición.

Y si vas a añadir el número de enemigos, y quieres rizar el rizo, añade al fichero una cabecera: tres CHAR para identificar el formato de tu fichero (es tuyo, por lo que pon lo que te de la gana :D) y un número de versión. Puede parecer una tontería, pero a la larga, si hay nuevas versiones y quieres cambiar el formato del fichero, te va a venir muy bien :P

Y me voy a dormirzzzzzzzzzzzzz....
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

DCelso

Quote from: Goku jr on December 25, 2016, 11:30:51 PM
Muchas gracias de nuevo!


ahora al cargar,si que me carga correctamente,por un say que puse en el codigo,perooo.,,,llamame tonto,pero en el proceso enemigo deduzco que tengo que poner las coordenadas..



Quote

process enemigo1(x,y);
begin
file=fpg_enemigos;
graph=1;
x=enemigo[num_enemigos].posx;
y=enemigo[num_enemigos].posy;
loop
frame;
end
end


y directamente no me muestra ninguno XD


Dejo comprimido aqui todo el src y recursos, ocupa poquito.


Saludos y mil gracias.
Si pasas x e y como parámetros. No hace falta asignarles valor luego.
Elimina
x=enemigo[num_enemigos].posx;
y=enemigo[num_enemigos].posy;


Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

#10
bueno, saqué un huequecito y miré tu código.
Básicamente dos errores: al hacer la carga con l, se te olvidó crear los procesos que muestran la imagen con enemigo1(x,y).
Lo metí pero seguía sin ir. Analicé el código de nuevo, y vi que el fpg tuyo está en 32 bits, y bennu por defecto carga en 16 bits por lo que no te carga el recurso de 32 bits. puse ,32 al final del set mode y todo arreglado, todo va de pm.

Ya de camino vi que tenías hecho un caos el indentado y lo modifiqué un poco. A parte de meter muchos says para ver que todo va.



Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

me puse y me puse, y le metí soporte para limpiar la pantalla.
plan tosco, lo unico que hago es guardar el identificador de proceso para luego poder destruirlo y poner a 0 el número de enemigos :D

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Goku jr

Muchas gracias,perdón por no contestar,pero ando liado con el curro(trabajo en un centro comercial)y ahora en Navidad puff,ahora cuando cene le hecho un vistazo,

DCelso

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Goku jr

Quote from: DCelso on December 29, 2016, 09:30:49 PM
ok, luego me cuentas. :D


Lo acabo de probar
y  al leer tu codigo,me pego cabezazos contra la mesa,y me digo que tonto soy,como despues de tantos años intentando programar cosas con divlikes , y no saber manejar una estructura y procesos.
que decirte,que funciona perfectamente para lo que quiero,y que ahora ,sabiendo como se hace,intentare hacer un editor mas potente,para simplificar un poco mas las programacion de mis futuros proyectos.
MIL GRACIAS :d