XNA Buch für die Spieleentwicklung

Physically

Lt. Commander
Registriert
Nov. 2010
Beiträge
1.708
Hallo,

wollte Spiele im Style von Pokemon programmieren (kennt man ja, ganz simple RPG-Games) .Habe mich informiert, und dieses XNA Game Studio gefunden, welches auf C# aufbaut. Natürlich habe ich mit diesem XNA noch keine Erfahrung und möchte mich nun darüber schlau machen, bzw. es lernen. Meine Frage:

Kennt jemand ein lehrreiches Buch bezüglich XNA?

Gruß
 
Theoretische Erfahrung in C#, bin momentan dabei das Buch "C# von Kopf bis Fuß" durchzugehen und zu verstehen. Danach wollte ich mir mal XNA anschauen, weil ich bekomme vom Programmieren nicht genug "GLL*
 
Kennst Du so aus dem Stegreif Progrämmchen, welche ich programmieren könnte? Meine Kenntnisse: Grundlagen, Klassen <-- so im Groben, OOP gehört ja dazu.

Gruß
 
Meinst du Programme die man allgemein zum Üben schreiben kann ?

z.B: Getränkeautomat:
- Geldausgabe berechnen, ist noch genug Geld vorhanden
- Getränke Vorrat überprüfen, gegeben falls Rückmeldung an Zentral das Getränke leer sind
- Getränkewahl
- ....

Ist eine Klassische Übung um den Umgang mit Objekten zu lernen.
 
Zuletzt bearbeitet:
Spiele: Pong, Bomberman
Etwas abstrakter: Taschenrechner, Fahrstuhlsteuerung (Simulation von Zeit, 10 Stockwerke, 2 Aufzüge, zufälliges Erscheinen der Fahrgäste)
 
@Jomelo: Cool, werde ich mal programmieren.

@Ruheliebhaber: Spiele kann ich doch noch nicht mit dem Wissen :)
 
Wenn es im Stil von Pokemon sein soll, könntest Du dir mal RPGMaker anschauen: http://www.rpgmakerweb.com/
Oder möchtest Du explizit für xbox360 pder WP7/8 entwickeln?
 
Ne wenn, dann möchte ich es für den PC entwicklen in einer Programmiersprache und nicht mit einem Maker, ist sonst langweilig :)
Ergänzung ()

Eine Frage: Wenn ich eine Klassendatei erstelle, und ein Label ansprechen möchte geht das garnicht, also ich kann es nicht ansprechen, nur in Form1.cs, warum?
 
Ohne Deine Anwendung zu kennen, liegt das wahrscheinlich an der "Sichtbarkeit" des Labels. Schaue mal in die "Form1.designer.cs" und suche nach dem Label. Dort änderst Du "private" auf "public".

Andererseits ist das Quik&Dirty. Hast Du schon einmal etwas vom MVC-Ansatz gehört? Das steht für Model View Controller und steht für die Trennung von Oberfläche, Geschäftslogik und Datenhaltung.

Die Idee beim MVC-Ansatz ist, daß die Oberfläche eine Schnittstelle anbietet, wie sie Informationen oder Daten entgegennimmt und darstellt. In der Geschäftslogik werden die Daten entsprechend vorbereitet und an die Oberfläche übergeben. Tatsächlich ist es sogar so, daß man in der Geschäftslogik Daten derart strukturiert, daß man sie an ein beliebiges System weitergeben kann. Ob das nun eine Oberfläche oder ein Datenbanklayer ist, ist völlig egal. Wenn man das sauber aufbaut, kann man ohne allzuviel Aufwand auch verschiedene Oberflächen für ein und die selbe Programmlogik anbieten.

Es wäre daher besser, wenn Deine Form eine Eigenschaft oder eine Methode (public) anbietet, die den Zugriff auf bzw. die Veränderung des Labels ermöglicht.
 
Zuletzt bearbeitet:
Sind beide Klassen im gleichen Namespace? Hast Du in Deiner neuen Klasse eine Instanz der Form im Zugriff?

Normalerweise hat man das nicht. Was genau willst Du denn machen? Was soll Deine neue Klasse machen und warum soll das Label auf der Form manipuliert werden?

Welche Kenntnisse hast Du bisher im Programmieren? Wie lange beschäftigst Du Dich schon damit und woher hast Du Deine Kenntnisse?

Ich weiß, es viel, aber schau Dir mal die Microsoft Coding Conventions an und gewöhn Dir das an. Der Link dient nur als Einstieg: http://msdn.microsoft.com/en-us/library/ff926074.aspx
 
Beide sind im gleichen Namespace. Nein, ich habe nicht in der neuen Klasse eine Instanz der Form. Ich möchte eine Klasse "GetränkeWahl" erstellen, und dort Methoden wie "Cola, Wasser, Sprite usw" schreiben. Wenn ich die Methode im Hauptprogramm aufrufe, z.B. meinGetränk.Cola(); soll automatisch der Preis im label geändert werden. Die Methode wird allerdings erst aufgerufen, wenn ein RadioButton names "Cola" Checked == true ist.

Kenntnisse: Grundlagen, momentan bei Klassen wie man sieht:) Habe mir das Wissen von dem Buch "C# von Kopf bis Fuß" angeeigent und bin auf Seite 187.

