Archivo de la etiqueta: Tutorial

Interprete de comandos fish

Resultado de imagen para persona tecleando

A muchos usuarios de sistemas tipo Unix nos parece que la interfaz de linea de comandos es una maravilla a la hora de manejar un sistema. Todos hemos trabajado con bash por ser el más estandarizado pero no es el único, como es el cazo de fish.

Sobre fish

Fish es una shell «exótica» puesto que tiene muchas diferencias contra las más comunes. Busca ser rápida, amigable, personalizable y con muchas facilidades.

Uso básico

Si queremos probar fish debemos teclear fish en la terminal. Por otro lado si nos ha gustado y queremos establecerla como la shell por defecto usamos chsh -s /usr/bin/fish $USER e introducimos nuestra contraseña.

Lo que notamos al inicio de usar fish es el resaltado de colores que da a los comandos para separar visualmente las partes de este y facilitar su lectura y/o escritura.

La predicción de comandos es algo que destaca en fish, mostrándolos en gris y siguiendo prediciendo según vayamos escribiendo el comando. Para esto toma en cuanta el directorio en que estemos, los comandos recientes, los más frecuentes, etc.

Para autocompletar el comando debemos presionar la tela de flecha que apunta a la derecha.

Tambien podemos usar el autocompletado estilo bash que es de poco a poco usando la tecla tab.

Si son varias las posibilidades nos enlistara las posibles secuencias siguientes y podremos cambiar entre ellas usando la tecla tab y seleccionando una con enter.

En este modo podremos comenzar a teclear para hacer una búsqueda entre las posibilidades, se selecciona usando enter.

fish nos proporciona facilidades para escribir comandos de una manera simple. Por ejemplo en lugar de hacer cd Descargas/, podremos usar simplemente Descargas/

Personalizacion

Tendremos una interfaz web para personalizar el prompt a la cual se accede ejecutando fish_config. En la seccion color podemos indicar algun esquema de colores de nuestra preferencia.

En la sección prompt tendremos algunos para cambiar el que trae por defecto.

Los prompts nos añaden muchas funciones más, no solo mostrar datos de la maquina y el directorio. Se integra con git para mostrar cambios si tenemos un repositorio, la rama, versión…

Sin duda fish es una herramienta excelente para el uso de la linea de comandos.

Pasar entre tiles con OneWayCollision – Godot Engine

Hace unos días publiqué un tutorial en YouTube donde enseñaba la propiedad OneWayCollision para pasar entre «paredes» al estilo de Mario Bros. 

Aquí les escribiré un resumen sobre la propiedad que deben activar para tener el efecto. 

Crear/Editar los tiles que necesitamos

Vamos a dirigirnos a la escena donde guardemos los TileSet del juego, tenemos que seleccionar los tiles por los que queremos pasar sin activar la colisión, recuerden que la colisión se activará cuando nos encontremos encima del tile. 

Yo quiero que el único tile que me permita pasar entre él, sea el que tiene grama. Para eso abrimos su CollisionShape y activamos la propiedad OneWayCollision, así nos saldrá una línea indicando que sólo se activará la colisión cuando el jugador caiga en la parte de arriba del bloque.

Ya con esto podemos pasar entre el sin activar su colisión. Un bonito efecto para un juego de plataformas. 

Instanciar balas de nave espacial en Godot Engine

Una buena parte de los desarolladores indie han realizado un “Space Shooter” en su vida. Si quieres aprender a realizar los “disparos” con una nave espacial desde Godot, pasemos al artículo.

Nodos para la nave del jugador

Doy por hecho que su nave ya esta preparada: es un nodo KinematicBody2D y tiene su imagen. Además de eso, vamos a crear un nuevo nodo llamado “Position2D”, seguro adivinarán que se trata de una posición que podemos asignar en cualquier parte de la escena. La colocamos por encima del jugador, a cierta distancia.

Escena de la bala

La bala se creará por separado. Al igual que el jugador, su nodo principal es un KinematicBody2D que llamaremos “Bala”. Dentro de ella crearemos su Sprite y el CollisionShape2D, la guardamos con Control+S y añadimos un nuevo Script.

Script de la bala

Tienen permiso para eliminar todas las líneas de comentario. En el principio vamos a añadir dos variables:

var dir = -1
var speed = 500

La variable “dir” define la dirección que debe tomar la bala cuando es instanciada en la escena. Si es -1 subirá y en 1 bajará.

Activamos la función “_process()” y dentro de ella ponemos lo siguiente:

