problemas/dudas usando resolution en funcion define_region()

Started by FreeYourMind, October 03, 2009, 12:53:47 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

Buenas.

Tengo el siguiente problema:

Tengo una barra de energia definida con:

define_region(1,260,10,fuel,20);

fuel es la energia que le resto al enemigo, o sea cada tiro que choca contra el enemigo hace fuel -= 1; y va recortando la barra
hasta terminar la region.


He tenido que rescalar el juego manualmente y ahora la barra tiene la mitad de tamaño:

define_region(1, 130, 5, fuel, 10);


El problema es que el valor de fuel ahora tendria que ser fuel -= 0,5. lo que no se permite por redondeos.


O sea, la solución pasa por utilizar el resolution, lo que ocurre es que no consigo hacerlo.


Si pongo:

resolution = 10;
fuel *= resolution;
define_region(1, 130, 5, fuel/resolution, 10); no me funciona,

lo curioso es que no se el comportamiento de resolution internamente en las funciones de bennu, me explico:


1 - Si pongo de ejemplo:

resolution = 10;
fuel *= resolution;

define_region(1, 130, 5, 50, 10);

la region no se pinta, y la estoy pintando con valores independientes de resolution, si quito el resolution ya funciona,
lo que deduzco que internamente la funcion hace calculos con el resolution,

2 - Splinter Que funciones utilizan resolution internamente, aparte de avance(), son todas ????


Que solucion me dais ??

Estaba pensando que una alternativa al resolution si no consigo ponerlo a funcionar, esto seria crear una variable global la cual incrementaba con 1 en lugar de fuel en cada colision del disparo, cuando esta variable fuese = 2, la reseteaba y incrementaba fuel += 1.


DjSonyk

Buenas ,yo por lo que entiendo quieres reducir un la region en fase del fuel,el problema esta en que no puedes difinir una region con decimales, solo se puede hacer con enteros ,al menos que Splynter diga lo contrario ,aunque me pareceria raro...
Una solucion seria tener otra variable que almacenara un entero y seria la que deverias poner en Define_region...
La idea es que independientemente el fuel que tengas ,me refiero en decimales, que solo se actualizara en base a la variable entera...
No se si me explico ^^...
Humm que se recortara la region solo con la variable entera ...
Otra opcion seria quitar 1 a la region por cada 2 puntos de fuel...osea te dan dos veces y disminulles la region 1 punto.
Espero que te aclares ,porque la verdad me estoy liando yo xD.. Suerte  ;)

FreeYourMind

Si claro, tienes razón en lo que dices, pero para eso existe el resolution, que hace calculos en decimales internamente, lo que pasa es que no se como ponerlo en este caso... Y la solución que dices es como la que comente de alternativa, que si esto no se resuleve con resolution lo tendre que hacer de esa forma.

DCelso

A ver, todos los valores de pixeles que pongas a partir de resolution deberían de ir multiplicados por este valor. por tanto el 130 debería ser 1300 o 130*resolution, y así en todos, para restar 0.5 ahora sería restar 5, 0.5*resolution.

Es lo que te dije con anterioridad, al usar resolution, tu pantalla se multiplica en cantidad de pixeles(de 320x200 pasa a 3200x2000) así que si quieres usar las coordenadas que usabas antes de resolution , estas deberán llebar el *resolution, para ajustarlas intermamente.
Monstruos Diabólicos

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

FreeYourMind

Porfa cambiame el ejemplo para que lo vea, que soy un torpe.

DCelso

pues quizas haya que tocar mas cosas, por eso no lo hice, como no pusiste el proceso entero..
Básicamente en lo poco que has puesto es multipilcar por esa variable todos los valores.

define_region(1,260*resolution,10*resolution,fuel*resolution,20*resolution);

Aunque no lo he probado y no se si el width y el heigh están referenciado tambien las coordenadas agrandadas, que supongo que sí.
Monstruos Diabólicos

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

FreeYourMind

Te pongo el ejemplo completo y lo arreglas :), son dos funciones en una la del disparo igual a la de tu ejemplo que hemos construido anteriormente para el tema del advance, solo que hacemos el fuel += 1; al colisionar el tiro con el enemigo. Y la otra es la funcion barra() donde se hace el region:

