2010-08-17 15 views
0

En essayant de m'instruire ASP.NET et OO design en général, j'ai décidé de faire un simple jeu basé sur le Web. C'est un jeu de rôle rudimentaire, où le joueur peut créer un personnage d'une certaine profession. Ces professions donnent au personnage certains types d'attaques, et certaines de ces capacités ont des effets de statut (poison sur les ennemis, buffs défensifs pour le personnage, etc.).XLINQ - Est-il possible d'avoir des conditions dans une requête?

Les données professionnelles sont stockées dans des fichiers XML. Je pensais que ce serait le meilleur moyen de l'étendre à l'avenir. Si je (ou quelqu'un d'autre) souhaitait ajouter/modifier des professions, tout ce dont ils auraient besoin serait de modifier ou d'ajouter des fichiers XML. Donc, avec tout cela, j'ai testé comment réussir à extraire les différentes attaques de mes fichiers XML professionnels. Comme je l'ai déjà dit, certains d'entre eux ont des effets de statut, mais pas tous. Ci-dessous une profession de test:

<?xml version="1.0" encoding="utf-8" ?> 
<CharacterClass> 
    <Name>Hacker</Name> 
    <InitialStats> 
    <HP>10</HP> 
    <TP>25</TP> 
    <BaseDMG>2</BaseDMG> 
    <BaseDefense>25</BaseDefense> 
    </InitialStats> 
    <LevelingStats> 
    <HPMultiplier>2</HPMultiplier> 
    <TPMultiplier>4</TPMultiplier> 
    <BaseDMGMultiplier>2</BaseDMGMultiplier> 
    <DefenseIncrease>5</DefenseIncrease> 
    </LevelingStats> 
    <Attacks> 
    <Attack> 
     <AttackName>Basic Attack</AttackName> 
     <AttackLevel>1</AttackLevel> 
     <TPCost>0</TPCost> 
     <DMGModifier>1</DMGModifier> 
     <HitPenalty>0</HitPenalty> 
     <StatusEffect> 
     <Type>null</Type> 
     <Duration>0</Duration> 
     <Level>0</Level> 
     </StatusEffect> 
    </Attack> 
    </Attacks> 
</CharacterClass> 

Comme vous pouvez le voir, chaque profession confère diverses attaques, qui sont des objets dans mon système. Les effets de statut sont également des objets - en fait, ce sont des observateurs qui peuvent être attachés aux caractères.

Mon problème provient d'attaques qui n'ont pas d'effets d'état, comme l'attaque de base présentée ci-dessus. J'ai une solution partielle , mais il semble inélégant: me

public partial class xmltest : System.Web.UI.Page 
{ 
    public StatusEffect CreateStatusEffect(XElement se) 
    { 
     if (se.Element("Type") != null) 
     { 
      StatusEffect result = (StatusEffect)Assembly.GetExecutingAssembly().CreateInstance(((string)se.Element("Type"))); 
      result.Name = (string)se.Element("Name"); 
      result.Duration = (int)se.Element("Duration"); 
      result.Level = (int)se.Element("Level"); 

      return result; 
     } 
     else 
     { 
      throw new Exception(); 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     List<Attack> charAttacks = (from a in XElement.Load(MapPath("CharacterClasses/Hacker.xml")).Element("Attacks").Elements("Attack") 
            let se = a.Element("StatusEffect") 
            select new Attack 
            (
             (string)a.Element("AttackName"), 
             (int)a.Element("AttackLevel"), 
             (int)a.Element("TPCost"), 
             (double)a.Element("DMGModifier"), 
             (double)a.Element("HitPenalty"), 
             CreateStatusEffect(se) 
            )).ToList(); 


     foreach (Attack attack in charAttacks) 
     { 
      output.InnerHtml = attack.Name + "<br />"; 
     } 
    } 
} 

Est-il possible pour:

  1. Vérifier l'existence d'un effet d'état
  2. Construire si elle existe

Dans la requête LINQ elle-même? Jouer avec l'enregistrement en cours d'exécution en cours d'exécution comme une mauvaise odeur de code pour moi. Je suis sûr qu'il me manque quelque chose d'évident.

+0

votre question est un peu déroutant, ce voulez-vous dire par "Vérifier l'existence d'un effet de statut"? Voulez-vous vérifier si vous avez un nœud StatusEffect sous le nœud Attack? Votre deuxième instruction "Construisez-la si elle existe", vous voulez dire construire une instance de l'objet StatusEffect à partir du StatusEffect xml? –

+0

Je veux vérifier si le type d'effet d'état dans le fichier XML est 'nul' ou non. Si ce n'est pas null, alors oui, construisez une nouvelle instance de StatusEffect en utilisant les données du fichier XML. –

Répondre

1

Essayez ceci

XDocument doc = XDocument.Load(MapPath("CharacterClasses/Hacker.xml")); 
List<Attack> charAttacks = (from attack in doc.Descendants("Attack") 
            select new Attack() 
            { 
             AttackName = (string)attack.Element("AttackName") ?? null, 
             AttackLevel = (int)attack.Element("AttackLevel"), 
             TPCost = (int)attack.Element("TPCost"), 
             DMGModifier = (double)attack.Element("DMGModifier"), 
             HitPenalty = (double)attack.Element("HitPenalty"), 
             StatusEffect = attack.Element("StatusEffect") == null ? null : 
                   new StatusEffect() 
                   { 
                    Name = (string)attack.Element("StatusEffect").Element("Name"), 
                    Duration = (int)attack.Element("StatusEffect").Element("Duration"), 
                    Level = (int)attack.Element("StatusEffect").Element("Level") 
                   } 
            }).ToList();`enter code here` 

Les définitions de classe d'attaque et de StatusEffect doivent avoir des propriétés publiques, comme indiqué ci-dessous pour la déclaration de LINQ ci-dessus pour travailler

class Attack 
    { 
     public string AttackName { get; set; } 
     public int AttackLevel { get; set; } 
     public int TPCost { get; set; } 
     public double DMGModifier { get; set; } 
     public double HitPenalty { get; set; } 
     public StatusEffect StatusEffect { get; set; } 
    } 

    class StatusEffect 
    { 
     public string Name { get; set; } 
     public int Duration { get; set; } 
     public int Level { get; set; } 
    } 
+0

Exactement ce que je voulais savoir. Merci! –