🐍🎮 Tutorial básico en Range: Movimiento con WSAD usando Python

🎯 Objetivo del tutorial

El objetivo de este tutorial es darte una introducción clara y práctica a la programación en Range, para que puedas comenzar a crear comportamientos interactivos dentro de tus proyectos.

A lo largo del contenido, aprenderás los conceptos básicos necesarios para trabajar con scripts, entender cómo se ejecuta la lógica en tiempo real y cómo controlar objetos dentro del motor. Esto te permitirá dar el salto de escenas estáticas a sistemas dinámicos y funcionales.

Al finalizar, contarás con las bases necesarias para seguir desarrollando tus propias mecánicas y profundizar en la programación dentro de Range.


Cuando comienzas en Range Engine, uno de los primeros pasos es aprender a mover objetos dentro de la escena. En este tutorial veremos cómo controlar un cubo usando W, A, S, D mediante Python.

🧱 Paso 1: Preparar la escena

  1. Abre Range
  2. Usa la escena por defecto
  3. Selecciona el cubo

⚙️ Paso 2: Crear el script en Python

Ve al Text Editor y crea un script llamado movimiento.py:

Y copia y pega el siguiente script:

import Range  # Módulo principal del motor

def main():
    # Obtenemos el controlador actual
    cont = Range.logic.getCurrentController()
    
    # Objeto dueño del script (el cubo)
    own = cont.owner
    
    # Acceso al teclado
    keyboard = Range.logic.keyboard

    # Velocidad de movimiento
    speed = 0.1

    # Estado de las teclas
    keys = keyboard.events

    # --------------------------------------------------
    # Movimiento hacia adelante (W)
    # --------------------------------------------------
    if keys[Range.events.WKEY] == Range.logic.KX_INPUT_ACTIVE:
        # Movimiento en eje local Y positivo
        own.applyMovement((0, speed, 0), True)

    # --------------------------------------------------
    # Movimiento hacia atrás (S)
    # --------------------------------------------------
    if keys[Range.events.SKEY] == Range.logic.KX_INPUT_ACTIVE:
        # Movimiento en eje local Y negativo
        own.applyMovement((0, -speed, 0), True)

    # --------------------------------------------------
    # Movimiento hacia la izquierda (A)
    # --------------------------------------------------
    if keys[Range.events.AKEY] == Range.logic.KX_INPUT_ACTIVE:
        # Movimiento en eje local X negativo
        own.applyMovement((-speed, 0, 0), True)

    # --------------------------------------------------
    # Movimiento hacia la derecha (D)
    # --------------------------------------------------
    if keys[Range.events.DKEY] == Range.logic.KX_INPUT_ACTIVE:
        # Movimiento en eje local X positivo
        own.applyMovement((speed, 0, 0), True)

El procedimiento sería así:

🧩 Sobre el código

Si al ver este script sientes que hay partes que no entiendes del todo, no te preocupes — es completamente normal.

Cuando se empieza a programar en Range Engine, es muy común trabajar primero con código que uno no escribió. Esto no solo es válido, sino que forma parte natural del proceso de aprendizaje.

👉 Lo importante en esta etapa no es memorizar todo, sino familiarizarte poco a poco con los comandos, la estructura y la lógica del código.

Con el tiempo, empezarás a reconocer patrones:

  • cómo se accede a los objetos

  • cómo se leen inputs

  • cómo se aplican acciones

Y sin darte cuenta, muchos de estos elementos se irán quedando en tu memoria.

💡 Con práctica constante, experimentar y hacer pequeños cambios por tu cuenta, la programación comenzará a sentirse cada vez más natural y fluida.


🔗 Paso 3: Conectar el script

Con el cubo seleccionado:

  • 🟣 Sensor: Always
    • Activa True Level Triggering (Pulse)
  • ⚙️ Controller: Python (Module)
    • Escribe: movimiento.main

Conecta el sensor al controlador.

 

🧠 ¿Cómo funciona el sensor Always?

Esta combinación de bloques de lógica se puede interpretar de la siguiente manera:

El sensor Always es, literalmente, un sensor que se activa constantemente. Esto significa que ejecutará en cada frame todo lo que esté conectado a él, ya sea un script en un controlador o un actuador a través de un controlador.


🔁 True Level Triggering