1 -

//fuel es una variable global y la podemos poner definir a
fuel = 220;


2 -

processo de disparo que ya lo conoces de antes, sólo que descontamos el fuel al colisionar para pintar la barra de energia

Process disparo(x,y,angle)

Begin

  resolution = 10;
  x *= resolution;
  y *= resolution;

  File=1;
  z=-597;
  graph=graf_disp;
  Repeat
                                                                                                                                                                                       
IF((id_colision = collision(Type enemigo1))

        Switch(graf_disp);
          Case 1:

              fuel -= 1;

              id_colision.vida -= 5; // Ignora esto (se podia usar sólo esta para la barra y enemigo)
              If(id_colision.vida > 0) explosion_tiro(x/resolution, y/resolution, 96, 100); End           

              Break;
            End
          End

      advance(8 * resolution);
      Frame;
  Until(y < 0);
End


3 - Por ultimo la barra de energia:

Process barra();
                
Begin
File=1;
graph=1;

x = 200;
y = 20;


Loop

   While (fuel>0)

define_region(1, 130, 5, fuel, 10);

Frame;End       

   Frame;End     
End           

SplinterGU

resolution solo afecta a coordenadas x e y de un proceso que use resolution.

segun creo (no tengo tu codigo) tu fuel debe seguir siendo -1
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

ahhh, ya veo lo que haces... debes seguir haciendo fuel -=1 y poner fuel / 2 en el define region... vamos que es muy facil... :D

fuel -= 1;

...

define_region( 1, 130, 5, fuel / 2, 10 );

suponiendo que la pantalla se redujo a la mitad... si se redujo a mas, el valor de la division debe ser otro...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

el valor fuel = 220 ya es la mitad, porque el original era fuel = 440; eso creo que no funciona.

FreeYourMind

lo que quiero es que al quitar fuel -= 1 al fuel = 220 (que ya es reducido a la mitad como todos los valores de define_region) no le quite 1 pero si 0.5, si hay que alargar la escala con rescale ok, pero el tamaño de las regiones ya es el exacto solo quiero que quite la mitad de lo que hace actualmente.

DCelso

Ya está. Eso que comentabas de dividir por dos no es correcto ya que divides todo el fuel yo he tenido que usar float al final para no tener que complicar el código demasiado.
Monstruos Diabólicos

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

SplinterGU

#12
a ver... fuel no es tu energia? si tienes 440 en el juego original, por que lo has reducido a 220? es como decir, tengo 100 de vida y porque hago un rescalado del juego lo pongo a 50... ERROR!!!

fuel tiene que seguir siendo 440, debes descontar a -1, y region debe ser dividido como corresponda.

si lo dividis por 2, es como sumar 0.5... vamos, che, no es nada complicado... basado en este concepto trabaja todo el tema de resolucion, resize, etc... no pueden decir que no es correcto... es INCORRECTO reducir la energia o fuel, porque reducis la resolucion del juego...

dividiendo x 2, la region se reducira cada 2 veces que descuentas 1.

puf...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

por favor, no cometer esos errores... una cosa es la logica del juego y otra es la representacion visual del mismo... deben tratar de que las cosas sean independientes una de otra.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Antes de mirar tu código (y gracias) ya lo he resuelto :) Fue de la forma que dijo Splinter, estoy tonto (es que son las 5:30 de la mañana y sigo con esto), no entiendo porque poner mitad del fuel antes de poner define_region no es lo mismo que hacer la division en la llamada de la funcion !!!


Me explico:


El original:
----------

se hace fuel -= 1;

se asigna el fuel = 440

y la funcion tiene estos valores:

define_region(1, 260, 10, fuel, 20);


La conversion a mitad de resolución, corregida y funcionando:
-----------------------------------------------------------

Se  mantiene fuel -= 1;

se mantiene el fuel = 440

y sólo hay que dividir el fuel en la llamada, en la cual todos los otros valores si se ponen a la mitad:

define_region(1, 130, 5, fuel/2, 10);


---------

No entiendo porque tener estos valores:

fuel -= 1;
fuel = 220
define_region(1, 130, 5, fuel, 10);

no es igual a esto:

fuel -= 1;
fuel = 440
define_region(1, 130, 5, fuel/2, 10);


???