Spiele programmieren mit C#



  • Hallo,
    mich würde es interessieren, ob man mit C# auch Spiele programmieren kann und
    ob es leichter oder genauso schwer ist wie C++.

    Da ich mich bis jetzt nur ein bischen mit C# beschäftigt habe, würde es mich
    noch interessieren, ob es schwerer ist als C++.

    Vielen Dank schonmal für eure Antworten 🙂

    MfG
    Umut



  • Kommt darauf an was du kannst. Wenn du c++ aber kein c# wird esin c++ einfach sein, sonst anders rum 🙂
    Technoligien sind es die selben, GDI/GDI+ kannst du auch in C# verwenden (bei GDI+ wurde ich sogar C# den vorzu geben). Von DirectX gibts auch ne managed version für C#/.NET, einziges manko hier ist DirectShow. Wenn du das verwenden willst würde ich c++ vorschlangen, ist in C# ein ziehmliches rumgebastle, da es keine managed version davon gibt, gibt noch nicht mal type libraries, sondern nur IDL files...



  • Ich würde nicht empfehlen mit C# größere Spiele zu programmieren, weil die Sprache wesentlich langsamer als C++ ist. Wenn du aber nur ein kleines Spiel programmieren möchtest, dass nicht viele Ressourcen und Rechenleistung benötigt, ist C# sicherlich eine gute Lösung.



  • Die frage ist wie viel in einem spiel die sprache macht. Zum matrixen rechnen gibt D3DX, zum rendern Direct3D, zum direkten rumpfushen in texturen __unsafe, .. Die liste die am ende überig bleibt ist meist erschreckend klein



  • zum Thema C#/DotNet + Spieleprogrammierung:
    http://www.dotnetpro.de/articles/webarticle7.aspx



  • CMatt schrieb:

    Die frage ist wie viel in einem spiel die sprache macht. Zum matrixen rechnen gibt D3DX, zum rendern Direct3D, zum direkten rumpfushen in texturen __unsafe, .. Die liste die am ende überig bleibt ist meist erschreckend klein

    Das denke ich auch.

    Ich denke wenn man mit DX oder anderen Schnittstellen arbeitet wird es prinzipiell egal sein mit welcher Sprache man ein Spiel schreibt oder?



  • wenn man wirklich Spiele programmieren will, sollte man noch eine Abstraktionsebene weiter hoch gehen und fertige Engines verwenden (http://www.devmaster.net/engines/) - das geht soweit dass man dann nur noch in irgendwelche Engine spezifischen Skriptsprachen programmiert



  • till_hm schrieb:

    Ich würde nicht empfehlen mit C# größere Spiele zu programmieren, weil die Sprache wesentlich langsamer als C++ ist. Wenn du aber nur ein kleines Spiel programmieren möchtest, dass nicht viele Ressourcen und Rechenleistung benötigt, ist C# sicherlich eine gute Lösung.

    Totaler Quatsch. Ich schreibe gerade meine Diplomarbeit über Managed DirectX und kann die Meinung zahlreicher Profis bestätigen: MDX in Kombination mit C# eignet sich definitiv auch für größere Spiele. So habe ich z.B. eine MDX Testanwendung, die von 3 Meshes in Echtzeit die Schatten (mit Stencil Volume Shadows) von 4 Lichtquellen berechnet und immernoch gut 200 fps aufweist. Meine vergleichbare native DX Version kommt auf 211 fps.
    IMO ist C# nur für Spiele mit absoluten Highend Cutting-Edge Grafiken vom Niveau a la HL2, FEAR oder Stalker ungeeignet.
    Dass sogar erste kommerzielle Titel mit C# entwickelt wurden, bestätigt nur die Tauglichkeit von C# (und MDX) zur Entwicklung "großer" Spiele.



  • aber wehe der GC möchte mal ein wenig arbeiten.



  • AndreasW schrieb:

    aber wehe der GC möchte mal ein wenig arbeiten.

    Ob ein GC viel oder wenig arbeiten muss, hängt stark von deinem Können/Erfahrung als Programmierer ab. Wenn deine Speicherverbrauch explodiert und und dein Rechner deswegen ständig einfriert weil der GC mal wieder Schwerstarbeit leisten muss, dann hast du irgendwas falsch gemacht.



  • egberg schrieb:

    Ob ein GC viel oder wenig arbeiten muss, hängt stark von deinem Können/Erfahrung als Programmierer ab. Wenn deine Speicherverbrauch explodiert und und dein Rechner deswegen ständig einfriert weil der GC mal wieder Schwerstarbeit leisten muss, dann hast du irgendwas falsch gemacht.

    Du hast natürlich recht, aber ich finde es ein bißchen pikant, daß man Deine Argumentation vor einiger Zeit bei C++ benutzte um zu begründen, warum man keinen GC braucht. Denn jemand der einen GC braucht, hat seine Speicherverwaltung nicht im Griff (laut C++). Jetzt sagen wir, bei wem der GC arbeitet, der hat seine Speicherverwaltung nicht im Griff.

    😉



  • [Ironie]Stimmt, in C++ kostet die Speicherverwaltung ja keine Rechenzeit[/Ironie]

    Das Allokieren von Speicher ist in .NET sehr viel schneller als in C++, da der Heap wie ein Stack aufgebaut ist, es muss keine Liste auf der Suche nach freien Blöcken durchsucht werden usw. Und der GC ist ziemlich schnell.

    Schaut euch doch die Beispiele im DirectX SDK an und überzeugt euch selbst.

    Zu empfehlen wäre noch das Buch 'Warum ausgerechnet .NET?' von Heinrich Rottmann. Im Kapitel Performance schreibt er: 'Wenn man ein Argument gegen .NET sucht so kommt die Performance sicher nicht in Frage'



  • hey leude,
    hab ein rießen problem und zwar muss ich für d schule in C# ein programm schreiben!
    kann ein spiel sein, rechenprogramm, is egal,
    müssen nur folgende anforderungen erfüllt werden:

    - muss eine konsolenanwendung sein
    - mindestens 2 if-anweisungen
    - mindestens eine fußgesteuerte schleiße
    - mindestens ein unterprogramm oohne parameter
    - mindestens ein unterprogramm mit parameter
    - mindestens eine funktion
    - mindestens eine globale varialble
    - mindestens ein array

    ihr seit meine letzte rettung!
    schon mal danke...

    gruß jakob



  • Dann mal los.



  • Wenn du Probleme bei bestimmten Sachen hast kannst du gerne fragen, aber deine Hausaufgaben werden wir mit Sicherheit nicht machen!



  • interpreter schrieb:

    Dass sogar erste kommerzielle Titel mit C# entwickelt wurden, bestätigt nur die Tauglichkeit von C# (und MDX) zur Entwicklung "großer" Spiele.

    Interessant. Kannst du ein paar Beispiele nennen?



  • _matze schrieb:

    interpreter schrieb:

    Dass sogar erste kommerzielle Titel mit C# entwickelt wurden, bestätigt nur die Tauglichkeit von C# (und MDX) zur Entwicklung "großer" Spiele.

    Interessant. Kannst du ein paar Beispiele nennen?

    Arena Wars.
    Da hört's aber auch schon auf.



  • hab jetzt mal angefangen ein spiel zu schreiben und hab ein spielfeld entworfen, mit einem laufenden O!
    mein problem is nur, dass ich mauern eingezogen hab, durch die da O laufen kann!
    was kann ich dagegen tun???...

    mein programm:

    using System;

    class Program
    {
    static void Main(string[] args)
    {

    int[,] Tilemap =
    {
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // Dies ist unser "Spielfeld"
    { 1, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 1 }, // 1 = Mauer, 0 = Nichts/Weg
    { 1, 0, 2, 0, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 2, 0, 2, 2, 0, 2, 0, 0, 1 },
    { 1, 0, 2, 2, 2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 1 },
    { 1, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1 },
    { 1, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1 },
    { 1, 2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 1 },
    { 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 1 },
    { 1, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1 },
    { 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 0, 1 },
    { 1, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 0, 2, 2, 0, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 0, 0, 1 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 1 },
    { 1, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 1 },
    { 1, 2, 2, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1 },
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
    };
    for (int Y = 0; Y < 21; Y++) // Äußere for-Schleife (Y)
    {
    for (int X = 0; X < 31; X++) // Innere for-Schleife (X)
    {
    if (Tilemap[Y, X] == 0) // auf 0 überprüfen
    {
    Console.SetCursorPosition(X, Y);
    Console.Write(" "); // wenn ja, zeichne " "
    }
    if (Tilemap[Y, X] == 1) // auf 1 überprüfen
    {
    Console.SetCursorPosition(X, Y);
    Console.Write("#"); // wenn ja, zeichne "#"
    }

    if (Tilemap[Y, X] == 2) // auf 1 überprüfen
    {
    Console.SetCursorPosition(X, Y);
    Console.Write("x"); // wenn ja, zeichne "#"
    }
    }
    }
    Console.ReadKey(true);



  • Na du fragst einfach ab, ob die Zielposition, die deine Spielfigur mit dem nächsten Schritt einnehmen würde, eine 1 (Mauer) ist (wobei mir jetzt nicht klar ist, was denn die 2 bedeutet). Wenn es eine 1 ist, machst du nix, ist es eine 0, dann verschiebst du die Spielfigur eben dahin. Eine simple Kollisionsabfrage also. Die ganze Bewegungssache fehlt bei dir aber noch völlig. Im Moment zeichnest du nur das Spielfeld.



  • - muss eine konsolenanwendung sein
    - mindestens 2 if-anweisungen
    - mindestens eine fußgesteuerte schleiße
    - mindestens ein unterprogramm oohne parameter
    - mindestens ein unterprogramm mit parameter
    - mindestens eine funktion
    - mindestens eine globale varialble
    - mindestens ein array

    Irgendwie hört sich das nach Quatsch an. Unterprogramme können durchaus auch funktionen sein. Und Funktionen gibt es an sich in C# nicht. Dort gibt es nur Methoden.

    Globale Variablen gibt es in C# ebenfalls nicht. (Die kann man aber mit statischen Membern in statischen Klassen nachbasteln.)

    Sicher das es C# sein soll ?


Log in to reply