Gruß
 
Ich glaube, Du mußt etwas abstrakter denken.

Du möchtest einen Getränkeautomaten entwickeln. Dieser hat Eigenschaften und Funktionen. Z.B. wählst Du ein Getränk aus. Der Automat sagt Dir dann, wie teuer das Getränk ist. Dann bezahlst Du, der Automat prüft die eingeworfene Summe und gibt ggf. ein Getränk aus, bis der Getränkevorrat erschöpft oder das Münzfach voll ist.

Das kommt alles in Deine Klasse "Getränkeautomat" oder wie immer Du das modellieren willst. Dann kommt die Oberfläche ins Spiel, mit welcher Du Deinen abstrakten Getränkeautomat bedienen willst.

Das heißt, Du instanzierst zur Laufzeit Deiner Oberfläche, z.B. im Konstruktor der Form, ein Objekt vom Typ "Getränkeautomat". Jetzt kannst Du den Getränkeautomaten bedienen.

Wenn Du also eine Eventhandling-Methode für einen Button, oder was auch immer, "Wähle Cola" hast, dann wird in dieser Methode der "Getränkeautomat" bedient. Soll heißen, Du rufst eine noch zu schreibende Methode "GibPreisFürGetränk('Cola')" des Getränkeautomaten auf. Als Rückgabewert erhälst Du den Preis für das Getränk. Mit dieser Information kannst Du dann das Label für den Preis ändern.

Ist das verständlicher?

PS: Programmiert wird übrigens in Englisch.
 
Ruheliebhaber schrieb:
Ich glaube, Du mußt etwas abstrakter denken.

Du möchtest einen Getränkeautomaten entwickeln. Dieser hat Eigenschaften und Funktionen. Z.B. wählst Du ein Getränk aus. Der Automat sagt Dir dann, wie teuer das Getränk ist. Dann bezahlst Du, der Automat prüft die eingeworfene Summe und gibt ggf. ein Getränk aus, bis der Getränkevorrat erschöpft oder das Münzfach voll ist.

So far, so good!

Ruheliebhaber schrieb:
Das kommt alles in Deine Klasse "Getränkeautomat" oder wie immer Du das modellieren willst.

Meinst Du damit die schon vorhandene Klasse, oder eine neue Klasse die ich erstellen soll?

Ruheliebhaber schrieb:
Dann kommt die Oberfläche ins Spiel, mit welcher Du Deinen abstrakten Getränkeautomat bedienen willst.

Das heißt, Du instanzierst zur Laufzeit Deiner Oberfläche, z.B. im Konstruktor der Form, ein Objekt vom Typ "Getränkeautomat". Jetzt kannst Du den Getränkeautomaten bedienen.

Also hier:

Code:
namespace Getränkeautomat
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            GibPreisFürGetränk meinGetränk = new GibPreisFürGetränk(); //<-- HIER?
        }
    }
}


Ruheliebhaber schrieb:
Wenn Du also eine Eventhandling-Methode für einen Button, oder was auch immer, "Wähle Cola" hast, dann wird in dieser Methode der "Getränkeautomat" bedient. Soll heißen, Du rufst eine noch zu schreibende Methode "GibPreisFürGetränk('Cola')" des Getränkeautomaten auf. Als Rückgabewert erhälst Du den Preis für das Getränk.

Datentyp double?

Ruheliebhaber schrieb:
Mit dieser Information kannst Du dann das Label für den Preis ändern.

Ist das verständlicher?

PS: Programmiert wird übrigens in Englisch.

Ok, in Englisch :)
 
Habe gerade kein VS2010. Aber in etwa so:

Solution = AutomatTest

AutomatModel.cs

Code:
namespace AutomatTest.Model
{
   public class AutomatModel
   {
      public static enum DrinkType
      {
         Cola,
         Sprite
      }

      public Dictionary<DrinkType, double> Prices = new Dictionary<DrinkType, double>()
      { 
           { DrinkType.Cola, f1.20 }, 
           { DrinkType.Sprite, f1.00 } 
       };
   }
}

Automat.cs

Code:
using AutomatTest.Model;

namespace AutomatTest.Controller
{
   public class Automat
   {
       private AutomatModel _model = new AutomatModel();

       public double GetPrice(AutomatModel.DrinkType drink)
       {
            return _model.Prices[drink];
       }
   }
}

Form1.cs

Code:
using AutomatTest.Controller;
using AutomatTest.Model;

namespace AutomatTest
{
   public class Form1
   {
        private Automat _automat = new Automat();
        
        public void Button1_Click(object sender, EventArgs e)
        {
            label1.text = Automat.GetPrice(AutomatModel.DrinkType.Sprite).ToString();
        }

   }
}
 
Zuletzt bearbeitet:
Igitt, da bekommt man ja Augenkrebs. Nimm bitte sofort die Umlaute daraus, gewöhne dir den Müll gar nicht erst an. Sowas darf da einfach nicht drinstehen, ...
 
Oje, davon verstehe ich nicht viel, da ich noch nicht alles durchgeabeitet habe. Bspw. habe ich enum noch nicht, Dictionary< auch nicht und dergleichen.

EDIT: @DasBoese: Wen meinst du jetzt?
 
Zurück
Oben