Para editar los ejemplos aconsejamos usar el editor de textos por defecto en los MSXVR:

C:>edit ejemplo1.pi

Para ejecutar los ejemplos, o bien podemos desde el editor pulsando a la vez CTRL+R o bien desde el VR-DOS ejecutando el script:

C:>ejemplo1

Hola mundo en VR-DOS

class Ejemplo1 implements DOS_Program
{
   virtual Start()
   {
      _console = GetDOS().GetConsole();
      _console.PrintLn("Hola mundo!!");
      _console.Input("", null, 1);
      End(0);
   }
}

En este sencillo ejemplo, mostraremos un texto en la consola del VR-DOS y esperaremos a que el usuario pulse una tecla para finalizar el programa.

Hola mundo en VR-VIEW

class Ejemplo2 implements VIEW_Program
{
   virtual Start()
   {
      _wnd = CreateWindow();
      _menu = _wnd.CreateMenu();
      _section = _menu.AddSection("File");
      _section.AddItem("Exit", this, "End");
      _label = _wnd.CreateLabel(10, 10, 200, 200);
      _label.SetText("Hola mundo!!");
   }    

   function End()
   {
      End(0);
   }
}

Este ejemplo es similar al anterior, pero en este caso crearemos una etiqueta en la ventana. Para tener opción de salir del programa, crearemos un menú con una única opción de salir.

Hola mundo en VR-BASIC

class Ejemplo3 implements BASIC_Program
{
   virtual Start()
   {
      Screen (0);
      Color (15, 1, 1);
      Cls ();
      KeyOff ();
      Print("Hola mundo!");
   }
}

Este ejemplo muestra como crear una versión del «Hola mundo!» pero utilizando la interfaz BASIC_Program. Primero se inicializa a modo de pantalla Screen 0 (40×24 caracteres), luego configura el color de texto en blanco, fondo de pantalla y borde en negro. Después desactiva la información en pantalla de las teclas de función para finalmente imprimir el texto.

Si quieres cerrar el ejemplo, pulsa CTRL+C o CTRL+STOP.

Detectar un cartucho OPL4 en alguna de las ranuras

class Ejemplo4 implements DOS_Program
{
   virtual Start()
   {
      _console = GetDOS().GetConsole();
      _gr = GetEngine().GetGeekReader();
      _data = _gr.Inp(0xC4);
      if (_data != 0xFF)
      {
         _console.PrintOK("OPL4 encontrado");
      }
      else
      {
         _console.PrintError("OPL4 no existe");
      }
      End(0);
   }
}

En este ejemplo detectamos si existe algún cartucho OPL4 insertado en alguna de las ranuras del ordenador. Por defecto INP lee de cualquiera de las ranuras. Si el valor leído es distinto de 255 (0xFF en notación hexadecimal), es que el cartucho responde.

Detectar un cartucho FMPAC/MSX‑MUSIC en alguna de las ranuras

class Ejemplo5 implements DOS_Program
{
   virtual Start()
   {
      _found = false;
      _console = GetDOS().GetConsole();
      _gr = GetEngine().GetGeekReader();
      _buffer = Buffer_New(8);
      for (i=0; i<4; i++)
      {
         _gr.ReadMemory(i, 0x4018, _buffer, 0, 8);
         _idStr = Buffer_GetString(_buffer);
         if (String_FindStr(_idStr, "OPLL"))
         {
            _console.PrintOk("ID:" + _idStr + " Encontrado en la ranura:" + string(i+1));
            _found = true;
            break;
         }
      }
      Buffer_Delete(_buffer);
      if (!_found)
      {
         _console.PrintError("FMPAC no encontrado!");
      }
   }
}

En este ejemplo vamos a comprobar si existe algún cartucho FMPAC insertado en alguna de las ranuras. Esto se consigue leyendo datos de cada ranura, concretamente de la dirección hexadecimal 0x4018. Generalmente esta marca va a poder ser APRLOPLL o PAC2OPLL. La primera se encuentra en los FMPAC internos, por tanto en principio jamás veremos ese identificador. En el caso del cartucho externo, sí encontraremos la segunda. Para acertar siempre, miraremos que exista siempre la cadena «OPLL» en el identificador.

En caso de no existir ningún cartucho en una ranura, cualquier byte que leamos siempre será 255 (0xFF en notación hexadecimal).

Pelotas Rebotonas en VR-GL

class Ejemplo6 implements GL_Program
{
   virtual Start()
   {
      SetBgColor(RGB(0,0,0));
      for (i=0; i<5; i++)
      {
         _ball = NewSprite("spr" + string(i));
         _size = rand(5, 10);
         _ball.AddEmptyFrame(_size, _size);
         _ball.SetColor(RGB(255,255,255));
         _ball.SetPos(rand(10, 100), rand(10, 100));
         _controller = _ball.CreateController();
         _controller.SetSpeed(rand(-4, 4), rand(-4, 4));
         _controller.SetCustom(this, "OnBallMove");
      }
   }

   function OnBallMove(_controller)
   {
      _ball = _controller.GetTarget();
      _ball.IncPos(_controller.GetSpeedX(), _controller.GetSpeedY());    

      if (_ball.GetX() < 0 || _ball.GetX() >= GetResX())
         _controller.SetSpeedX(-_controller.GetSpeedX());
      if (_ball.GetY() < 0 || _ball.GetY() >= GetResY())
         _controller.SetSpeedY(-_controller.GetSpeedY());
   }
}

En este ejemplo, crearemos 5 sprites con tamaños y posiciones aleatorias. Como no usaremos texturas, agregaremos un fotograma vacío y usaremos el color blanco como color por defecto. A cada sprite se le asociará un controlador con el que poder aplicar la lógica de cada pelota. Esta lógica consiste en mover la pelota en una dirección y detectar si tocamos los límites de la pantalla. En el caso de que toquemos alguno de los límites, cambiaremos el sentido (signo) de la dirección.

es_ESSpanish