Traducir este blog

domingo, 20 de octubre de 2024

UN CURSO RAPIDO EN BLITZ3D - PUBLICACIÓN TOMADA DE WWW.FORUN3D.COM



👾  BLITZ3D 👾




🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉

OTRO CURSO EN BLITZ3D

Con este también se aprende muy rápido a crear un juego básico en Blitz BASIC 3D. Pero programar disparos y crear enemigos es un poco complejo en este tutorial

=======================================================
NUEVO TUTORIAL PARA CREAR VIDEOJUEGO
=======================================================
El siguiente tutorial contiene 10 archivos  ".pdf" y el programa demo sobre como crear un videojuego. En el paquete se explican aspectos importantes de programación  como:

1. crear entidades
2. Mover entidades con el mouse y el teclado
3. Como crear funciones.
y lo más importante:

4. Se explica como crear clases y objetos: estos se usarán para crear algo importante en un videojuego:  disparos y enemigos.

Debes seguir las instrucciones de quién elaboró el tutorial y codificar para aprender. En el se explica muy bien como crear los objetos y las clases para usarlos en el videjuego.


De clic en el anterior enlace
===================================================

domingo, 6 de agosto de 2023

PROGRAMACIÓN CON EL LENGUAJE BlitzBASIC-3D

Blitz BASIC-3D (BLITZ3D)



El Blitz BASIC es un lenguaje de programación ideal para programadores principiantes y para los alumnos que recien se inician en el campo de la programación. Todas las versiones del lenguaje BASIC a través de su historia, se han caracterizado por facilidad de manejo y aprendizaje. Este versión en particular, fue creada para el diseño y creación de videojuegos en 3D, que es a donde apuntaremos en este blog. La idea es iniciar en esta área a los alumnos del colegio “Emilio Cifuentes”. Cabe destacar para este lenguaje:

- Es una herramienta poderosa y fácil de aprender.

- Ideal para principiantes y profesionales que deseen realizar videojuegos, simulaciones y aplicaciones de cualquier género.

- Lleva al programador profano al uso de las DirectX de Microsoft.

- Suave y perfecta curva de aprendizaje.

- Apreciado aún por programadores experimentados.

Con esta pequeña introducción comenzaremos a caminar por el mundo del diseño de los videojuegos en 3D. A partir de aquí, trataremos de abordar el aprendizaje de una manera práctica, dejando una serie de programas codificados y explicados que nos permitan iniciar nuestro camino. Siempre buscando una codificación lo más sencilla posible.

NOTA: Los programas de esta entrada se trasladarán después de cierto tiempo a la pestaña "PROGRAMAS EN BLITZ3D". Se mantendrán con la misma numeración y secuencia de "complejidad".


****************************************

PROGRAMA #9

Un cielo creado para  un escenario usando dos planos:

;============================================

; funcion: terreno y cielo con dos planos superpuestos

; El fondo negro que se ve, es porque este sistema se usa cuando en 

; en el juego solo se ve el cielo por las ventanas de un edificio, por huecos

;en el techo, o por encima de recintos cerrados por paredes sin techos.

; fecha: 19-oct-2023

; autor: r2d2

; lenguaje: BlitzBASIC 3D

; archivo: cielo_con_plano1

; =====================================================

Graphics3D 800,600,32,1

SetBuffer BackBuffer()

; crear camara

cam1=CreateCamera()

PositionEntity cam1,0,10,2 ; coloca camara en x=0, y=10, z=2

;crear luz

luz1=CreateLight()

RotateEntity luz1,30,0,0


;crear plano infinito y cargarlo en variable "piso"

piso=CreatePlane()

;cargar textura "grama" y se guarda en variable "textura_piso"

textura_piso=LoadTexture("grama.bmp")

;escalar la textura

ScaleTexture textura_piso,20,20

; colocarle textura al piso

EntityTexture piso,textura_piso



;crear plano infinito para el cielo

cielo=CreatePlane()

;crea textura para plano infinito "cielo"

textura_cielo=LoadTexture("firmamento.png")

;escalar textura

ScaleTexture textura_cielo,200,200

;colocar textura para el cielo

EntityTexture cielo,textura_cielo



;rota la entidad "cielo" para que la textura se vea desde abajo

RotateEntity cielo,180,0,0

; se posiciona textura del cielo a 100 unidades en: y

PositionEntity cielo,0,100,0



While Not KeyHit(1)

If KeyDown(205)=True Then TurnEntity cam1,0,-1,0

If KeyDown(203)=True Then TurnEntity cam1,0,1,0

If KeyDown(208)=True Then MoveEntity cam1,0,0,-1

If KeyDown(200)=True Then MoveEntity cam1,0,0,1


Text 10,560, "tierra y cielo con planos infinitos"

UpdateWorld

RenderWorld

Text 10,560, "tierra y cielo con planos infinitos"

Flip

Wend

End



firmamento.png



