; ================================================
; función: crear elementos basicos de un juego
; fecha: 31-octubre-2024
; autor: Yo
; lenguaje: Blitz3D
; archivo: prototipo_animado.bb
; ================================================
; variables globales:
; variables para control de teclado
Global escape_key = 1
Global up_key = 200, down_key = 208, left_key = 203, right_key = 205
Global W_key = 17, S_key = 31, A_key = 30, D_key = 32, z_key = 44
; variables para control de coordenadas del avatar
; nombre del avatar: "neper1": dibujado con Khet: animado con Milkshape
Global neper1
; coordenadas iniciales del avatar
Global x#=0, y#=-1, z#=10
; tamaño de ventana para juego
; 1024 x 768 píxeles usando Color de 32 bits
; con un marco de ventana (1 = pantalla completa, 2 = ventana)
Graphics3D 1024,768,32
; dibujas o cargas los objetos de tu mundo en una página posterior oculta
; (también conocida como BackBuffer: bufer de pantalla o memoria de pantalla) mientras se muestra la página principal.
; Una vez que los objetos 3D se han movido y luego "pintado" en el área oculta o BackBuffer,
; el comando Flip pasa las imagenes del BackBuffer al Front Buffer.
; Esto evita un molesto problema conocido como parpadeo de la pantalla y crea mundos animados más fluidos.
SetBuffer BackBuffer()
;carga objetos: avatar en formato ".b3d"
; esta carga del avatar se debe realizar primero.
; luego se programa la camara para que siga al avatar. Si no se programa en ese orden
; la camara no funcionara siguiendo el avatar
avatar=LoadAnimMesh("avatar.b3d") ; la figura de la animacióm es propiedad del autor del blog
PositionEntity avatar,0,0,-20 ; dibujado con KHET y animado con Milkshape
ScaleEntity avatar,3,3,3
; Crea primera camara
; crea una cámara llamada "cam1" . Puedes controlar hacia dónde apunta esta cámara en tu mundo
; conectamos la cámara al avatar para que lo siga
; y crear una vista en tercera persona. La camara esta 20 unidades detras del avatar
cam1=CreateCamera(avatar) ; el avatar: "avatar" enlazado a la camara "cam1"
PositionEntity cam1,1,10,-30
; extrae los fotogramas de la animacion: frames: 0-1 es el avatar quieto
; 2-30 es el avatar caminando
quieto=ExtractAnimSeq( avatar,0,1 ) ;animacion de pie
camina=ExtractAnimSeq( avatar,2,30 ) ;animacion del avatar caminando: frames del 2 al 35
; ===================================
; configuracion de la animacion
; ==================================
; ente: neper1
; modo: 1 (loop)
; velocidad: 0.5
; secuencia: 1 (camina)
Animate avatar, 1, 0.5, camina,1
;Podemos agregar algo de luz ambiental para que si nos alejamos demasiado de nuestra fuente de luz puntual,
;las cosas no se oscurezcan : cada valor va de 1 a 255
; los parametros son una mezcla de color RGB
AmbientLight 200, 200, 200
; crea un punto de luz estándar llamado "luz1": (1 = direccional (predeterminado), 2 = punto, 3 = cono)
; 1= funciona de forma similar a un sol brillando sobre una casa. La intensidad de la iluminación dependerá
; del ángulo en que la luz incida sobre ellos.
; 2= crea un punto de luz. Esto funciona como una bombilla iluminando dentro de una casa,
; comenzando en un punto central y desvaneciéndose gradualmente hacia el exterior.
; 3= Un valor 3 crea una luz spot. Esto es un cono de luz.
luz1=CreateLight(1)
RotateEntity luz1,45,0,0
; crear un plano infinito para colocar elementos de juego
plane=CreatePlane()
grama=LoadTexture("pasto1.bmp")
EntityTexture plane,grama
ScaleTexture grama,50,50
PositionEntity plane,0,0,10
;crear el cielo!
;Hacer un cielo es más sencillo de lo que se pensamos:
; 1. crea una esfera
sky = CreateSphere()
; 2. le colocamos una textura
skytexture = LoadTexture("sky1.bmp")
EntityTexture sky,skytexture
; 3. agrandamos la esfera para que quede como una cúpula sobre el terreno
; asi quedamos detro de la esfera
ScaleEntity sky,800,800,800
; como la textura está colocada por la parte externa de la esfera, al mirar hacia arriba
; veremos el interior de la esfera que es de color negro: es decir, no veriamos cielo azul ni nubes
; entonces el siguiente comando coloca la textura de la esfera por su lado interior
; o hace que la textura sea visible desde el interior de la esfera, asi vermos cielo azul y nubes
FlipMesh sky
;Carga una pequeña construccion sobre el plano infinito
; podría ser nuestro primer objeto del juego
; lo posiciona en las coordenadas 0,0,150 con una escala natural:
; 1,1,1: significa que se dejo con el mismo tamaño en que se dibujo con MILKSHAPE
torre=LoadMesh("nivel1.b3d")
PositionEntity torre,0,0,150
ScaleEntity torre, 1,1,1
;Carga un arbol sobre el plano infinito
; lo posiciona en las coordenadas 0,0,50
; se usa "ScaleEntity arbol1, para agrandarlo 3 veces en x,y,z
; el arbol se dibujo con el software ; "Tree 3.1"
arbol1=LoadMesh("arbol1.b3d")
PositionEntity arbol1,100,0,-20
ScaleEntity arbol1,6,6,6
; bucle infinito para inicio/fin de juego y control del avatar
; ===================================
; configuracion de la animacion o parámetros:
; ==================================
; ente: avatar
; modo: 1 (loop)
; velocidad: 0.5
; secuencia: 1 (camina)
Animate avatar, 1, 0.5, quieto,1
While Not KeyDown( 1 )
semueve_z#=0
gravedad_y#=0
If KeyDown(200) Then
If AnimSeq(avatar)=quieto Then Animate avatar,1,1,camina
semueve_z#=1
gravedad_y#=0
Else
If AnimSeq(avatar)<>quieto Then Animate avatar,1,0.5,quieto
EndIf
If KeyDown(208) Then ; cursor abajo
MoveEntity avatar,0,0,-0.5
EndIf
MoveEntity avatar,0,gravedad_y#,semueve_z#
If KeyDown(203) Then ; cursor izquierda
TurnEntity avatar,0,1,0
EndIf
If KeyDown(205) Then ; cursor derecha
TurnEntity avatar,0,-1,0
EndIf
; _____________________________________________________________________
; cambiar la posicion de la camara de seguimiento del avatar
; A: camara hacia abajo
; z: camara hacia arriba
If KeyDown(30) ; A
TranslateEntity cam1,0,-0.5,0
Else If KeyDown(44) ;Z
TranslateEntity cam1,0,+0.5,0
;EndIf
EndIf
RenderWorld
UpdateWorld
Text 0,0,"Use cursor keys to move the first camera about the infinite plane"
Flip
Wend
End
====================================================
Próximo:
Programa #13
Creación de un sistema de colisiones
El programa contiene un automovil desplazandose por una pequeña ciudadela. Trae explicaciones adicionales y es uno de los pequeños programas que está en la revista que se presenta al inicio de esta página. Estudienlo y disfrutenlo.
=============================================
Programa #14
Es una variante del anterior programa. Se puede colocar otro objeto como avatar y probar los desplazamientos y colisiones con el escenario. Sería bueno probar el programa desactivando la colisión de la cámara y volver a activarla para ver la diferencia.
;===========================================================
; funcion: avatar con sistema de colisiones
; fecha: 9-noviembre-2024
; autor: r2d2
; lenguaje: BlitzBASIC 3D
; archivo: cielo_con_plano1
; ==========================================================
Graphics3D 1024,768,16,2
; CARGAR EL ESCENARIO
piso=LoadMesh( "ciudad.3ds" )
; CARGAR EL AVATAR
; no tiene animación
avatar=LoadMesh( "avatar.b3d" )
ScaleEntity avatar,0.12,0.12,0.12
MoveEntity avatar,0,0.2,4
;CREAR CÁMARA
camara=CreateCamera(avatar) ; creamos una camara que siga a carro
light=CreateLight() ; cramos la luz
CameraRange camara,2,3500 ; establecemos el rango ampliado a 3000 pixel de distancia
PositionEntity camara,0,22,-35 ; posicionamos la camara a 10 de altura y a 35 hacia atras
; CREAR EL CIELO
; Hacer un cielo es más sencillo de lo que se pensamos:
; 1. crea una esfera
sky = CreateSphere()
; 2. le colocamos una textura
textura_cielo = LoadTexture("cielo.png")
EntityTexture sky,textura_cielo
PositionEntity sky,0,0,0
; 3. agrandamos la esfera para que quede como una cúpula sobre el terreno
; asi quedamos detro de la esfera
ScaleEntity sky,200,200,200
; como la textura está colocada por la parte externa de la esfera, al mirar hacia arriba
; veremos el interior de la esfera que es de color negro: es decir, no veriamos cielo azul ni nubes
; entonces el siguiente comando coloca la textura de la esfera por su lado interior
; o hace que la textura sea visible desde el interior de la esfera, asi vermos cielo azul y nubes
FlipMesh sky
; CREAR SISTEMA DE COLISIONES
;1. Definir a cada tipo de entidad un # para verificar su colision, si se necesita
EntityType piso,1 ; 1=para piso y edificios: son un solo objeto en este diseño
EntityType avatar,2 ; 2=para avatar
EntityType camara,3 ; 3=camara
; 2. definir un radio de colision para las entidades que se necesite
EntityRadius avatar,1.3 ; cantidad de pixeles alrededor del objeto que calcula la colision
; solamente se le definio radio de colision al avatar
; 3. definir como son las colisiones: "que contra que" y "que sucede"
; #2: ferrari, #1: contra piso con edificios , #2: metodo: elipse a ; poligono,
; #1: respuesta(que sucede): detener auto
Collisions 2,1,2,2 ; la secuencia de numeros se explica en linea anterior
; #3: camara, #1: contra piso y edificios, #2: metodo: elipse a poligono, #2: respuesta: colision ;deslizante
Collisions 3,1,2,2 ; si colisiona camara (2=la camara se desliza por los muros o barreras del ;nivel o de los objetos)
; si la camara no colisionara se iría por detras de las paredes y se ; vería
; como si estas desaparecieran por momentos y volvieran a aparecer ; cuando el avatar se retirar de los muros.
While Not KeyHit(1)
If KeyDown(200) Then
MoveEntity avatar,0,0,0.3
EndIf
If KeyDown(208) Then
MoveEntity avatar,0,0,-0.3
EndIf
If KeyDown(203) Then
TurnEntity avatar,0,1,0
EndIf
If KeyDown(205) Then
TurnEntity avatar,0,-1,0
EndIf
PositionEntity camara,0,22,-35 ; hace que la camara vuelva a seguir el avatar
UpdateWorld
RenderWorld
Flip
Wend
End