Basic4GL Pong


En este post vamos a ver como programar el clasico de clasicos, y por ser la primera vez con Basic4GL solo vamos utilizar las funciones print.

Primero dibujaremos nuestra pelota y la tabla con la que vamos a jugar:

TextMode(TEXT_BUFFERED)

while true
cls

locate 39,10
print "0"

locate 10,40
print "HHHHHHHH"

DrawText()
wend

A diferencia del tutorial anterior aquí agregamos las lineas locate, estas lineas le siguen dos números, el primero cambiara la posición inicial del texto en la posición X, y el segundo en la posición Y, experimenta un poco con esto a ver que pasa (lo números máximos son 39 para X, 24 para Y).

Si ejecutamos nuestro programa (F5), veremos en la pantalla nuestra tabla y una pelota aún sin movimiento.

Ahora vamos a controlar nuestra tabla, para esto utilizaremos las teclas de flecha derecha e izquierda:

TextMode(TEXT_BUFFERED)

dim playerX
while true
cls

locate 39,10
print "0"

locate playerX,40
print "HHHHHHHH"

if ScanKeyDown(VK_LEFT) and playerX > 0 then
playerX = playerX - 1
endif

if ScanKeyDown(VK_RIGHT) and playerX <>
playerX = playerX + 1
endif

DrawText()
wend

El pimer cambio es un dim playerX, dim es una palabra reservada de Basic para declarar que vamos a crear una variable y playerX es el nombre de nuestra variable.

Después vienen dos estructuras if que controlan nuestra tabla, en ambas comprobamos si el jugador esta presionando una tecla (VK_LEFT para la tecla izquierda, y VK_RIGHT para la derecha), si es así entontences vemos si aún no nos salimos de la pantalla, esto es: si la posición inicial en X es mayor a 0 aún estamos dentro, y si es menor a 31 (los 39 caractéres menos los 8 que mide nuestra tablita) sucede lo mismo así que podemos despazarnos sobre el eje X sin ningún problema.

Si ejecutamos, ahora podemos mover nuestra tabla.

TextMode(TEXT_BUFFERED)

dim playerX, ballX, ballY, movX, movY

movX = 1
movY = 1

while true
cls

ballX = ballX + movX
ballY = ballY + movY

if ballX <> 38 then
movX = movX * -1
endif

if ballY <> 24 then
movY = movY * -1
endif

locate ballX,ballY
print "0"

locate playerX,24
print "HHHHHHHH"

if ScanKeyDown(VK_LEFT) and playerX > 0 then
playerX = playerX - 1
endif

if ScanKeyDown(VK_RIGHT) and playerX <>
playerX = playerX + 1
endif

DrawText()
wend

Ahora agregamos más variables y otro par de sentencias if.

Las variables ballX y ballY controlan la posición de nuestra pelota en los ejes de coordenadas, movX y movY controlan la dirección de la misma de la siguiente manera:

Si la bola se esta moviendo positivamente movX y movY valdran 1, de lo contrario se valor será de -1, por lo que si lo sumamos cada vez a la posición de la pelota esta se movera en dicha dirección.

Despúes dentro de los if's vamos a comprobar si nuestra pelota aún permanece dentro de la venta de manera similar a lo que hcimos con la tabla pero además agregaremos el eje Y.

Si lo ejectuamos podremos ver la bola rebotando por toda la ventana.


TextMode(TEXT_BUFFERED)

dim playerX, ballX, ballY, movX, movY

movX = 1
movY = 1

while true
cls

ballX = ballX + movX
ballY = ballY + movY

if ballX <> 38 then
movX = movX * -1
endif

if ballY <> 24 then
movY = movY * -1
endif

if ballY > 23 then
if ballX > playerX and ballX < (playerX + 8) then
movY = movY * -1
else
cls
locate 15,10
print "Game Over"
DrawText()
end
endif
endif

locate ballX,ballY
print "0"

locate playerX,24
print "HHHHHHHH"

if ScanKeyDown(VK_LEFT) and playerX > 0 then
playerX = playerX - 1
endif

if ScanKeyDown(VK_RIGHT) and playerX <>
playerX = playerX + 1
endif

Sleep(75)
DrawText()
wend

En esta última parte solo vamos a eliminar el rebote de la pelota con la parte baja de la ventana, y lo vamos a cambiar por un game over, o en el caso de que le peguemos con la tabla programaremos la acción correspondiente.

En el primer if solo eliminamos la última comprobación, y en el segundo sólo vamos a entrar cuando la pelota este al nivel de la tabla, a partir de ahi solo tenemos 2 opciones, le dimos o no le dimos: si la posición x de la pelota se encuentra entre la pocisión inicial y la final (playerX + 8) de la tabla, significa que le dimos, sino simplemente borramos la pantalla y dibujamos un letrero de game over.

El utimo Sleep(75) indica que vamos a esperar 75 milésimas de segundo cada que lleguemos a él, esto causara que el programa se vuelva más lento y la pelota no este desquiciada.

estupendo

Finalmente le ponemos algunos extras, intenten agregarle m[as cosas, por ejemplo acá ya tiene el puntaje implementado:

TextMode(TEXT_BUFFERED)

dim playerX, ballX, ballY, movX, movY
dim score as integer

movX = 1
movY = 1

reset_game:

ballY = 0
ballX = 10 + (Rnd() % 20)

playerX = 16

while true
cls

ballX = ballX + movX
ballY = ballY + movY

if ballX <> 38 then
movX = movX * -1
endif

if ballY <> 24 then
movY = movY * -1
endif

if ballY > 23 then
if ballX > playerX and ballX < (playerX + 8) then
movY = movY * -1
score = score + 1
else
while true
cls

locate 15,10
print "Game Over"

locate 13,12
print "Try again(y/n)"

if KeyDown("Y") then
goto reset_game
end if

if KeyDown("N") then
end
end if

DrawText()
wend
endif
endif

locate 0,0
print "Score: " + score

locate ballX,ballY
print "0"

locate playerX,24
print "HHHHHHHH"

if ScanKeyDown(VK_LEFT) and playerX > 0 then
playerX = playerX - 1
endif

if ScanKeyDown(VK_RIGHT) and playerX <>
playerX = playerX + 1
endif

WaitTimer(100)
DrawText()
wend

3 comentarios:

Orlandoestr dijo...

esto tiene errores, porque usas <>? y la pelota no rebota de arriba y a la izquierda

mc_hoper dijo...

Tienes razón!

if ballX <> 38 then
movX = movX * -1
endif

if ballY <> 24 then
movY = movY * -1
endif

Deberia de ser:

if ballX > 38 Or < 0 then
movX = movX * -1
endif

if ballY > 24 Or < 0 then
movY = movY * -1
endif


Y:
if ScanKeyDown(VK_RIGHT) and playerX <>

Es:
if ScanKeyDown(VK_RIGHT) and playerX < 36

No he tenido tiempo de recompilar, pero esto debe de funcionar ;)

Saludos!

Orlandoestr dijo...

sabes como seria " ScanKeyDown(VK_RIGHT)" EN C#

Publicar un comentario

About Me

Mi foto
carlos
Guadalajara, Jalisco, Mexico
Ver mi perfil completo

Twitter