Generell schadet es nicht, sich über solche Themen Gedanken zu machen. Wenn möglich sollte man häufige news aus den von dir genannten Gründen vermeiden. Stattdessen sollte man die Objekte einmal anlegen und in Membervariablen speichern. Zur Not halt beides mal ausprobieren und testen ob es überhaupt einen Unterschied macht.
Würde spontan zu SQL Server EE raten. Der LIMIT-Operator ist wohl kaum ein Argument für MySQL, bei SQL Server heisst er TOP 😉
Ansonsten sehe ich bei SQL Server folgende Vorteile:
Perfekte Integration in Visual Studio: Während du an deinem Code bastelst kannst du gleichzeitig an der DB feilen: Tabellen, Views, Stored Procedures etc. erstellen und bearbeiten ist alles in Visual Studio möglich und wesentlich komfortabler als mit ppMyAdmin bei MySQL.
Es gibt auch den schönen Query Designer, der dir beim Erstellen von komplexen Abfragen
SQL Server wird nativ von .NET unterstützt, es gibt diverse Klassen zum Zugriff auf SQL Server DBs.
Außerdem ist es eben auch Geschmackssache
@ZiMD: Rechne mal 2 ins Binärsystem um 😉
Führ dein Programm im Debugger aus und schau dir nach dem Fliegen der Exception den Call Stack an. Der zeigt dir dann die Zeile, die die Exception verursacht.
Die Frage ist gar nicht mal so trivial zu beantworten. Es kommt halt auch auf den Anwendungsfall an. Hast du z. B. eine Tabelle mit Bestellungen und willst zu jeder Bestellung den Wochentag vermerken, wäre die Verwendung von ints natürlich wesentlich effizienter als ein String. Redundante Daten in einer DB sollte man ja tunlichst vermeiden, es sei denn es gibt gute Gründe dafür (Performance o.ä.)
Wie ZiMD schon anmerkte, kannst du den int, der aus der DB kommt, in deinen enum-Typ casten und umgekehrt. Oder du baust dir eine Factory-Klasse, die zu einem gegeben int den korrekten String zurückliefert.
Oder du benutzt eine eigene Tabelle in der DB, und in der Tabelle Bestellungen speicherst du nur den int als Fremdschlüssel zur Wochentags-Tabelle.
Prinzipiell ist es schon möglich, eine 1.1-Applikation unter 2.0 auszuführen, aber es gibt Ausnahmen. Ich empfehle folgenden Artikel: http://www.gotdotnet.com/team/changeinfo/
Arena Wars ist ein kommerzielles Spiel, ja. Es handelt sich um ein Echtzeitstrategiespiel. Verwendet allerdings nicht Managed DirectX sondern OpenGL, ein Großteil des Codes ist in C# geschrieben. Programmiert wurde das Spiel von einem Team namens exdream. Die Entwickler hatten damals im eigenen Forum recht offen über ihre Entscheidung für C# geplaudert. Damals gab es MDX halt noch nicht, darum wurde OpenGL verwendet.
Fang einfach mal an, und wenn Fragen auftauchen einfach hier wieder melden. Viel Glück!
Original von shadowjb
Das Löschen funktioniert jetzt. Allerdings ist ein MultiSelect hier nicht erforderlich.
Es reicht wenn der Benutzer das FocusedItem löschen kann..
Wenn dein ListView MultiSelect anbietet erwarte ich als Anwender, dass beim Klicken auf Löschen alle selektierten Items gelöscht werden, nicht nur das fokusierte Item. Wenn dein ListView kein MultiSelect anbietet ist es OK.
_Original von shadowjb_Das mit der SelectedIndices-Collection ist eine gute Idee. Aber wie soll ich ausdrücken, dass der Button disabled wird wenn kein Eintrag selektiert ist, sprich wenn die SelectedIndices-Collection leer ist?
Du fängst das SelectionChanged-Event deiner ListView ab. Im Handler prüfst du dann einfach, ob Items selektiert sind oder nicht. Wenn ja, Button ist enabled, ansonsten Butten disabled.
Hallo ZeHa,
erst mal willkommen im Forum! C# und DirectX vertragen sich sehr gut. Allerdings musst du ein relativ neues DirectX haben, denn nur darin ist Managed DirectX enthalten, eine .NET-Erweiterung zu DirectX. Damit hast du unter .NET vollen Zugriff auf DirectX.
C# ist auf jeden Fall schnell genug für Spiele! Es gibt ja auch schon die ersten Spiele, die in C# geschrieben wurden, Arena Wars z. B.
Gerade bei einem 2D-Spiel solltest du da keine Probleme haben, die sind ja nicht ganz so hardware-intensiv wie moderne 3D-Spiele.
Folgendes Werkzeuge brauchst du: die neueste DirectX Runtime, das neueste DirectX-SDK und natürlich einen C#-Compiler. Ich empfehle Visual C# Express Edition von MS. Das Beste: alle diese Werkzeuge kannst du kostenlos bei MS downloaden und unbegrenzt benutzen!
Falls du des Englischen mächtig bist empfehle ich dir die Bücher von Tom Miller. Tom ist der Projektleiter von Managed DirectX bei MS, also einer der weiss über was er da schreibt. Ebenfalls gut ist Beginning .NET Game Programming in C# von David Weller u.a. (deren Namen ich im Moment nicht weiss und das Buch ist nicht in Reichweite). Eine Suche bei amazon sollte dich aber schnell auf die richtige Fährte bringen.
Zu OpenGL kann ich dir leider nicht viel sagen, ich weiss nur, dass es auch hier eine .NET-Anbindung gibt, habe es aber noch ausprobiert.
Wenn du weitere Fragen hast, einfach wieder hier melden!
Oh je, damit lastet ja ein enormer Leistungsdruck auf mir! 😁
Schönen Urlaub wünsche ich!
Ich kann meinem Vorredner nur zustimmen: Die Community hier ist wirklich spitze! Und wenn ich mal eine Antwort zu einem Thema wüsste und auch antworten will, dann hat meist herbivore die Frage schon beantwortet 8o
Auf die nächsten 5000!
Original von herbivore
deine Ausschüttungsfunktion ist eben keine Gerade, sondern auch noch von den Fertigstellungszeitpunkten der Upgrades abhängig. Diese müssen in die Berechnung mit einfließen.
Hallo herbivore,
danke für die Antwort! Würde heissen, ich merke mir pro Fertigstellung pro Spieler die genaue Zeit!? Würde funktionieren, muss ich mal ausprobieren.
Hallo KirKone,
ich finde das Thema sehr interesant, beschäftige mich auch gerade mit diesem Gedanken. Bei der Wahl der Technologien sind wir uns ja schon mal einig 😉
Zu den Ressourcen: Am User-Record merkt man sich den Zeitpunkt der letzten Ausschüttung für diesen User. Die Gebäude haben jeweils einen Eintrag Res./sec. Wenn es nun notwendig ist, d.h. der Benutzer ruft eine Seite ab, die die aktuell vorhandenen Res. anzeigt, berechnet man die Anzahl der seit der letzten Ausschüttung vergangen sec. und multipliziert diese mit Res./sec.
Das sollte wunderbar funktionieren und wird wirklich nur dann gemacht wenn es notwendig ist.
Mein Problem: Um 13 Uhr fand für Benutzer X die letzte Ausschüttung statt. Um 14 Uhr meldet er sich wieder an und will seine Res. sehen. Dummerweise wurde um 13:30 das Upgrade der Mine von Level 4 auf 5 fertig. Unsere Formel liefert also zu wenig Res. Darüber grübele ich gerade nach.
Edit: Zu deinen ursprünglichen Fragen: Ich würde soviel wie möglich in der DB über Stored Procedures machen, den Rest auf dem Server. Der Client sollte möglichst dumm sein, vielleicht ein paar JavaScripts zur Anzeige der verbleibenden Bauzeit o.ä.
Grüße
Gimley
.NET 1.1 oder 2.0? Unter 2.0 gibt es da spezielle Tags zum Kennzeichnen der neuen Member. Aber eigentlich sollte doch .NET schlau genug sein, Objektänderungen zu erkennen.
Genau so mache ich das auch. Die DB hat eine eigene Tabelle, sagen wir VersionTbl. Diese hat genau einen Eintrag, nämlich die aktuelle Versionsnummer der DB. Beim Start der Anwendung wird die Version der DB geprüft und wenn diese kleiner ist als die Versionsnummer der Anwendung wird das entsprechende Update-Script ausgeführt und schon ist die DB auf dem neuesten Versionsstand.
Führ das Programm im Debugger aus, dann siehst du 1. in welcher Zeile die Exception fliegt und 2. kannst du das Exception-Objekt auswerten, da erhälst du dann evtl. mehr Informationen über den Fehler.
Ich empfehle SQL Server Express. Kostenlos und gut, von MS und daher sehr schön in Visual Studio und ADO.NET intregriert.
Führe das Programm im Debugger aus. Wenn die Exception fliegt kannst du dir ganz genau anschauen, wo sie geflogen ist (Callstack). Das sollte dir weiterhelfen die Ursache zu ergründen.
Warum liest du die Datei in der Funktion readNetData() 2x aus? Das geht doch bestimmt eleganter.
Da crasht überhaupt nix, wenn du dir mal den Quelltext anschauen würdest, würdest du sehen, dass sich beide Programme einfach beenden sobald der Client seine Nachricht an den Server gesendet hat. So hat der Entwickler das vorgesehen und ein Blick auf den Quellcode macht das deutlich.
Wenn was crashen würde würdest du irgendwo eine Exception sehen. Normalerweise kommt dann dieses berühmte Fensterchen mit der Fehlerursache und dem Stack-Trace.
Und entferne deine peinliche Crash-Meldung bei CodeProject 😁
Ich habe das so gelöst: es gibt verschiedene GameStates (Titelbild, Hauptmenü, eigentliches Spiel, Game Over etc.) Es ist immer genau ein GameState aktiv, in der GameLoop rufe ich dann curGameState.Render() auf.
Bei den entsprechenden Aktionen setze ich dann einfach curGameState um und schon ist der neue GameState aktiv und wird gezeichnet.
Dazu gibt es Interface IGameState, dass die jeweiligen GameStates implementieren müssen.
Die Schülerlizenz ist nur für Lehrzwecke gedacht. Entweder kauft sich dein Kumpel eine 'richtige' Lizenz oder du benutzt die kostenlosen Express Editionen, in deinem Falle halt der Visual Web Developer Express Edition. Die kannst du bei MS kostenlos downloaden und damit darfst du dann auch kommerzielle Websiten erstellen.
Ja, die Werte müssen nicht initialisiert sein, wäre ja auch Käse weil die Werte ja durch die Funktion verändert werden. Aber ein großer Vorteil ist da nicht.
Du kannst ja den Rückgabewert einer Funktion ignorieren wenn du ihn nicht haben willst. Von daher brauchst du auch keine 2 Funktionen, eine reicht vollkommen aus. Einmal verwendest du den Rückgabewert der Funktion und ein anderes Mal nicht.
OnPaint ist sogar genau der richtige Ort zum Zeichnen. Es wird auch nicht stets und ständig neugezeichnet. Windows verschickt die Nachricht zum Neuzeichnen nur wenn es notwendig ist.
Perfmon hast du als nützliches Tool ja bereits entdeckt. Auch zu empfehlen ist der CLR Profiler von MS. Das Tool ist kostenlos und zeigt dir in diversen Ansichten die Belegung des Heaps, welche Objekte den meisten Speicher belegen und vor allem wo diese Objekte angelegt wurden.
Was ich nicht ganz verstanden habe: Warum brauchst du 3,5 Kopien zur Ladezeit?
Original von gprogger
Und bei Environment.Exit(,,,);
benötige ich den Exitcode des Betriebssystems....
Was wohl bedeutet das das Programm nicht überall laufen wird?!Trotzdem danke für die Antworten...
Nö, das hast du falsch verstanden: Die Funktion erwartet als Parameter den Exit-Code deines Programms, der an das Betriebssystem zurückgegeben wird. Normalerweise gibt man 0 zurück wenn das Programm normal beendet wurde oder halt eben einen Fehlercode != 0. In Batch-Dateien kann man dann z.B. den Exit-Code der aufgerufenen Programme auswerten.
Ja, bei 1.x hat MS gepennt und gibt nur so eine komische Meldung aus 'mscoree.dll nicht gefunden' oder so.
Bei .NET 2.0 kommt jedoch eine richtige Fehlermeldung, das ist immerhin schon etwas besser.
Prüfe halt bei der Installation, und wenn .NET nicht vorhanden ist, gibst du eine schöne Meldung mit Download- und Installationshinweisen aus.
Es geht skyfire wohl weniger darum eine Kommandozeilen-Applikation zu schreiben, sondern ihn stört, dass VS 'hinter seinem Rücken' Code generiert, wenn er neue Controls auf eine Form packt.
Schau dir halt den generierten Code an, so schwer ist das nicht immer Schema F: Erst wird das eigentliche Control per new erzeugt, dann werden die Properties zugewiesen, die du im VS eingestellt hast (Text, Position, Größe etc). Schliesslich wird das Control zur Form hinzugefügt.
Oder du verweist deine Anwender auf Windows Update: dort kann man sich ganz bequem das .NET Framework installieren (lassen). Damit werden die Leute, die das .NET Framework schon haben nicht gezwungen es sich nochmal runter zu laden und dein Setup bleibt schön klein.
Und wie schon gesagt wurde, bei Java ist das das gleiche. Dort wird auch nur gesagt 'benötigt Java 1.5.x' und man verlässt sich drauf, dass sich das der Anwender besorgt.
Auch zu empfehlen: MDXInfo
Da gibt es Artikel und Tuts für Einsteiger.
Sind die Daten statisch oder vom Benutzer veränderbar?
Statische Daten kannst du in deine EXE/DLL einbetten und zur Laufzeit über ResourceManager laden. Dann kümmert sich .NET um alles, du fügst die Dateien beim Entwickeln deiner Anwendung hinzu und lädst sie dann wenn du sie brauchst.
Bei dynamischen Dateien geht das natürlich nicht. Da würde ich alles binär abspeichern, am Anfang der Datei baust du dir dann ein Inhaltsverzeichnis mit Name, Datentyp, Länge und Offset innerhalb der Datei. Wenn du dann eine bestimmte Datei brauchst, liest du ab Position <Offset> <Länge> Bytes und schon hast du deine Daten.
Nö, der DataReader wird nicht automatisch geschlossen, sonst könnte man ja nie Daten daraus auslesen.
Die Exception besagt, dass einfach keine Daten zur Konvertierung vorliegen. Schau dir halt im Debugger mal den Inhalt des DataReaders an.
Trim('\0');
\0 ist ein Zeichen.
Ist den interpret.Length und tempinterpret.Length gleich? Dann sind es vielleicht gar keine Leerzeichen sondern irgendwelche Sonderzeichen. Hast du dir mal den String im Debugger genauer angeschaut?
Die Antwort lautet DBCC SHRINKFILE bzw. SHRINKDB. Schau mal hier: DBCC SHRINKFILE
Fliegt die Exception kann der String nicht konvertiert werden, fliegt keine kann er konvertiert werden (und ist es auch schon). Ist doch ganz einfach.
Öffne die in der Überladungsliste verlinkten Seiten, da steht dann dass es die Funktion erst in 2.0 gibt. Hätten sie auch auf die Hauptseite schreiben können.