2017-03-28 14 views
1

So versuche ich an einem Tutorial zu arbeiten, um zu lernen, wie in C# für mobile Anwendungen zu programmieren. Ich habe an einem Tutorial gearbeitet, das ursprünglich für Windows Forms gedacht war, und ich habe versucht, den Code in eine Android-Version zu formatieren, damit ich es auf meinem Handy testen kann. Womit ich momentan Probleme habe, ist es, einen Wert von einem Spinner zu nehmen und ihn später zu benutzen. Ich möchte eine "Waffe" aus einem Kreisel nehmen und dann diese Waffe verwenden, um einem Monster Schaden zuzufügen. Der ursprüngliche Code sah wie folgt für Windows Forms:Android: Festlegen einer Variablen für eine Spinner-Artikel für die spätere Verwendung

private void btnUseWeapon_Click(object sender, EventArgs e) 
     { 
      // Get the currently selected weapon from the cboWeapons ComboBox 
      Weapon currentWeapon = (Weapon)cboWeapons.SelectedItem; 

      // Determine the amount of damage to do to the monster 
      int damageToMonster = RandomNumberGenerator.NumberBetween(currentWeapon.MinimumDamage, currentWeapon.MaximumDamage); 

      // Apply the damage to the monster's CurrentHitPoints 
      _currentMonster.CurrentHitPoints -= damageToMonster; 

      // Display message 
      rtbMessages.Text += "You hit the " + _currentMonster.Name + " for " + damageToMonster.ToString() + " points." + Environment.NewLine; 

      // Check if the monster is dead 
      if(_currentMonster.CurrentHitPoints <= 0) 
      { 
       // Monster is dead 
       rtbMessages.Text += Environment.NewLine; 
       rtbMessages.Text += "You defeated the " + _currentMonster.Name + Environment.NewLine; 

       // Give player experience points for killing the monster 
       _player.ExperiencePoints += _currentMonster.RewardExperiencePoints; 
       rtbMessages.Text += "You receive " + _currentMonster.RewardExperiencePoints.ToString() + " experience points" + Environment.NewLine; 

       // Give player gold for killing the monster 
       _player.Gold += _currentMonster.RewardGold; 
       rtbMessages.Text += "You receive " + _currentMonster.RewardGold.ToString() + " gold" + Environment.NewLine; 

       // Get random loot items from the monster 
       List<InventoryItem> lootedItems = new List<InventoryItem>(); 

       // Add items to the lootedItems list, comparing a random number to the drop percentage 
       foreach(LootItem lootItem in _currentMonster.LootTable) 
       { 
        if(RandomNumberGenerator.NumberBetween(1, 100) <= lootItem.DropPercentage) 
        { 
         lootedItems.Add(new InventoryItem(lootItem.Details, 1)); 
        } 
       } 

       // If no items were randomly selected, then add the default loot item(s). 
       if(lootedItems.Count == 0) 
       { 
        foreach(LootItem lootItem in _currentMonster.LootTable) 
        { 
         if(lootItem.IsDefaultItem) 
         { 
          lootedItems.Add(new InventoryItem(lootItem.Details, 1)); 
         } 
        } 
       } 

       // Add the looted items to the player's inventory 
       foreach(InventoryItem inventoryItem in lootedItems) 
       { 
        _player.AddItemToInventory(inventoryItem.Details); 

        if(inventoryItem.Quantity == 1) 
        { 
         rtbMessages.Text += "You loot " + inventoryItem.Quantity.ToString() + " " + inventoryItem.Details.Name +Environment.NewLine; 
        } 
        else 
        { 
         rtbMessages.Text += "You loot " + inventoryItem.Quantity.ToString() + " " + inventoryItem.Details.NamePlural + Environment.NewLine; 
        } 
       } 

       // Refresh player information and inventory controls 
       lblHitPoints.Text = _player.CurrentHitPoints.ToString(); 
       lblGold.Text = _player.Gold.ToString(); 
       lblExperience.Text = _player.ExperiencePoints.ToString(); 
       lblLevel.Text = _player.Level.ToString(); 

       UpdateInventoryListInUI(); 
       UpdateWeaponListInUI(); 
       UpdatePotionListInUI(); 

       // Add a blank line to the messages box, just for appearance. 
       rtbMessages.Text += Environment.NewLine; 

       // Move player to current location (to heal player and create a new monster to fight) 
       MoveTo(_player.CurrentLocation); 
      } 
      else 
      { 
       // Monster is still alive 

       // Determine the amount of damage the monster does to the player 
       int damageToPlayer = RandomNumberGenerator.NumberBetween(0, _currentMonster.MaximumDamage); 

       // Display message 
       rtbMessages.Text += "The " + _currentMonster.Name + " did " + damageToPlayer.ToString() + " points of damage." + Environment.NewLine; 

       // Subtract damage from player 
       _player.CurrentHitPoints -= damageToPlayer; 

       // Refresh player data in UI 
       lblHitPoints.Text = _player.CurrentHitPoints.ToString(); 

       if(_player.CurrentHitPoints <= 0) 
       { 
        // Display message 
        rtbMessages.Text += "The " + _currentMonster.Name + " killed you." + Environment.NewLine; 

        // Move player to "Home" 
        MoveTo(World.LocationByID(World.LOCATION_ID_HOME)); 
       } 
      } 
     } 

