2010-12-14 GameMaker AG-Protokoll

Aus Fachschaft_Informatik
Version vom 15. Dezember 2010, 12:11 Uhr von 134.100.4.25 (Diskussion) (Die Seite wurde neu angelegt: Protokoll der GameMaker AG-Sitzung am 14.12.2010 Anwesende Personen: ~11 Beginn: 13:05 Uhr == Ablauf == * Wir erweitern PlayerMovement, sodass man bremsen und mehrfa...)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Protokoll der GameMaker AG-Sitzung am 14.12.2010

Anwesende Personen: ~11

Beginn: 13:05 Uhr

Ablauf

  • Wir erweitern PlayerMovement, sodass man bremsen und mehrfach springen kann:
var speed : float;
var brake : float;
var jumpPower : float;
var jumpCount : int = 3;
var pivot :Transform;

private var alive : boolean = true;
private var jumpCounter : int = 3;

function GameEnded()
{
 alive = false;
}

function FixedUpdate () 
{
 if(alive)
 {
  rigidbody.AddForce(pivot.forward * Mathf.Clamp(Input.GetAxis("Vertical"), 0, 1) * speed * Time.deltaTime);
  rigidbody.angularDrag = Mathf.Clamp(Input.GetAxis("Vertical"), -1, 0)* -brake;

  //Sieh unter Dir nach, ob da Boden ist
  if(Physics.Raycast(transform.position, -Vector3.up, 0.25+0.05))
  {
   jumpCounter = jumpCount;
  }
  //Wenn wir Space drücken und wir noch Sprünge übrig haben
  if(Input.GetButtonDown("Jump") && jumpCounter > 0)
  {			
   rigidbody.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
   jumpCounter--;
  }
 }	
}
  • Wir erstellen des Weiteren ein Skript mit GUI.
    • function OnGUI() definieren
    • GUI.xx oder GUILayout.xx im Rumpf aufrufen
    • Offizielles Tutorial hierzu: [klick]
    • Klasse GUI in der Scripting-Referenz: [GUI]
  • Unser Script "PlayerGUI", der dem Spieler nzeigt, ob er noch spielt, gewonnen oder verloren hat, und dem entsprechend einen Knopf für Neustart oder das nächste Level anzeigt:
enum PlayerState
{
 playing,won,lost
}

private var state : PlayerState = PlayerState.playing;

function GameEnded(won : boolean)
{
 if(won)
 {
  state = PlayerState.won;
 }
 else
 {
  state = PlayerState.lost;
 }
}

function OnGUI()
{
 var message : String;
 switch(state)
 {
  case PlayerState.won:
   message = "Du bist der King";	
   if(GUI.Button(Rect(10,44,200,24), "Weiter..."))
   {
    Application.LoadLevel(Application.loadedLevel+1);
   }
  break;
  case PlayerState.lost:
   message ="Du Idiot!";
   if(GUI.Button(Rect(10,44,200,24), "Neustart..."))
   {
    Application.LoadLevel(Application.loadedLevel);
   }
  break;
  default:
   message = "Macht hinne!";				
  break;
 }
 GUI.Box(Rect(10,10,200,24), message);
}
  • Jetzt muss man nur noch unseren WinTrigger so anpassen, dass er in PlayerMovement und PlayerGUI (beide unserer Kugel als Komponente gegeben) jeweils GameEnded() aufruft, bei PlayerGUI mit einem boolean-Parameter (win), der angibt, ob der Trigger das Ziel oder ein "verloren"-Bereich ist:
var win : boolean = false; 

function OnTriggerEnter(other : Collider)
{
 if(other.CompareTag("Player"))
 {
  other.BroadcastMessage("GameEnded", win);
 }
}
  • Muss einem Objekt mit Collider mit isTrigger gegeben werden (haben wir schon erstellt).

Ergebnis

  • Fügt man nun mehrere Level zu den Build Settings hinzu, erhält man ein Spiel mit mehreren Leveln.

Mit der GUI und einer Scene, in der einfach kein steuerbarer Spieler ist, ließe sich z.B. ein Hauptmenü erstellen.

  • Ich habe Prefabs vergessen. Shame on me. Wer mag, darf sich bis zum nächsten Treffen (welches ja eine Weile hin ist) über Prefabs schlau machen: [Prefabs]. Mit Prefabs kann man GameObjects (ggf. samt Children) als Vorlagen speichern, z.B. den Spieler, und dann in jedem Level einfach nur noch einfügen. Genauso das Ziel oder auch einen sich wiederholenden Baustein. Auf Wunsch wird eine Änderung an einem Prefabs auf alle seine Instanzen angewendet. Sehr praktisch und wichtig!

Sonstiges

  • Vielen Dank an Ina für die Binärkekse!
  • Wir sehen uns am ersten Dienstag nach der vorlesungsfreien Zeit wieder!