image image


image

Abenteuer TIC-80: Steuerung der Spielfigur mit der Tastatur

Ich hatte Euch gewarnt! Die Programmierung der kleinen Fantasiekonsole TIC-80 macht mir soviel Spaß, daß ich Euch unbedingt an meinen Fortschritten teilhaben lassen muß. Da müßt Ihr jetzt durch, da habt Ihr keine andere Chance. In meinem ersten Beitrag möchte ich Euch zeigen, wie Ihr die Spielfigur mit Hilfe der Tastatur durch das Spielfeld bewegen könnt – auch diagonal:

image

Dazu braucht es erst einmal einen Sprite des Spielers. Ich habe aus meinen ersten Versuchen (und Mißerfolgen) gelernt und weiß nun, das es sinnvoll ist, die Sprites nicht zu überfrachten und mit möglichst wenigen Farben auszukommen. Daher habe ich den Player-Character recht einfach gehalten. Wie der Screenshot oben im Banner zeigt, ist das der Sichtbarkeit des Sprites zugute gekommen.

image

Dann braucht es natürlich Tiles, und sei es auch nur, um das Spielfeld aufzuhübschen. Beim momentanen Stand des Spieles bestehen die Tiles aus zwei Kategorien: Tiles, über die die Spielfiguren drüberlaufen können (Grund) und Tiles, die die Spielfiguren stoppen (Wände, Bäume und der Fluß). Diesen Tiles habe ich schon im Editor (siehe Screenshot links oben) einen Flag spendiert – der Flag 0 ist gesetzt. Denn mit dem Befehl

fget(mget(x, y), 0) == false

kann ich im Script abfragen, ob der Flag 0 (nicht) gesetzt ist und nur dann, wenn der Flag nicht gesetzt ist, der Spielfigur den nächsten Zug erlauben, andernfalls wird sie einfach gestoppt.

Für die Bewegung der Figuren habe ich beim Potato Imaginator eine ziemlich geniale Lösung gefunden: Er hat zwei (Lua-) Tabellen (in Python wären das Listen) mit Richtungsvektoren für die x- und y-Komponenten aufgestellt. In seinem Beispiel läuft der Spieler nur horizontal und vertikal, daher bestehen seine Tabellen nur aus jeweils vier Elementen:

dir_x = {[0] = 0, 0, -1, 1}
dir_y = {[0] = -1, 1, 0, 0}

Da ich aber auch diagonale Bewegungen erlauben möchte, mußte ich die Richtungsvektoren auf je acht Elemente (je eine für Nord, Süd, Ost, West, Nordost, Südost, Nordwest und Südwest – in dieser Reihenfolge) erweitern:

dir_x = {[0] = 0, 0, -1, 1,-1, -1, 1, 1}
dir_y = {[0] = -1, 1, 0, 0,-1, 1, -1, 1}

Lange habe ich dann an dem Problem der Tastaturabfrage geknabbert: Lauf Dokumentation können die Befehle btn() und btnp() acht unterschiedliche Parameter (von 0 bis 7) entgegenehmen. Dabei stehen 0 für BUTTON UP, 1 für BUTTON DOWN, 2 für BUTTON RIGHT, 3 für BUTTON LEFT, 4 für z, 5 für x, 6 für a und 7 für s. Zu Testzwecken hatte ich erst einmal nur z abgefragt und das wollte ums Verrecken nicht funtionieren. Bis ich dann irgendwo verschämt den Hinweis fand, daß diese Tastenzurodnung für eine QWERTY-Tastatur gälte. Hätte ich auch von alleine drauf kommen können. Also für meine (deutsche) QWERTZ-Tastatur also anstelle des z ein y gesetzt und alles war schick.

Das macht ja auch Sinn, auf einer deutschen Tastatur liegen die Tasten für y, x, a und s direkt nebeneinander, man muß sich also für die Steuerung nicht die Finger verrenken.

Nun also das vollständige Programm:

px = 2 		-- Player xpos
py = 2 		-- Player ypos
tx = 22  -- Troll xpos
ty = 12  -- Troll ypos
dir = -1

-- Richtungsvektoren
dir_x = {[0] = 0, 0, -1, 1,-1, -1, 1, 1}
dir_y = {[0] = -1, 1, 0, 0,-1, 1, -1, 1}

function move()
 if dir ~= -1 then
  px = px + dir_x[dir]
  py = py + dir_y[dir]
 end
end

function TIC()
  cls(5)
  map()
  spr(257, 8*px, 8*py, 0) -- Player
  spr(273, 8*tx, 8*ty, 0) -- Troll

  if btnp(0) and    -- North
    fget(mget(px, py - 1), 0) == false then 
      dir = 0
  elseif btnp(1) and -- South
    fget(mget(px, py + 1), 0) == false then
      dir = 1
  elseif btnp(2) and -- East
    fget(mget(px - 1, py), 0) == false then 
      dir = 2
  elseif btnp(3) and -- West
    fget(mget(px + 1, py), 0) == false then 
      dir = 3
  elseif btnp(4) and -- Northeast, y auf deutscher Tastatur
    fget(mget(px - 1, py - 1), 0) == false then
      dir = 4		
  elseif btnp(5) and -- Southeast, x
    fget(mget(px - 1, py + 1), 0) == false then
      dir = 5
  elseif btnp(6) and -- Northwest, a
    fget(mget(px + 1, py - 1), 0) == false then
      dir = 6
  elseif btnp(7) and -- Southwest, s
    fget(mget(px + 1, py + 1), 0) == false then
      dir = 7
  end

  move()
  dir = -1
end

Man kann diese Methode auch verwenden, um mithilfe der Tastatur zwei Figuren (diesmal natürlich beide nur strikt horizontal und vertikal) zu steuern. Der einen Figur ordnet man die Pfeiltasten (btnp(0) bis btnp(3)) zu, die zweite Figur bekommt die Buchstaben y, x, a und s (btnp(4) bis btnp(7)) zugewiesen.

image

Wer das ausprobieren möchte, für den habe ich schon einmal den Sprite eines Trolls entworfen, den er dafür nutzen kann. Aber eigentlich möchte ich in einer späteren Version dieses Spieles, daß der Troll (autonom) den Spieler verfolgt und dabei zumindest den Anschein einer gewissen Intelligenz zeigt. Denn mein Programm heißt schließlich Retrogaming und Künstliche Intelligenz. Still digging!


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image