Basic4GL Pong
domingo, septiembre 14, 2008 |
Bloggeado por
carlos |
Editar entrada
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()
wendprint "0"
locate 10,40
print "HHHHHHHH"
DrawText()
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
if ScanKeyDown(VK_RIGHT) and playerX <>
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
if ballY <> 24 then
locate ballX,ballY
print "0"
locate playerX,24
print "HHHHHHHH"
if ScanKeyDown(VK_LEFT) and playerX > 0 then
if ScanKeyDown(VK_RIGHT) and playerX <>
DrawText()
wendballX = ballX + movX
ballY = ballY + movY
if ballX <> 38 then
movX = movX * -1
endifif ballY <> 24 then
movY = movY * -1
endiflocate 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()
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
if ballY <> 24 then
if ballY > 23 then
locate ballX,ballY
print "0"
locate playerX,24
print "HHHHHHHH"
if ScanKeyDown(VK_LEFT) and playerX > 0 then
if ScanKeyDown(VK_RIGHT) and playerX <>
Sleep(75)
DrawText()
wendballX = ballX + movX
ballY = ballY + movY
if ballX <> 38 then
movX = movX * -1
endifif ballY <> 24 then
movY = movY * -1
endifif ballY > 23 then
if ballX > playerX and ballX < (playerX + 8) then
endif movY = movY * -1
else cls
locate 15,10
print "Game Over"
DrawText()
end
endiflocate 15,10
print "Game Over"
DrawText()
end
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()
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.
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
if ballY <> 24 then
if ballY > 23 then
locate 0,0
print "Score: " + score
locate ballX,ballY
print "0"
locate playerX,24
print "HHHHHHHH"
if ScanKeyDown(VK_LEFT) and playerX > 0 then
if ScanKeyDown(VK_RIGHT) and playerX <>
WaitTimer(100)
DrawText()
wend
ballX = ballX + movX
ballY = ballY + movY
if ballX <> 38 then
movX = movX * -1
endifif ballY <> 24 then
movY = movY * -1
endifif ballY > 23 then
if ballX > playerX and ballX < (playerX + 8) then
endif
endif 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
if KeyDown("N") then
DrawText()
wendlocate 15,10
print "Game Over"
locate 13,12
print "Try again(y/n)"
if KeyDown("Y") then
goto reset_game
end ifif KeyDown("N") then
end
end if DrawText()
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
endifif ScanKeyDown(VK_RIGHT) and playerX <>
playerX = playerX + 1
endifWaitTimer(100)
DrawText()
Suscribirse a:
Comentarios de la entrada (Atom)
3 comentarios:
esto tiene errores, porque usas <>? y la pelota no rebota de arriba y a la izquierda
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!
sabes como seria " ScanKeyDown(VK_RIGHT)" EN C#
Publicar un comentario