12.01.2014 Aufrufe

Dokumentation zum Massive Multiplayer Online Game - Universität ...

Dokumentation zum Massive Multiplayer Online Game - Universität ...

Dokumentation zum Massive Multiplayer Online Game - Universität ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

2. Planeten und Gebäude<br />

9<br />

def self.generateNear(x, y)<br />

3.times do |m|<br />

3.times do |n|<br />

generateAt(x - 1 + m, y - 1 + n)<br />

end<br />

end<br />

end<br />

Sobald mindestens eine Galaxie erzeugt wird, müssen auch alle zugehörigen Sonnensysteme und Planeten<br />

in einer einzigen Transaktion miterzeugt werden. Dadurch wird gewährleistet, dass die Weltdaten in der<br />

Datenbank konsistent mit den Spielregeln einhergehen. Konnte eine Galaxie nicht erzeugt werden, ist das kein<br />

Problem, da automatisch beim nächsten Aufruf an einer benachbarten Galaxie diese Galaxie erneut erzeugt<br />

werden kann. Insgesamt wird durch dieses Vorgehen gewährleistet, dass immer genug der Spielwelt als "neues<br />

Gebiet" zur Verfügung steht, aber nicht sehr viel auf einmal in die Datenbank eingetragen werden muss. Die<br />

einzelnen Generierungen der umgebenen Galaxien dauert zwischen 10 ms und 900 ms, je nachdem, wie viel<br />

nachgeneriert werden muss.<br />

Bei jedem Erstellen eines neuen Sonnensystems wird darauf geachtet, dass genau ein Planet als Startplanet<br />

für neue User erzeugt wird und alle anderen als spezialisierte Planeten mit besonderen Eigenschaften. Da wir<br />

festgelegt hatten, dass ein User ca. 4-5 Planeten verwalten würde, haben wir uns dazu entschlossen, bei<br />

Sonnensystemen, die 7 oder 8 Planeten erstellen, zusätzlich einen zweiten Planeten als Startplaneten zu<br />

deklarieren. Das führt dazu, dass User in großen Sonnensystemen automatisch zu mehr Interaktionen mit<br />

anderen Usern gezwungen sind und nicht übervorteilt sind. Im Gegenzug ist es zur Spielregel geworden, dass<br />

die Übernahme eines Startplaneten nicht mehr möglich ist, sobald ein User diesen Planeten besitzt. Dadurch<br />

werden die Startplaneten zu strategischen Punkten im Spiel und gleichen den Nachteil aus, dass sie keine<br />

Besonderheit aufweisen.<br />

Startplaneten an neue User zuweisen<br />

Damit ein neuer User beim Spiel teilnehmen kann, muss er einen Startplaneten zugewiesen bekommen. Dazu<br />

haben wir eine Hilfsmethode erstellt, die für einen übergebenen User einen Startplaneten sucht. Auf die<br />

Möglichkeit, einfach irgendeinen Startplaneten zufällig zu wählen, wollten wir verzichten, da dies dem Spielprinzip<br />

nicht förderlich ist. Eine zufällige Zuweisung würde dazu führen, dass User am Anfang sehr weit voneinander<br />

entfernt sein können, und zwar so weit, dass der <strong>Multiplayer</strong>aspekt für sehr lange Zeit nicht <strong>zum</strong> Tragen kommen<br />

würde. Stattdessen sollten die User zwar relativ zufällig, aber doch ziemlich nah beieinander starten. Aufgrund<br />

der dynamischen Generierung der Welt ist dies sehr einfach:<br />

Auszug aus dem Modul PlanetsHelper<br />

@@marker = []<br />

@@marker_pos = 0<br />

def self.search_startplanet()<br />

if @@marker.nil? || @@marker.length < 8 then<br />

@@marker = Planet.where(special: 0, user_id: nil).limit(8)<br />

end<br />

return false if @@marker.empty?<br />

@@marker_pos = (@@marker_pos+1) % 8<br />

planet = @@marker[@@marker_pos]<br />

@@marker[@@marker_pos] = nil<br />

@@marker.compact!<br />

return planet<br />

end<br />

def self.claim_startplanet_for(user)<br />

return false if !user.is_a?User || user.nil? || user.planets.count > 0<br />

p = search_startplanet<br />

if !p.nil? && p.is_a?(Planet) && p.user.nil?<br />

p.claim(user)<br />

p.set_home_planet(user)<br />

return true<br />

else<br />

return false

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!