Grundlage ist der Visionaire Studio Guide von Chris Tikkos (Dionous Games), hier mit seiner Erlaubnis veröffentlicht. Die Befehle stehen in der Referenz Globale Befehle.

Maus einrichten

Die Mausaktionen legst du unter „Game Properties > Mouse Properties“ fest:

Mauseinstellungen in den Spieleinstellungen
Mauseinstellungen in den Spieleinstellungen

Über den Blitz-Knopf fügst du Aktionsteile hinzu, die bei Mausereignissen laufen, zum Beispiel bei Links-, Rechts- oder Doppelklick und beim Drehen des Mausrads. Hier legst du auch fest, ob der spielbare Charakter zur angeklickten Stelle läuft, nur beim Klick auf ein Objekt losläuft oder gar nicht.

Dasselbe geht mit Lua:

-- Linksklick schickt den Charakter nicht zur Mausposition
game.LeftClickBehaviour = eMouseActionBehaviourDoNotSendCharacter

Für die anderen Tasten nimmst du game.RightClickBehaviour, game.MiddleClickBehaviour und game.LeftHoldBehaviour. Statt der Namen kannst du auch die Zahlen des Enums verwenden:

  • 0 = eMouseActionBehaviourDoNotSendCharacter: Der Charakter läuft nicht zur Position.
  • 1 = eMouseActionBehaviourSendCharacterToCursor: Der Charakter läuft zur Position.
  • 2 = eMouseActionBehaviourSendCharacterToObjects: Der Charakter läuft nur dorthin, wenn an der Position ein Szenenobjekt ist.

Mausereignisse mit Lua verarbeiten

Volle Kontrolle bekommst du mit einem Ereignis-Handler für Mausereignisse in einem Definitionsskript:

function onMouseEvent(eventType, mousePosition)
  if eventType == eEvtMouseWheelUp or eventType == eEvtMouseWheelDown then
    -- das Mausrad wurde bewegt, etwas tun
  end
end

registerEventHandler("mouseEvent", "onMouseEvent", {eEvtMouseWheelUp, eEvtMouseWheelDown})

Die Handler-Funktion bekommt immer zwei Argumente: eventType, eines der Ereignisse aus der registrierten Liste, und mousePosition, die aktuelle Position (x, y). Gibst du keine Liste an, erhält der Handler alle Mausereignisse. Unterstützte Ereignisse:

  • eEvtMouseMove
  • eEvtMouseLeftButtonDoubleClick, eEvtMouseLeftButtonDown, eEvtMouseLeftButtonUp, eEvtMouseLeftButtonHold, eEvtMouseLeftButtonHolding
  • eEvtMouseRightButtonDoubleClick, eEvtMouseRightButtonDown, eEvtMouseRightButtonUp
  • eEvtMouseMiddleButtonDown, eEvtMouseMiddleButtonUp
  • eEvtMouseWheelUp, eEvtMouseWheelDown

Etwas wiederholen, solange eine Taste gedrückt ist

Kombiniere einen Maus-Handler mit einem mainLoop-Handler. Nimm dabei einen einzigen Maus-Handler, der den Ereignistyp prüft:

local buttonPressed = false

function onMainLoop()
  if buttonPressed then
    -- läuft in jedem Frame, solange die linke Taste gedrückt ist
  end
end

function onMouseButtons(eventType, mousePosition)
  if eventType == eEvtMouseLeftButtonDown then
    buttonPressed = true
  elseif eventType == eEvtMouseLeftButtonUp then
    buttonPressed = false
  end
end

registerEventHandler("mouseEvent", "onMouseButtons", {eEvtMouseLeftButtonDown, eEvtMouseLeftButtonUp})
registerEventHandler("mainLoop", "onMainLoop")

Gamepads

Visionaire nutzt die Bibliothek SDL, deshalb funktioniert jeder Controller, den SDL unterstützt. Lade gamecontrollerdb.txt herunter und lege die Datei in deinen Spielordner. Sie enthält Zuordnungen für fast alle Controller; eigene kannst du mit Mapping-Werkzeugen ergänzen.

Gamepad-Tasten kommen als Tastaturereignisse an. Die Schultertasten erkennst du so in deinem Tastatur-Handler:

function keyboardHandler(eventType, character, keycode, modifiers)
  if string.match(character, "TRIGGERLEFT") then
    if keycode > 1 then print("left trigger pressed") else print("left trigger released") end
  elseif string.match(character, "TRIGGERRIGHT") then
    if keycode > 1 then print("right trigger pressed") else print("right trigger released") end
  end
  return false
end

registerEventHandler("keyEvent", "keyboardHandler")

Ein Adventure lässt sich auf zwei Arten mit dem Gamepad steuern:

  • Den Charakter direkt bewegen. Prüfe mit Aktionsbereichen oder Lua, ob der Charakter neben einem Objekt steht, mit dem er etwas tun kann. Wird die Aktionstaste gedrückt, prüfst du, ob er im Bereich oder in einem bestimmten Umkreis ist.
  • Den Mauszeiger wie eine Maus bewegen.

Pro Ereignistyp ist nur ein Handler erlaubt (außer bei mainLoop). Hat dein Spiel schon einen Tastatur-Handler, baust du die Abfrage der Schultertasten dort ein. Einen vollständigen Tastatur-Handler findest du unter Überspringen von Videos und Zwischensequenzen verhindern.