Die cboWeapons in Windows Forms ein combobox ist. Ich habe die gleiche Bezeichnung in meinem Code beibehalten, aber es ist ein Spinner.

Spinner cboWeapons = (Spinner)FindViewById(Resource.Id.cboWeapons); 
// Create an ArrayAdapter using the string array and a default spinner layout 
ArrayAdapter<Weapon> adapter = new ArrayAdapter<Weapon>(this, 
Android.Resource.Layout.SimpleSpinnerItem, weapons); 
adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem); 
cboWeapons.Adapter = adapter; 

public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{ 
// On selecting a spinner item 
object CurrentWeapon =parent.GetItemAtPosition(position); 
Weapon currentWeapon = new CurrentWeapon(); 
} 

Meine Waffenart ist in einem Motor-Projekt definiert und ich habe Probleme mit der Herstellung currentWeapon etwas, das ich in dem späteren Code wie die Windows Forms tut verweisen kann.

Antwort

1

Das ist, was ich benutze ausgewähltes Element zu erhalten:

var TheSelectedIten = string.Format("{0}", SimpleSpinner.GetItemAtPosition(SimpleSpinner.SelectedItemPosition)); 

Es funktioniert für mich auf einer Schleuder Liste von Strings.

R/ Prescott ...

+0

dass ein var macht, die als "TheSelectedItem" definiert ist. Wie kann ich diese Variable auf meine Waffenklasse beziehen? –

+0

In meiner Anwendung verwende ich zwei parallele String-Listen für die Waffe, die andere für Informationen über die Waffe, die Var SelectedItem enthält die Position des Elements in der Liste. Wenn die Liste beispielsweise "Speer, Axt, Bogen" enthält und der Benutzer "Ax" auswählt, ist var gleich 2. Ich verwende diesen Wert dann zum Indexieren in meine Liste von Elementen, zum Beispiel: var waffeinfo = waffeitem [SelectedItem] .ToString(); Das bringt mir alle Informationen über die Waffe. Ich bin selbst relativ neu in Android Apps und diese Lösung hat für mich funktioniert. –

+0

Ich mag diese Idee der Verwendung von 2 Listen. Ich versuche, dies in meinem Code zu verwenden, aber der Fehler, den ich aus dem zweiten Satz von Code erhalte, ist, dass ich String nicht in int konvertieren kann. Wenn Sie Ihren ersten Code betrachten, definiert das nicht eine Zeichenkette und keine Ganzzahl von 2? –

Verwandte Themen