Lo cierto es que soy muy mal profesor, todo el basic que se lo he aprendido por mi cuenta, con mucho tiempo, paciencia y empeño. Tanto el Visual Basic net (que es a lo que dedico todo mi tiempo, haciendo programas a medida para empresas) como el Blitz (que casi más de 8 meses que no lo uso, pero me habéis vuelto a picar), lo puedo explicar a lo bruto (tal y como yo lo entiendo) que seguramente no sea la forma más correcta.
Pero, sobre todo, que nadie se quede atrás.
1º discrepar sobre las faltas ortográficas y, aunque si que creo que hay que poner mucha atención en cómo se escriben las cosas (mucho mejor si se hace bien) a mí personalmente me da igual un ahora que un ahora, sabiendo que el primero se entiende mejor que el segundo. En mis 35 años que ya tengo, he conocido grandes matemáticos, informáticos y físicos que no tienen ni idea de escribir bien. Lo cierto es que, a la hora de programar da igual:
Dim datatable as new datatable.
Que.
Dim dt as new datatable.
Siempre y cuando el programador sepa que está haciendo.
Como último comentario, decir que prefiero las faltas a que se escriba como en un móvil y tener que descifrar lo que pone. Sin entrar en polémica con nadie, ya he dicho que mejor escribir bien, esto no deja de ser un foro para que la gente pregunte de la mejor manera que lo sepa hacer.
2º el código sin type.
Código:
Graphics3d 640,480,16,2.
Ambientlight 250,250,250.
Global cámara=createcamera ().
Global personaje=loadmesh(tea, b3d).
Global pivote=createpivot (personaje) tmoveentity pivote,0,25,-30.
Suelo=loadmesh (suelo, b3d) t.
Período=33.
Tiempo = millisecs()-período.
Sedrnd (millisecs()).
Setbuffer backbuffer().
While not keyhit(1) trepeat tiempotranscurrido = millisecs() - Tiempo tuntil tiempotranscurrido tticks = tiempotranscurrido/período tcaptura# = float(tiempotranscurrido mod período) / float(período) tfor k=1 todo ticks tiempo = tiempo+período if que = ticks then captureworld.
Movimientos_personaje ().
Movimientos_camara () updateworld tnext trenderworld(captura#) tflip.
Wend.
End.
Function movimientos_personaje () tif keydown(203) then Turn Entity personaje,0,1,0 tif keydown(205) then Turn Entity personaje,0,-1,0 tif keydown(200)=true then z#=0.5 tif keydown(20 =true then z#=-0.5 moveentity personaje,0,0, z#.
End function.
Function movimientos_camara () tdx#=entityx(pivote,true)-entityx(cámara) tdy#=entityy(pivote,true)-entityy(cámara) tdz#=entityz(pivote,true)-entityz(cámara) translateentity cámara, dx# *.015, dy# *.015, dz# *.015 Point Entity cámara,personaje.
End function.
3º una pequeña explicacion.
Para que la cámara vaya lentamente detrás del personaje, el truco está en la instrucción translatentity cámara. Lo único que estás haciendo es mover la cámara a una velocidad inferior a la que mueves la z# del personaje y por supuesto también menor a la velocidad de rotación del mismo. No ovides nunca que esto:
Translateentity cámara, dx# *.015, dy# *.015, dz# *.015.
Es lo mismo que esto:
Translateentity cámara, dx# * 0.015, dy# * 0.015, dz# * 0.015.
Y claro está, que cuanto menor sea el número que pongamos, más tiempo tardará la cámara en llegar al punto donde la hemos puesto en la instrucción Point Entity. Por lo tanto, con: 0.001 tardará mucho más que con 0.1.
Los frames por segundo:
Digamos que las imágenes que vemos se componen de dos estados. Un fondo negro, una imagen, un fondo negro, una imagen etc. Esto pasado muy rápidamente hace que nuestro ojo sólo vea imágenes, siempre y cuando metamos más de 25 imágenes en un segundo. Menor que eso veremos un parpadeo. Por lo tanto, entendiendo lo anterior, no es difícil comprender que en un Pentium I tardará más en ejecutar el bucle while / wend que en una AMD Phenom de 4 núcleos y que para que nuestro juego funcione a la misma velocidad en uno que en otro, pues habrá que controlar los frames (o capturas de imágenes que queremos volcar). Tu en tu caso le has puesto 33, que es un buen número para Blitz, y para que vaya constante a 33 y no a tope de tu ordenador pues lo has controlado en esta parte de código:
Repeat tiempotranscurrido = millisecs() - Tiempo tuntil tiempotranscurrido tticks = tiempotranscurrido/período tcaptura# = float(tiempotranscurrido mod período) / float(período) tfor k=1 todo ticks tiempo = tiempo+período if que = ticks then captureworld.
Todo lo que pongas dentro del bucle for lo hará 33 veces por segundo.
Todo esto es mucho más largo, número de polígonos que renderiza nuestra cámara en un determinado momento y un largo etc en el cual no voy a entrar, pero si entender que si tu personaje gira sobre un eje, por ejemplo, y en una determinada posición metes un árbol con 40.000 polígonos, pues si no controlases los frames he intentases volcar todas las capturas, verías que en ese punto se relentiza. Esto sucede porque pasar de vacío 12 polígonos a 400 frames, por ejemplo, a 40.000 polígonos 45 frames pues es un cambio muy grande que nuestro ojo aprecia y claro, no es lo mismo capturar el vacío que 40.000 polígonos para Blitz y para tener que capturar las máximas imágenes que pueda pues tendrá que tardar más en recorrer el bucle, reduciendo así los frames. De ahí la importancia de controlarlos.
Compiladores como el C++ dan mucho más frames que Blitz, pero eso sí que es otro tema.
Ya que este mensaje empieza a ser demasiado largo dejaré el tema de los types para otro. Un saludo a todos.