2016-07-22 4 views
3

Ich bin zur Zeit ein Spiel in schnellen Schreiben und ich versuche Verwendung von Protokollen, um die Dinge zu definieren, wie die Kapitel und Levels usw.Swift-Protokoll mit Element, das von ‚ObjectSetType‘ ist

So ein Kapitel könnte hat die folgende Struktur:

protocol Chapter { 
     var title:String {get} 
     var levels:[Level] {get} 
     var choices:[OptionSetType] 
    } 

jedes Kapitel von mehreren Ebenen und jede Ebene zusammengesetzt ist, kann nur zugegriffen werden, wenn bestimmte ‚Entscheidungen‘ erfüllt sind.

Um dies zu erreichen, werde ich diese Optionen verfolgen und eine Bitmaske verwenden, um zu sehen, ob die Bedingungen erfüllt wurden. Die Auswahlmöglichkeiten können jedoch für jedes Kapitel unterschiedlich sein, aber ich möchte meine Spielmechaniken so erstellen, dass sie sich nicht darum kümmern müssen, herauszufinden, in welchem ​​Kapitel sich der Benutzer gerade befindet.

Die Idee ist, dass jede Ebene einen "Punkte" -Wert hat und ich nur herausfinden, ob der Punkte-Wert die Bitmaske der relevanten Auswahl enthält.

Also für ‚Niveau‘ Ich habe versucht, ein Protokoll wie

protocol Level { 
    var text:String {get} 
    var score:OptionSetType {get} // this is what determines if a level can be shown if the right chapter 'choices' have been set 
    } 

zu definieren, die nun jedes Kapitel einen Fehler von

Protocol 'OptionSetType' can only be used as a generic constraint because it has Self or associated type requirements 

gibt in der Theorie haben sie eigene Reihe von Optionen ist, aber Ich frage mich, wie ich das generisch genug machen kann, damit ich die Engine fast codieren kann, anstatt für jedes einzelne Kapitel zu kodieren. Deshalb dachte ich, ich würde die Protokolle erstellen. Das Problem ist, wie kann ich die Bit-Maskierung Arbeit tun, wenn ich Set OptionSetType Werte definieren muss und nicht sagen kann, dass die Eigenschaften von einem Typ von OptionSetType sein werden. Hoffnung, die Sinn macht?

Antwort

1

[In Swift 3 ist OptionSetType jetzt OptionSet.] Ihr Fehler tritt auf, weil OptionSet ein Protokoll und nicht direkt verwendet werden kann (es hat Self oder ... Anforderungen).

Ihr Entwurf würde wahrscheinlich profitieren, indem Sie Abstraktionen für Choice und Score erstellen - so wie Sie eine Abstraktion für Level erstellt haben. Wenn Sie sich dann dazu entscheiden, Score als OptionSet zu implementieren, wird die "Selbstanforderung" erfüllt. Wie so:

struct Score : OptionSet { ... } 
struct Choice : OptionSet { ... } 

und dann:

protocol Chapter { 
    var title:String {get} 
    var levels:[Level] {get} 
    var choices:[Choice] 
} 

protocol Level { 
    var text:String {get} 
    var score:Score {get} 
} 
+0

Wird diese Arbeit für die Tatsache, dass Entscheidungen sollten für jedes Kapitel anders sein? Ich müsste alle Optionen im Voraus erklären. Wäre es eher so, dass jedes Kapitel Auswahlmöglichkeiten hat, aber Kapitel 1 könnte Kapitel1 Auswahlmöglichkeiten enthalten, die Auswahl implementiert. Ich weiß also, dass sie alle die gleiche Schnittstelle haben, aber die Werte würden sich in jedem Kapitel unterscheiden. Nun, die Namen wären anders, aber die Werte wären alle Bits, zB 1,2,4,8 usw. – TommyBs

+0

Es kann sein, dass 'OptionSet' keine gute Wahl ist, da man normalerweise eine Menge' Static Let' Deklarationen für die Optionen hinzufügt . Wenn Sie sie nicht aufzählen können oder wenn Sie keinen Satz finden, der für alle Kapitel gilt, benötigen Sie vielleicht eine andere Abstraktion. – GoZoner

+0

Hmmm, ich denke du hast recht, vielleicht sollte ich sie einfach als Boolesche Flags betrachten und sie so in einem Dictionary angeben. Dann kann jedes Level spezifizieren, was "wahr" sein muss. Obwohl es schön gewesen wäre, den "Punktestand" als ID zu verwenden, damit der Spieler die Level "herumspringen" kann, aber ich denke, ich könnte etwas Ähnliches erreichen, indem ich alle Optionen durchlaufe und überprüfe, was gesetzt ist. Nur wäre ein bisschen langsamer alles – TommyBs

Verwandte Themen