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 porgramas a medida para empresas) como el blitz ( que casi más de 8 meses que no lo uso, pero me habeis 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 ATRAS.
1º discrepar sobre las faltas ortográficas, y aunque si que creo que hay que poner mucha atención en como se escriben las cosas ( mucho mejor si se hace bien) a mi personalmente me da igual un "ahora" que un "haora", sabiendo que el primero se entiende mejor que el segundo. En mis 35 años que ya tengo, he conocido grandes matematicos, informaticos 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 Camara=CreateCamera ()
Global Personaje=LoadMesh("tea.b3d")
Global Pivote=CreatePivot (Personaje)
MoveEntity Pivote,0,25,-30
Suelo=LoadMesh ("suelo.b3d")
periodo=33
tiempo = MilliSecs()-periodo
SeedRnd (MilliSecs())
SetBuffer BackBuffer()
While Not KeyHit(1)
Repeat
TiempoTranscurrido = MilliSecs() - tiempo
Until TiempoTranscurrido
ticks = TiempoTranscurrido/periodo
captura# = Float(TiempoTranscurrido Mod periodo) / Float(periodo)
For k=1 To ticks
tiempo = tiempo+periodo
If k = ticks Then CaptureWorld
movimientos_personaje()
movimientos_camara()
UpdateWorld
Next
RenderWorld(captura#)
Flip
Wend
End
Function Movimientos_Personaje()
If KeyDown(203) Then TurnEntity Personaje,0,1,0
If KeyDown(205) Then TurnEntity Personaje,0,-1,0
If KeyDown(200)=True Then z#=0.5
If KeyDown(208)=True Then z#=-0.5
MoveEntity Personaje,0,0,z#
End Function
Function Movimientos_Camara()
dx#=EntityX( Pivote,True )-EntityX( Camara )
dy#=EntityY( Pivote,True )-EntityY( Camara )
dz#=EntityZ( Pivote,True )-EntityZ( Camara )
TranslateEntity Camara,dx# * .015,dy# * .015,dz# * .015
PointEntity Camara,Personaje
End Function
3º UNA PEQUEÑA EXPLICACION
Para que la camara vaya lentamente detrás del personaje, el truco está en la instruccion translateentity Camara. Lo único que estás haciendo es mover la camara a una velocidad inferior a la que mueves la "z#" del personaje y por supuesto tambien menor a la velocidad de rotacion del mismo. No ovides nunca que esto:
TranslateEntity Camara,dx# * .015,dy# * .015,dz# * .015
es lo mismo que esto:
TranslateEntity Camara,dx# * 0.015,dy# * 0.015,dz# * 0.015
y claro está, que cuanto menor sea el numero que pongamos, más tiempo tardará la camara en llegar al punto donde la hemos puesto en la instrucción pointentity.Por lo tanto con: 0.001 tardará mucho más que con 0.1.
- Los frames por segundo:
Digamos que las imagenes que vemos se componen de dos estados. Un fondo negro, una imagen, un fondo negro, una imagen etc. Esto pasado muy rapidamente hace que nuestro ojo sólo vea imagenes, siempre y cuando metamos más de 25 imagenes en un segundo. Menor que eso veremos un parpadeo. Por lo tanto entendiendo lo anterior, no es difícil comprender que en un Pentium II tardará más en ejecutar el bucle While / Wend que en una AMD phenom de 4 nucleos 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 imagenes que queremos volcar). Tu en tu caso le has puesto 33, que es un buen numero para blitz, y para que vaya constante a 33 y no a tope de tu computadora pues lo has controlado en esta parte de código:
Repeat
TiempoTranscurrido = MilliSecs() - tiempo
Until TiempoTranscurrido
ticks = TiempoTranscurrido/periodo
captura# = Float(TiempoTranscurrido Mod periodo) / Float(periodo)
For k=1 To ticks
tiempo = tiempo+periodo
If k = 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 posicion metes un arbol con 40.000 polígonos, pues si no controlases los frames he intentases volcar todas las capturas, verias que en ese punto se relentiza. Esto sucede porque pasar de vacio 12 polígonos a 400 frames,por ejempo, 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 vacio que 40.000 polígonos para blitz y para tener que capturar las máximas imagenes que pueda pues tendrá que tardar más en recorrer el bucle, reduciendo asi los frames. De ahí la importancia de controlarlos.
Compiladores como el C++ dan mucho más frames que blitz, pero eso si 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.
Marcadores