Aquí es donde entra uno de los puntos más importantes:

  • Activado (True Level Triggering)
    El sensor se ejecuta continuamente en cada frame.
  • Desactivado
    El sensor se ejecuta solo una vez.

👉 En otras palabras, este botón define si el comportamiento es continuo o puntual.


⏱️ Parámetro Skip

El parámetro Skip controla la frecuencia con la que se envía la señal de activación.

  • Skip = 0 → Se ejecuta en cada frame (máxima fluidez)
  • Skip = 1 → Se salta un frame entre ejecuciones
  • Skip = 60 → Aproximadamente una ejecución por segundo (dependiendo del framerate)

👉 Es una forma sencilla de “dosificar” la ejecución sin necesidad de código adicional.


⚙️ ¿Por qué usamos esta configuración?

En este tutorial buscamos un movimiento fluido y continuo, por lo tanto usamos:

  • True Level Triggering activado
  • Skip = 0

Esto asegura que el script se ejecute en cada frame, permitiendo una respuesta inmediata al input del jugador.


💡 Ejemplo práctico

Estos detalles son importantes para entender cuándo usar cada configuración.

Por ejemplo:

👉 Si conectas un sensor Always a un actuador de tipo Motion sin controlar la frecuencia, el objeto se moverá constantemente sin detenerse.

👉 Pero si desactivas True Level Triggering, el movimiento solo ocurrirá una vez.

Este tipo de configuraciones son fundamentales para comprender cómo fluye la lógica dentro de Range Engine y cómo se sincroniza con el game loop del motor.


▶️ Paso 4: Ejecutar

Presiona P para iniciar.

Ahora puedes mover el cubo:

  • W → adelante
  • S → atrás
  • A → izquierda
  • D → derecha


🧠 ¿Qué está pasando?

Cada frame:

  1. El sensor Always ejecuta el script
  2. Se detecta la entrada del teclado
  3. Se aplica movimiento al objeto

Esto ocurre dentro del famoso game loop del motor.


🌍 vs 🧭 Coordenadas globales y locales

Este punto es clave 👇

🌍 Coordenadas globales (world)

own.worldPosition.x += 0.1
  • Basadas en los ejes del mundo
  • No dependen de la rotación del objeto
  • Útiles para lógica simple

👉 Problema: si el objeto gira, el movimiento puede sentirse incorrecto


🧭 Coordenadas locales (local)

own.applyMovement((0, 0.1, 0), True)
  • Relativas al objeto
  • Se adaptan a su rotación
  • Son las más usadas en videojuegos

👉 Resultado:
W siempre mueve hacia “adelante” del objeto, sin importar su orientación

Para comprobarlo vamos a añadir un sensor Mouse y cambia el tipo de sensor a “Movement”, después conecta con un controlador And y un Actuador Mouse y veremos el resultado

Aqui tienes el archivo resultante del tutorial, en caso de que prefieras estudiarlo directamente y aprender de el.

 


💡 Conclusión

Este es un ejercicio básico, donde ya se te proporciona el script listo para usar. La intención no es que memorices el código, sino que comiences a entender cómo está estructurado y cómo se conecta dentro del flujo de trabajo en Range Engine.

A partir de aquí, es importante que poco a poco te adentres en la API del motor, ya que existen muchas otras formas de manipular objetos: desde físicas, rotaciones, inputs más avanzados, hasta sistemas completos de interacción.

👉 Este tipo de ejercicios son el primer paso para pasar de usar lógica visual a pensar en código, que es donde realmente tienes mayor control sobre el comportamiento de tu juego.


🧠 ¿Y ahora qué?

Bienvenido al desarrollo real con Range Game Engine 😄:

  • 📖 Leer documentación
  • 🐌 Optimizar código
  • 🖨️ Usar print() para depurar
  • 😵‍💫 Desesperarte un poco

Pero Range + Python te permite hacer MUCHÍSIMAS cosas 🎮🔥.

No es fácil ❌
Pero vale totalmente la pena

La programación es un juego de paciencia y perseverancia 🧘‍♂️💻.

En el siguiente tutorial con python usaremos código para mandar llamar actuadores y sensores para activarlos o desactivarlos en tiempo real.

🍀 ¡Buena suerte y feliz scripting en Range!

Leave a Reply

Your email address will not be published. Required fields are marked *