PDA

Ver la Versión Completa : Problema con la variable del TTimer!


Manuzinho
22-11-2010, 17:03:14
Hola, muy buenas! No quiero meteros un discurso, iré al grano... Estoy haciendo, para la asignatura de informática en la carrera de Ingeniería Industrial Electrónica en la UPC (Barcelona), un proyecto con lazarus que consiste en crear un tetris.

El tetris está todo montado, se puede jugar, todo funciona perfectamente, aumenta el nivel y todo demás, sólo hay un pequeño problema. Veréis, lo divertido es que conforme avance de nivel, el intervalo del TTimer que le he puesto disminuya. El problema de hacerlo con una resta o una división es que termina dando 0, es decir, que al final, cuando llegas a nosé cuantos puntos (a un cierto nivel 6 o 7 o 8) la pieza aparece pero ya no baja, se queda quieta. Digamos que la puedes mover por el tablero, pero sería como un truco secreto, sería el juego más fácil del mundo porque la pieza no cae, no sé si me explico...

En fin, lo que quería comentaros es que yo había pensado en hacer que el intervalo del TTimer fuera disminuyendo en una función exponencial. He estado buscando por google y tal y he visto que hay una función (añadiendo el uses Math) que es exp( ). Aqui viene el problema, el lazarus me da error diciéndome que la variable TTimer1.Interval es LongWord, y por lo visto lo que sale de la función exponencial es Extended...

Hay alguna forma de cambiar la variable, alguna de ellas, de forma que el TTimer. Interval pueda ser Extended, o al contrario, con la exponencial?? Necesitaría vuestra ayuda en este tema!!

Os dejo el código aqui (donde n es el nivel y la inicial es n:=1, y nivelletiqueta es una Label que le he puesto para que muestre el nivel en el que estás) :


procedure TForm1.nivell;
begin
if (puntuacion mod 1000 = 0 ) then
n:= n+1;
Timer1.Interval:=(exp(1/n));
nivelletiqueta.Caption:=IntToStr(n);
end;

Muchas gracias, sé que no es mucho, pero si esto termina funcionando os prometo subirlo para que podais disfrutar de este tetris voyeur!

Neftali [Germán.Estévez]
22-11-2010, 17:46:51
Te está avisando de que intentas almacenar algo de tipo no-entero, en una variable entera.
Te avisa y no hace la conversión automática porque en esa conversión se perderá precisión.

Puedes utilizar funciones como ROUND (redondear) o TRUNC (truncar) para forzar la conversión:


Timer1.Interval:= TRUNC((exp(1/n)));

Manuzinho
22-11-2010, 17:57:49
Muchisimas gracias!!!

Neftali [Germán.Estévez]
22-11-2010, 18:05:50
De nada.

Sinceramente, me ha sorprendico gratamente que para ser un "novato" por estos lares (me refiero a los foros no al Delphi), has explicado el problema perfectamente y con mucho detalle. Algunos con 100 mensajes deberán aprender de tí (explicación, título, TAG's, ortografía,...).

Felicidades por eso y bienvenido a los foros.