func _process(delta):
	var move = move_and_collide(Vector2(0,dir*speed*delta))
	if move != null:
		if move.collider.is_in_group("Enemigos"):
			move.collider.queue_free()
		elif move.collider.is_in_group("Jugador"):
			move.collider.queue_free()
		
		self.queue_free()
	
	if global_position.y > 720 || global_position.y < 0:
		self.queue_free()

La variable “move” sólo se puede usar dentro de la función _process(), es una variable local. Le ponemos un “move and collide” de valor, ya que esa función se usa para mover cuerpos Kinematic y consume menos recursos que un “move_and slide”. Al ser una función de movimiento, le vamos a pasar un parámetro de Vector2().

Dentro del Vector2() vamos a colocar nuestra formula de movimiento para que la bala se mueva. Su segundo parámetro corresponde al eje “Y” (el vertical). Como nuestra bala se moverá hacía arriba, sólo usaremos el eje vertical. La operación “dir*speed*delta” hará que cada segundo se aplique la aceleración en la bala, así veremos como se mueve en la escena. Cuando “dir” es negativo hace que la aceleración también sea negativa, pero cuando “dir” es positivo la aceleración queda positiva y la bala se mueve para abajo.

Cuando quieran comprobar una colisión con la bala, usan lo siguiente:

if move != null:
		if move.collider.is_in_group("Enemigos"):
			move.collider.queue_free()
		elif move.collider.is_in_group("Jugador"):
			move.collider.queue_free()

En caso de que la variable “move” no valga “null”, significa que chocamos con algo. Para saberlo usamos “move.collider” eso indica con que nodo chocamos. Ustedes se pueden inventar muchas cosas a partir de eso, yo pondré esto:

Si el “collider” sea quien sea, se encuentra en el grupo de “Enemigos” o “Jugador”, entonces elimina al collider.

Además, cada vez que la variable “move” sea verdadera eliminamos a la bala con self.queue_free().

Por último en el script de la “bala”, vamos a decir que si la posición en el eje «Y» es mayor que “720” (El 720 lo pueden cambiar por el tamaño de pantalla en “altura” que tengan en la configuración de ventana), entonces se autodestruye. En caso de que sea menor que 0, también la autodestruyes. Cuando sea menor que 0 es porque salió de la pantalla y esta muy alto.

Aquí cambiamos el 720 de altura por el numero que quieran…

Script del jugador

Ya que tenemos una bala para instanciar, vamos con el script del jugador. Primero vamos a añadir esta variable:

var bala = load("res://Bala/Bala.tscn")

Con el «load» estamos cargando un recurso de nuestra carpeta de proyecto. La ruta de la escena que contiene la bala la podemos obtener así:

Clic derecho en el recurso que queramos y después «Copiar ruta»

En la función _process() del jugador añadimos lo siguiente:

if Input.is_action_just_pressed("disparar"):
		_disparar()

El «Input.is_action_just_pressed()» va a ser verdadero cada vez que se presione una vez la acción que indiquemos como parámetro, en este caso estoy usando una acción llamada «disparar». La podemos crear de la siguiente manera:

La función _disparar() tampoco esta creada, la vamos a definir para poner el siguiente código:

func _disparar():
	var newBala = bala.instance()
	get_parent().add_child(newBala)
	newBala.global_position = $pos_bala.global_position
	newBala.dir = -1

Cada vez que hagamos clic en el botón de espacio (se active la acción disparar), una nueva variable «newBala» creará una instancia de la variable bala que creamos arriba.

Esa nueva instancia se volverá hija del padre del jugador. Con get_parent estamos accediendo al nodo que sea padre de la escena portadora del script, en nuestro caso, el jugador es el que esta usando el «get_parent». Ya con el add_child estamos colocando a la nueva instancia como hija del padre (hermana del jugador :p).

Recuerden que para acceder a las propiedades de un nodo sólo tienen que poner el «.» después de una variable que contenga la instancia del nodo. newBala contiene al nodo de la bala, si usamos un «.» vamos a poder acceder a sus propiedades. Colocamos su posición global igual a la posición global del nodo «pos_bala» que fue el nodo que añadimos junto con entrar en el tutorial.

Con el signo de dólar ($) podemos acceder a los nodos que sean hijos del portador del script. En nuestro caso desde el jugador podemos acceder al pos_bala, el Sprite y el CollisionShape.

Ya con esto hemos terminado el tutorial. Espero que sea de su agrado y aprendan algo :).

Puedes acceder al código del proyecto buscando «SpaceShip» en la Biblioteca De demos: https://gitlab.com/indielibre/bdd/