grama.bmp

PROGRAMA #10

COMO MOVER AVATAR ANIMADO EN UN PLANO INFINITO

;************************************************
; fecha: 25-10-2023
; programador: r2d2
; funcion: mover avatar animado sobre plano infinito
; archivo: avatar1.bb
; lenguaje: Blitz BASIC-3D
; EL avatar se dibuja en MilkShape, se anima y se exporta a formato ".b3d" para Blitz3D
; ***********************************************
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
mono=LoadAnimMesh("bebe_caminante.b3d") ;carga avatar en la variable "mono"
camara1=CreateCamera(mono) ;activa el seguimiento de camara a la variable mono o "bebe_caminante"
terreno=CreatePlane()

;extraer animacion
ExtractAnimSeq( mono,0,0 )     ;animacion de pie
ExtractAnimSeq( mono,1,40 ) ;animacion caminar frames del 20 al 60 
;ExtractAnimSeq( mono,70,100 ) ;no tiene la animación para correr

Animate mono,0,0.5,1 ; carga animacion "mono", modo: 1(bucle)-0(parar), velocidad#(0.5), secuencia(1)
; la secuencia 1 corresponde el primer ExtractAnim

;ScaleEntity mono,0.5,1,1
PositionEntity camara1,5,37,-28
TurnEntity camara1,30,0,0
piso=LoadTexture("cesped.jpg")
ScaleTexture piso,30,30
EntityTexture terreno,piso

luz1=CreateLight()

While Not KeyDown(1)
semueve#=0
; modo:
; 0: parar la animación
; 1: loop (bucle) de la animación (por defecto)
; 2: ping-pong de la animación
; 3: one-shot (una fotografía) de la animación
;--------------------caminar --------------------------
If KeyDown(200) Then
If AnimSeq(mono)=1 Then Animate mono,1,0.5,2 ; ente/modo/velocidad/secuencia 
semueve#=0.2; 
;------------------- correr ---------------------------
If KeyDown(29) Then
If AnimSeq(mono)=2 Then Animate mono,1,0.5,3
semueve#=0.6:
;----------------- vuelve a secuencia 1: quieto -------
Else
    If AnimSeq(mono)=3 Then Animate mono,2,0.5,1
EndIf
Else
    If AnimSeq(mono)<>1 Then Animate mono,2,0.5,1
EndIf

MoveEntity mono,0,0,semueve#
;___________________girar_____________________________
If KeyDown(203) Then TurnEntity mono,0,1.5,0
If KeyDown(205) Then TurnEntity mono,0,-1.5,0

UpdateWorld
RenderWorld
Text 10,600, "movimiento de avatar - Cursoras"
Flip
Wend
End

==================================================================

De clic en la línea siguiente para descargar "avatar.b3d"


===========================

Descargar textura para plano: 


PROGRAMA #11 (completo)

En este programa tratare de escribir el esqueleto básico de un videojuego sencillo con un avatar animado y con las notas de programación para que  usuarios recien iniciados puedan aprender tecnicas sencillas de programación. Siempre se seguiran las cosas de la manera más fácil que se pueda.
No se han programado colisiones, por tanto, el avatar pasara a través de los objetos. Tampoco tiene animación. Esto se hará en un próximo programa
; ================================================
; función: crear elementos basicos de un juego
; fecha: 22-mayo-2024
; autor: Yo
; lenguaje: Blitz3D
; archivo: prototipo.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 y en segundo lugar
; se programa la camara para que siga al avatar. Si no se programa en ese orden
; la camara no funcionara siguiendo el avatar
neper1=LoadMesh("robot1.b3d")
PositionEntity neper1,0,0,-10

; 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 50 unidades detras del avatar
cam1=CreateCamera(neper1)  ; avatar: "neper1" enlazado a la camara "cam1"
PositionEntity cam1,1,38,-50

;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()
grass_tex=LoadTexture("pasto.bmp")
EntityTexture plane,grass_tex
ScaleTexture grass_tex,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,0,0,50
ScaleEntity arbol1,3,3,3

; bucle infinito para inicio/fin de juego y control del avatar
While Not KeyDown( 1 )
If KeyDown(200) Then ; cursor arriba
MoveEntity neper1,0,0,0.5
Text 10,50,z#
EndIf
If KeyDown(208) Then ; cursor abajo
MoveEntity neper1,0,0,-0.5
EndIf
If KeyDown(203) Then ; cursor izquierda
TurnEntity neper1,0,1,0 
EndIf
If KeyDown(205) Then ; cursor derecha
TurnEntity neper1,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


RenderWorld
Text 0,0,"Use cursor keys to move the first camera about the infinite plane"
Flip

Wend
End

;===============================================================

textura: "sky1.bmp"

"pasto.bmp"










PROGRAMA #12 CON ANIMACIÓN Y 
MOVIMIENTO DEL AVATAR

; ================================================
; 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