Laden...
J
Jack_AI myCSharp.de - Member
Selbständiger Programmierer Erlangen Dabei seit 03.06.2007 193 Beiträge
Benutzerbeschreibung

Forenbeiträge von Jack_AI Ingesamt 193 Beiträge

12.03.2008 - 00:29 Uhr

Hallo.

Ich möchte gerne testweise ein kleines Online-Spiel programmieren.

Ich wollte das so realisieren, dass alle Programme auf eine gemeinsame MySQL-Datenbank auf einem angemieteten Webspace zugreifen. Jedoch türmen sich langsam die Probleme, sodass ich mit dem Gedanken spiele, das Datenbank-Problem komplett anders anzugehen - aber wie?

Meine Probleme, die ich mit MySQL habe:

  1. Ich kann die Verbindungen zur Datenbank nicht verschlüsseln. Der Webspace hat kein SSL installiert. (Wenn jemand an mein DB-Passwort kommt, ist das Projekt gelaufen...) Ich könnte alternativ versuchen, Daten verschlüsselt an ein PHP-Skript auf meinem Webspace zu schicken und dann dort zu entschlüsseln und an die DB zu schicken. Viel Aufwand, zumal meine selbstgemachte Verschlüsselung sehr unsicher ist.
  2. Ich kann per MySQL Connector auf die Datenbank zugreifen, aber ich muss die MySQL-dll mitgeben.
    (3. MySQL kostet anscheinend was, für den Fall, dass ich mein Spiel kommerzialisiere. Vorerst aber nebensächlich.)

Warum ich also hinaus will:

Finanziell habe ich wenig Spielraum. Am besten wäre es, wenn mir hier jemand helfen könnte, meine bestehenden Probleme irgendwie zu lösen. Sollte das aber nicht möglich sein, wäre es toll, wenn jemand eine andere möglichst kostengünstige und einfache Lösung hätte, um mein Projekt realisieren zu können. Möglicherweise, durch einen Datenbank-Wechsel.

Ich hoffe, jemand hat eine zündende Idee und ist bereit, mir weiter zu helfen. Ich bin arm.

Danke,
Jack

09.03.2008 - 14:00 Uhr

was für eine Shareware Version?

Die 5.1.0.0 ist doch frei 🤔

...Wo siehst du eine Version 5.1.0.0? Auf www.eziriz.com ist die höchste Version 3.7.1.0 und bei "Type" steht "Demo/NagScreen". Meine Frage bezieht sich auf dieses "Demo/NagScreen".

edit: Ach, jetzt sehe ich, was du meinst. Du sprichst vom .NET Reflector, hier geht es aber um den .NET Reactor. 🙂

edit2: OK, mit der unregistrierten Reactor-Version wird beim Start eines "obfuscierten" Programm ein Hinweis eingeblendet, dass ein unregistriertes .NET Reactor verwendet wurde.

09.03.2008 - 12:26 Uhr

Ich habe heute mal die Shareware-Version von .NET Reactor getestet, habe allerdings ein paar Fragen dazu. Vielleicht kann mir hier jemand weiterhelfen?

  1. Zur Shareware-Version: Sehe ich das richtig, dass die Shareware-Version den vollen Funktionsumfang zur lizensierten Version hat, nur mit dem Unterschied, dass Registrierungs-Aufforderungen eingeblendet werden ("Nagware") und dass es keinen offiziellen Support gibt?

  2. Ich habe versucht, meine "obfuscierte" Anwendungsdatei mit Reflector zu öffnen, aber es kam nur eine Fehlermeldung. Soweit, so zufriedenstellend. Aber kann ich mir dadurch sicher sein, dass Passwort-Strings nicht mehr ausgelesen werden können, und dass andere, mir unbekannte Programme, meinen Quelltext nicht wieder herstellen können?

Ansonsten macht .NET Reactor auf mich einen viel versprechenden Eindruck. In Hoffnung auf Antwort,

Jack

10.02.2008 - 22:26 Uhr

Ach, hab's gefunden. Muss man in den Projekt-Eigenschaften einstellen. Mein Fehler.

Jack

10.02.2008 - 21:45 Uhr

Hallo.

Mir ist aufgefallen, dass die Windows-Anwendung das Konsolenfenster standardgemäß unterdrückt. Aber es wird nicht unterdrückt, wenn man manuell eine Form erstellt. Allerdings konnte ich nirgens im Quellcode finden, wie die Konsole unterdrückt wird.

Kann mir das jemand sagen? Bzw. wie kann ich das erreichen?

Danke,
Jack

(edit: minor change: grammar fix)

10.02.2008 - 21:38 Uhr

Ich habe auch beobachtet, dass innerhalb kurzer Zeit drei neue Parks entstanden sind. Was soll's. Reden wir nicht darüber.

Aber ich denke, das Thema ist auch durch und es besteht in meinen Augen weitgehender Konsens.

Insofern...

10.02.2008 - 21:23 Uhr

Holla! Was ist denn da passiert?!

Arbeitslosigkeit 2%
Transportwege 99%
Kriminalität 1%
Verschmutzung 1%

08.02.2008 - 12:13 Uhr

Danke für eure Antworten bisher.

Mir ist inzwischen eingefallen, warum GDI+ so langsam sein könnte. Ich glaube, das liegt daran, dass bei GDI+ keine Arbeit von der Grafikkarte abgenommen wird. Nur eine Vermutung.

Ich habe mir mal XNA angeschaut. Leider scheint man dafür Visual Studio 2005 zu brauchen. Ärgerlich, dass ich das erst vor zwei Tagen deinstalliert habe. Ich werde also warten müssen, bis VS 2008 unterstützt wird. Derzeit beschäftige ich mich mit Managed DirectX. Kann ja nicht schaden, wenn XNA so ähnlich ist.

Grüße,
Jack

07.02.2008 - 00:52 Uhr

Hallo Community.

Ich hoffe, ihr könnt mir weiterhelfen. Mir ist bewusst, dass das Thema GDI+ hier schon sehr häufig behandelt wurde. Trotzdem hoffe ich, dass ihr mir ein paar Fragen beantworten könnt.

Ich würde gerne eine Art 2D-Spiel mit C# programmieren. Aber da fangen die Probleme schon an. GDI+ scheint für ein simples 2D-Spiel die perfekte Wahl zu sein. Allerdings soll es nicht sehr leistungsfähig sein, d.h. aufwändige Berechnungen dauern zu lange.

Da wirft sich mir eine Frage auf: Wieso ist es so langsam, wenn es doch sozusagen das Fundament von 2D-Grafik in C# darstellt? Also muss doch GDI+ wiederum auf einem System* basieren, das schneller ist. Was für ein System ist das? Und wie kann ich als gemeiner C#-Coder dieses System benutzen, um schnellere Grafiken zu zeichnen? Es gibt hier zwar einen Thread, der zeigt, wie man GDI+ für schnellere Grafiken benutzen kann. Allerdings scheint man da mehr an GDI+ rumzubiegen, als auf Fundamente zurückzugreifen.

Vielleicht weiß jemand hier Bescheid, der mir GDI+ verständlicher machen kann.

Und noch mal kurz zu dem Thema 2D-Spiel. Ich habe hier bereits von einigen 3D-Systemen (wie MDX, XNA etc.) gehört, aber noch nie von einem 2D-System. Gibt es da etwas Vergleichbares oder muss ich auf MDX, XNA etc. zurückgreifen?

Danke im Voraus für Hilfe,
Jack

(*: Ich benutze das Wort "System", weil ich als Hobbyprogrammierer die Fachwörter immer durcheinander bringe. Ich hoffe, es ist trotzdem klar, was gemeint ist.)

28.01.2008 - 17:52 Uhr

Ich beobachte schon wieder einen auffälligen Zuwachs an neuen Einwohnern. Vielleicht sollte man in die Infobox noch vermerken "Bitte nicht betrügen!" mit einem Link auf diesen Thread.

(Wobei es natürlich auch sein könnte, dass jemand einfach nur den Link an mehrere Bekannte weitergegeben hat.)

Jack

25.01.2008 - 12:37 Uhr

Hallo Jack_AI,

Ich verstehe nicht ganz. Wie kommst du zu dieser Annahme, herbivore?
[...]Wissen kann ich es nicht, aber wenn innerhalb von 10 Minuten plötzlich 15 Klicks für neue Einwohner kommen (bei weniger 100 Klicks auf Einwohner am Tag) und gerade so viel, dass wir einen Platz in der Highscrore-Liste weiterkommen und das mehr als einmal, naja, dann ist die Annahme wohl begründet. 🙂

Hallo herbivore,

mir ist dazu etwas eingefallen.

Es gibt ja durchaus Städte, die in einigen Sektoren sehr angeschlagen sind. Soweit ich gesehen habe, ziehen nach zufällig(?) auftretenden Ereignissen Einwohner aus diesen Städten weg. Doch was passiert mit diesen Einwohnern? Könnte es nicht sein, dass diese Einwohner dann in andere Städte emigrieren? Wenn dieses miniCity-Programm nun in einem bestimmten Intervall dieses Ab- und Zuwanderung überprüft, könnte es vorkommen, dass eben zehn neue Einwohner auf einen Schlag hinzu kommen.

Ich weiß allerdings nicht viel über die "geheimen" Mechanismen von miniCity. Aber es wäre zumindest möglich.

Jack

23.01.2008 - 23:59 Uhr

Bevor ich auf dieses Ding da links klicke, mal eine blöde Frage: Was ist das überhaupt? Ich hab die Info gelesen, aber der Sinn entzieht sich mir trotzdem. ?(

Es gibt mehrere Gründe für dieses Projekt. Zum Einen erhöht es das Gemeinschaftsgefühl (wie auch die hier nicht fehlplatzierte Aussage, dass myCSharp.de eine tolle Community hat), zum Anderen würde es vielleicht etwas Werbung für diese Seite machen. Besonders wenn unsere Stadt sehr weit oben in der Rangliste platziert wäre.

Jack

23.01.2008 - 23:25 Uhr

Ich verstehe nicht ganz. Wie kommst du zu dieser Annahme, herbivore? Schließlich lässt sich nicht herausfinden, ob ein User mehrmals hintereinander Einwohler generiert oder ob es mehrere User sind. Oder doch?

Außerdem sollte es ohne spezielle Tools ohnehin nicht möglich sein, mehr als fünf Mal täglich einen wirksamen Klick zu erzeugen (durch IP-Wechsel). ...Obwohl bei näherer Betrachtung fünf Mal täglich schon ziemlich viel ist.

Jack

PS: Da fällt mir noch etwas ein.

Wir sind natürlich über all diejenigen froh, die - wenn sowas vorgekommen ist, die Stadt anschließend wieder in den grünen Bereich führen!

Vielleicht könnte man die Farbe für nicht-kritische Bereiche von Schwarz auf Grün ändern. Ich persönliche fände Grün besser passend, bzw. "homogener".

20.01.2008 - 12:48 Uhr

Eine tolle Erweiterung!

Mal eine dumme Frage: Für was steht "<nextnuke>1</nextnuke>" im XML-Code?

Jack

18.01.2008 - 19:42 Uhr

Hallo!

Als Ghostwriter einiger bekannter Werke (ihr habt sicherlich schon etwas von mir gelesen), habe ich mich dazu entschlossen, die erste Fan-Fiction-Kurzgeschichte zu unserer Stadt zu schreiben. Viel Spaß!

Es ist warm. Die Sonne scheint. Wie jeden verdammten Tag, zu jeder verdammten Uhrzeit in dieser verdammten Stadt, die sich "myCSharp.de" schimpft. Was ist das überhaupt für ein Name? Klingt irgendwie afrikanisch. Egal. Ein Blick aus dem Fenster. Leere Straßen. Wie in einer Geisterstadt. Merkwürdige Dinge geschehen hier. Ich lebe hier seit - fünf Tage werden es wohl sein. Und - frag mich nicht wie - aber in dieser Zeit habe ich bereits fünf Wohnungen gemietet. Die letzte haben sie mir vorgestern abgerissen und am selben Tag an der selben Stelle ein Hochhaus errichtet! Verrückt. Es gibt hier nur knapp 600 Einwohner. Der Immobilienmarkt ist regelrecht übersättigt. Trotzdem bauen sie ein Hochhaus nach dem anderen. Die Regierung plant etwas. Ich kann es riechen. Merkwürdige Dinge geschehen hier...

18.01.2008 - 13:45 Uhr

Apropos: Wir haben unsere erste Verschmutzung:

Einwohner 503
Einkommen 113T€

Arbeitslosigkeit 0%
Transportwege 100%
Kriminalität 0%
Verschmutzung 1%

Ich habe es bisschen beobachtet. Die Verschmutzung entstand, als eine neue Fabrik eröffnet wurde.

16.01.2008 - 17:08 Uhr

Hallo Golo,

ich wusste gar nicht, dass "guide to C#" von dir ist. Nachdem mir die Seite immer sehr geholfen hat, möchte ich auch mal (kurzes!) Feedback geben:

An sich ist die Seite natürlich super! Was mich nur stört ist, dass die Code-Beispiele durch die langen Kommentare, bzw. durch die Dokumentation so aufgebläht wirken. Aber ich kann auch mit den Kommentaren gut leben. 😉

Ansonsten Danke für die tolle Seite,
Jack

16.01.2008 - 17:01 Uhr

Jetzt geht es aber los hier. Immer mehr Zuwachs. Ich tippe auf:

kleineseichhoernchen: Man könnte ja bissl pushen... Kleines Tool, verknüpft mit einem Tor-Netzwerk 😉

Finde ich gut. Schließlich haben wir einen Ruf zu verlieren!

Aber irgendwie verstehe ich unsere Stadt nicht. Warum steht ein Hochhaus am äußeren Rand der Stadt nordöstlich? Und warum stehen Fabriken mitten in der Stadt? Und warum ist immer Tag? Fragen über Fragen...

15.01.2008 - 19:16 Uhr

Hallo.

Ich habe auch "nur" ein drückbares Mausrad, komme aber trotzdem damit sehr gut zurecht. Ich persönlich kann Popup-Links überhaupt nicht leiden und hoffe daher, dass deine Idee keinen Zuspruch findet.

Jack

15.01.2008 - 14:02 Uhr

Ich fühle mich verantwortlich für die Stadt und bin total motiviert, sie zum Gedeihen zu bringen. (Das klingt vielleicht ironisch, ist es aber nicht)

14.01.2008 - 01:08 Uhr

Hallo.

Ich weiß nicht, ob es dir bewusst ist, aber es gibt bereits solch ein Programm namens Poker Tracker.

Grüße,
Jack

12.01.2008 - 18:56 Uhr

OK, ich habe festgestellt, dass das Problem an der Logik lag. Es hat mit dem Zeichnen an sich nichts zu tun.

Allerdings habe ich gerade ein andere Problem bemerkt:
Ich habe ja meine Endlosschleife, in der alle paar Millisekunden das Bild neu gezeichnet wird. Allerdings wird das Bild auch neu gezeichnet, wenn das Bild durch andere Umstände (z.B. wenn ich ein anderes Fenster darüber ziehe) neu gezeichnet werden muss. Dadurch werden wird die Darstellung beschleunigt. Wie kann ich das verhindern?

07.01.2008 - 21:20 Uhr

Normal sollte die Berechnung von deinen vorangegangenen Thread nicht wirklich belastent sein. So das ich eher andere Fehlerquellen vermute - nur dazu brauche ich die Zeichenroutine von dir + Aufruf als Code zum sichten.

Ich weiß nicht, ob dir das wirklich helfen wird. Ich poste das hier einfach mal. Hoffnung habe ich nicht wirklich.

Konstruktor:


    public Form1()
    {
      InitializeComponent();

      ...

      // EventHandler
      pn_Flaeche.Paint += new PaintEventHandler(pn_Flaeche_Paint);

      // Timer
      RefreshTimer = new Timer();
      RefreshTimer.Interval = Convert.ToInt32((1 / (double)ClassGlobal.FPS) * 1000); // FPS = 30
      RefreshTimer.Tick += new EventHandler(RefreshTimer_Tick);
    }

    // Timer-Ticks
    void RefreshTimer_Tick(object sender, EventArgs e)
    {
      ClassGlobal.Time++;
      pn_Flaeche.Invalidate(); 
    }

Zeichen-Routine:


    void pn_Flaeche_Paint(object sender, PaintEventArgs e)
    {      
      if (ClassGlobal.ProgramStarted)
      {
        if (Objektliste.Count > 0)
        {
          foreach (ClassObject Objekt in Objektliste)
          {
            // Hinweis: Problem tritt schon bei nur einem Objekt auf
            Objekt.DoYourJob(e.Graphics); // Objekt wird gezeichnet und Bewegung wird berechnet
          }
        }

        // Zeit anzeigen
        e.Graphics.DrawString(Math.Round(ClassGlobal.SITime(), 1).ToString(), new Font("Times New Roman", 12, FontStyle.Regular), 
          Brushes.Black, new PointF(ClassGlobal.Bildbreite - 50, ClassGlobal.Bildhoehe - 30));
      }
    }

Was mir aufgefallen ist: Wenn sich das Objekt nur auf der X- oder Y-Achse bewegt, tritt dieser Effekt nicht. Für "schräge" Bewegungen werden mehr Berechnungen gebraucht. Daher vermute ich, dass entweder die komplexeren Rechungen einen Fehler enthalten (was ich eigentlich ausschließe), oder diese Berechnungen zu viel Zeit brauchen.

06.01.2008 - 21:11 Uhr

Das ist gar nicht mein Problem.

Ich stelle meine Frage noch einmal anders:
Was passiert denn, wenn das Programm für die Berechnungen länger braucht, als den Bruchteil einer Sekunde, den ich dem Programm zur Verfügung stelle? Ich sage dem Programm ja, "Hey, Programm! Berechne das Ganze in 40ms noch mal neu!" - "Und wenn ich das in der Zeit nicht schaffe, mein Gebieter?" - "Dann... dann..." Ja, was dann?

06.01.2008 - 18:02 Uhr

Hallo.

Ich versuche mit GDI+ die Bewegung eines Objektes zu realisieren. Dazu lasse ich, wie in diesem Thread geschildert, ein Objekt von einem Punkt zum anderen wandern. Zuerst wollte ich das so lösen, dass die Bilder nach einer vorgegebenen Zeit aktualisiert werden. Dazu habe ich anfangs mit 30 Aktualisierungen pro Sekunde gearbeitet (30 Bilder/Sekunde = 30 FPS).

Allerdings ist ein merkwürdiger Fehler aufgetreten: Das Objekt "springt" plötzlich, obwohl es sich geradeaus bewegen soll. Als ich die feste FPS-Rate auf 100 erhöht habe, trat dieser "Sprung" früher auf, als ich sie gesenkt habe, trat er früher oder gar nicht auf.

Auf dem Bildschirm wird zudem eine Zeitanzeige angezeigt, die auf die erste Nachkommastelle genau immer die Zeit seit Programmstart anzeigen soll. (Auf erste Nachkommastelle genau heißt also, dass sie zumindest alle 1/10 Sekunden aktualisiert werden soll). Aber schon bei 10 FPS tritt dieser Fehler auf.

Mein Verdacht ist also, dass durch die festgegebene Frequenz das Programm mit den vielen Berechnungen pro Sekunde nicht ganz fertig wird, und so die Berechnungen verfälscht werden (die Zeit fließt in die Berechnung mit ein). Ist dieser Verdacht berechtigt? Wenn ja, müsste ich es anders realisieren. Aber wie halte ich dann die Uhrzeit aktuell?

Danke im Voraus,
euer verzweifelter Jack

05.01.2008 - 17:06 Uhr

Hallo.

Ich würde gerne ein Programm schreiben. In das Programm kann man seine Kontonummer, seine Bankleitzahl und einen Betrag reinschreiben, und anschließend wird der Betrag von diesem Konto auf meines überwiesen. Lässt sich das mit C# realisieren? Hat jemand einen Codeschnippsel dafür?

Danke im Voraus,
Jack

05.01.2008 - 00:07 Uhr

Ich versteh nicht recht... Die Steigung geht doch gar nicht mehr in deine Berechnung ein.

Du hast recht. Daran habe ich gar nicht mehr gedacht. Richtig lösen konnte ich das Problem nicht. Dafür müsste ich erst wieder meine Mathekenntnisse auffrischen. Schon dieses vermeintlich einfache Problem hat jetzt vorerst genug mathematisches und physikalisches Wissen von mir abverlangt.

Die Lösung:

Ich konnte das Ganze nun entgültig lösen. Die Formel war übrigens nicht ganz richtig. Richtig ist die Formel so (im Vergleich zur vorherigen falschen Formel nähme die Geschwindigkeit konstant zu):


      if (PosX < ZielX)
        NextPosX = StartPosX + Speed * Zeit * CosWinkel;
      else
        NextPosX = StartPosX - Speed * Zeit * CosWinkel;

      if (PosY < ZielY)
        NextPosY = StartPosY + Speed * Zeit * SinWinkel;
      else
        NextPosY = StartPosY - Speed * Zeit * SinWinkel;

Ich versuche hier noch mal grob meine Gedanken zu dokumentieren, damit andere Anfänger und Fortgeschrittene mit dem selben Problem zumindest mal ein paar Ausgangspunkte haben.

Das Problem war, dass ich im Rückblick auf meinen ersten Ansatz sehr viele Dinge falsch angegangen bin, und wenn man nur einen Fehler behebt, die Bewegung noch immer total unlogisch verläuft. Deshalb ist es schwer, eine Fehlerquelle allein durch Ausprobieren auszuheben.

Wie man den Winkel zwischen zwei Punkten herausfinden kann:


      double TanWinkel;

      if (DeltaX() == 0)
        TanWinkel = 0;
      else
        TanWinkel = DeltaY() / DeltaX();

      double Winkel = Math.Atan(TanWinkel);

Wichtig ist hierbei zu schauen, dass DeltaX nicht Null werden darf. DeltaX und DeltaY steht jeweils für die Differenz zwischen der X- bzw. Y-Koordinate von Position und Ziel. Der Cosinus und Sinus des Winkels fließen dann in die obere Formel ein. Einfachheitshalber mache ich Folgendes:


      if (DeltaX() == 0)
      {
        CosWinkel = 0;
        SinWinkel = 1;
      }

      if (DeltaY() == 0)
      {
        CosWinkel = 1;
        SinWinkel = 0;
      }

Das bedeutet, dass wenn das Ziel sich nur in einer der beiden Achsen vom Ursprung unterscheidet, die betroffene Koordinate konstant bleibt.

Beispiel:
Aktuelle Position ist 100/200 und das Ziel hat die Koordinaten 100/400. Das Objekt würde sich also nur auf der X-Achse verschieben. Es wandert also nach rechts, bildlich gesprochen. Damit wird DeltaX = 0. Nach meinem Code wird damit auch der Cosinus = 0, was dazu führt, dass die Formel

NextPosX = StartPosX + Speed * Zeit * CosWinkel;

immer den Wert der Startposition behält. Im Fall des Beispiels 100.

Was genau ist die Zeit?

Die Zeit in der Formel ist die Zeit, die seit dem Start der Bewegung vergangen ist. In meinem Beispiel lasse ich die Bewegung erst nach einer Sekunde starten. Dementsprechend fängt die Zeit auch erst an, nachdem eine Sekunde vergangen ist:


    private double ZeitSeitBewegung(bool Set)
    {
      if (Set)
      {
        if (ZeitpunktBewegung == 0)
          ZeitpunktBewegung = ClassGlobal.SITime();
      }

      double ZeitSeitBeweg = ClassGlobal.SITime() - ZeitpunktBewegung;

      return ZeitSeitBeweg;
    }

SiTime() ist die Zeit, die seit Programmstart vergangen ist, in Sekunden. ZeitpunktBewegung ist ein Feld des Objekts.

Ich habe das Setzen der Zeit mit einer Variable "Set" geknüpft, da die Funktion später noch mal aufgerufen wird, um die aktuelle Zeit auszugeben, aber hier die Zeit nicht gesetzt werden soll.

Problem: Mein Objekt schießt über das Ziel hinaus und verhält sich danach komisch.

Um dieses Problem abzufangen, muss überprüft werden, ob das Objekt nicht im nächsten Schritt über das Ziel hinausschießt. Das Ziel pixelgenau zu treffen ist sehr unwahrscheinlich. Daher folgender Code:


      if (CosWinkel == 0)   
      {
        if ((ZielY >= PosY && ZielY <= NextPosY) || (ZielY <= PosY && ZielY > NextPosY))
        {
          ZielWurdeErreicht();
          return true;
        }
      }
      else if (SinWinkel == 0)
      {
        if ((ZielX >= PosX && ZielX <= NextPosX) || (ZielX <= PosX && ZielX > NextPosX))
        {
          ZielWurdeErreicht();
          return true;
        }
      }
      else
      {
        // wenn das Ziel zwischen der aktuellen und der nächsten Position liegt
        if ((ZielX >= PosX && ZielX <= NextPosX) || (ZielY >= PosY && ZielY <= NextPosY) ||
          (ZielX <= PosX && ZielX > NextPosX) || (ZielY <= PosY && ZielY > NextPosY))
        {
          ZielWurdeErreicht();
          return true;
        }
      }

Die Fallunterscheidung hängt mit dem oben beschriebenen Fall zusammen, dass sich das Objekt nur auf einer Achse bewegt. Für einen solchen Fall testen wir einfach, ob das Objekt mit dem nächsten Schritt auf der anderen Achse das Ziel überschreiten würde. Ansonsten wird geprüft, ob das Ziel auf einer der beiden Achsen überschritten werden würde. Normalerweise sollte es auf beiden Achsen gleichzeitig überschritten werden. Aber das trifft wahrscheinlich nur bei sehr kleinen (oder großen?) Bewegungseinheiten zu.

Ich hoffe, ich konnte meine Überlegungen verständlich machen, und dieser Beitrag dem ein oder anderen hilft. Ich hoffe auch, dass auf meiner Seite diesbezüglich keine weiteren Probleme mehr auftreten.

Jack

edit: Ach ja. Und Danke noch mal an alle, die mir hier geholfen haben! Ohne euren "Stupps in die richtige Richtung zur richtigen Zeit" hätte ich das wahrscheinlich nie hinbekommen und aufgegeben. 😉

04.01.2008 - 16:11 Uhr

Oh, wow. Ich habe es endlich hinbekommen! Ich behaupte einfach mal, dass ich das Problem jetzt gelöst habe, lasse mich aber gerne eines Besseren belehren. Wenn meine Lösung jetzt stimmt, schreibe ich nachträglich noch einen (längeren?) Beitrag, für all diejenigen, die mit den gleichen Problemen zu kämpfen haben werden, und gehe dabei auf meine gemachten Fehler ein.

Die entscheidende Stelle sieht jetzt so aus:


      double NextPosX;
      double NextPosY;

      // Formeln müssen für größeres / kleineres Ziel angepasst werden

      if (PosX < ZielX)
        NextPosX = StartPosX + StartPosX * Speed * Zeit * Math.Cos(WertWinkel);
      else 
        NextPosX = StartPosX - StartPosX * Speed * Zeit * Math.Cos(WertWinkel);

      if (PosY < ZielY)
        NextPosY = StartPosY + StartPosY * Speed * Zeit * Math.Sin(WertWinkel);
      else
        NextPosY = StartPosY - StartPosY * Speed * Zeit * Math.Sin(WertWinkel);

      // wenn das Ziel zwischen der aktuellen und der nächsten Position liegt
      if ((ZielX >= PosX && ZielX <= NextPosX) || (ZielY >= PosY && ZielY <= NextPosY) ||
        (ZielX <= PosX && ZielX > NextPosX) || (ZielY <= PosY && ZielY > NextPosY))
      {
        ZielWurdeErreicht();
        return true;
      }

      PosX = NextPosX;
      PosY = NextPosY;

      return false;

Was ich allerdings noch nicht behoben habe, ist, wie man vorgeht, wenn DeltaX 0 wird:


      if (DeltaX() != 0)
        Steigung = DeltaY() / DeltaX();
      else
        Steigung = ???

Wenn mir hier noch jemand auf die Sprünge helfen könnte, wäre das sehr nett.
Jack

04.01.2008 - 15:14 Uhr

Hallo.

Ich habe jetzt einen neuen Ansatz, nachdem Cosinus und Sinus zu merkwürdigem Verhalten geführt haben:

PosX = StartPosX + StartPosX * Speed * Zeit;
PosY = StartPosX + StartPosY * Speed * Zeit * Steigung;

Doch das führt auch zu einem merkwürdigen Problem. Das Objekt steuert das Ziel richtig an, aber nach ca. 3/4 der Strecke nimmt das Objekt zufällige Positionen an. Es "tanzt wild herum", sozusagen. Ich kann mir dieses Verhalten nicht erklären.

Und noch eine dumme Frage:


      double Steigung;

      if (DeltaX() != 0)
        Steigung = DeltaY() / DeltaX();
      else
        ???

Wie behandle ich die Steigung, wenn DeltaX gleich Null ist?

Danke,
Jack

01.01.2008 - 22:56 Uhr

Mit dieser Formel


      PosX = PosX - (ZeitpunktBewegung * Speed * CosWinkel);
      PosY = PosY - (ZeitpunktBewegung * Speed * SinWinkel);

habe ich das Problem, dass mein Objekt zuerst wendet, bevor es das Ziel ansteuert, und dabei an Geschwindigkeit zunimmt.

Mein Programm (.exe-Datei) (Position ist 400/400, Ziel ist 600/1)

01.01.2008 - 22:30 Uhr

      double CosWinkel = (PosX * ZielX + PosY * ZielY) / 
        (Math.Sqrt(Math.Pow(PosX, 2) + Math.Pow(PosY, 2)) * 
        Math.Sqrt(Math.Pow(ZielX, 2) + Math.Pow(ZielY, 2)));
      double Winkel = Math.Acos(CosWinkel);

Ich habe mit mal das Ergebnis von "Winkel" ausgeben lassen. Das scheint irgendwie nicht zu stimmen. Wenn das Ziel die Koordinaten 1/1 hat und Position die Koordinaten 400/400, muss logischerweise der Winkel 45° sein, bzw. 315°. Ich bekomme aber als Ergebnis 1,49 * 10 hoch -8! (Als Bogenmaß interpretiert wäre der Winkel immerhin noch 8,5 * 10 hoch -7)

edit:
Oh, wow! Ich glaube, ich hab's jetzt! Ein Freund hat mich auf die Formel


      double TanWinkel = (PosY - ZielY) / (PosX - ZielX);
      double Winkel = Math.Atan(TanWinkel);

aufmerksam gemacht. Und siehe da: Wenn ich das Ergebnis als Bogenmaß interpretiere, bekomme ich einen Winkel von 45 Grad raus!

01.01.2008 - 16:59 Uhr

@O5IRI5:

Danke für deinen ausführlichen Hinweis! Leider habe ich überhaupt keine Ahnung von Vektoren, sonst hätte ich selber versucht es mit Vektoren zu berechnen.

@N1ls:

Mein Ansatz wäre:

cos a = (X1 * X2 + Y1 * Y2) / (sqrt(X1² + Y1²) * sqrt(X2² + Y2²))
...

Ich hab keine Ahnung, wie Du auf diese Formel kommst und ob diese annaehrend korrekt sein kann. Fuer mich persoenlich muss grundsaetzlich ein Minus-Zeichen in einer Formel auftauchen, wenn aus Koordinatenpaaren ein Winkel berechnet werden soll.

Gruesse,

N1ls

Hallo N1ls,

die Formel habe ich von hier. Ich habe lediglich die Z-Dimension vernachlässigt.

Grüße,
Jack

01.01.2008 - 15:00 Uhr

Frohes Neues 🙂

Dir auch! 🙂

Hab die Formel jetzt selber gar nicht untersucht -- aber ein häufiger Fehler ist, dass mit int werten gerechnet wird -- sind bei dir PosX, ZielX, PosY und ZielY alle vom Typ double?

Ja, sind alle double. Es stimmt: Zuvor habe ich int benutzt, was zu merkwürdigen Fehlern geführt hat.

01.01.2008 - 13:48 Uhr

Hallo!

Ich möchte in C# ein Objekt1 auf Objekt2 zugehen lassen. Gegeben sind also die Koordinaten von Objekt1 und Objekt2 und die Geschwindigkeit von Objekt1. Dazu suche ich eine Formel, mit der ich die Position von Objekt1 zum Zeitpunkt t herausfinden kann.

Mein Ansatz wäre:

cos a = (X1 * X2 + Y1 * Y2) / (sqrt(X1² + Y1²) * sqrt(X2² + Y2²))
X1 = X1 - X1 * t * v * cos a
Y1 = Y1 - Y1 * t * v * cos a

bzw. in C#-Code:


double CosWinkel = (PosX * ZielX + PosY * ZielY) / 
  (Math.Sqrt(Math.Pow(PosX, 2) + Math.Pow(PosY, 2)) * 
  Math.Sqrt(Math.Pow(ZielX, 2) + Math.Pow(ZielY, 2)));
PosX = (PosX - PosX * ZeitpunktBewegung * Speed * CosWinkel);
PosY = (PosY - PosY * ZeitpunktBewegung * Speed * CosWinkel);

Allerdings haut das irgendwie nicht hin. Das Ergebnis ist, dass Objekt1 immer nach links oben fährt, unabhängig vom Ziel (was eigentlich durch das cos a verhindert werden soll). Ich habe versucht, die Formel durch Probieren herauszufinden, was aber an meinen geringen Physikkenntnissen gescheitert ist.

Wenn mir jemand hier helfen könnte, wäre das janz doll. Danke.

28.10.2007 - 20:53 Uhr

Vielen Dank.

Ich habe das Problem jetzt lösen können, indem ich zuvor den Nodetyp verglichen habe. Danke für den entscheidenden Tipp. Dass es ohne vorherigen Vergleich jedoch gar nicht geht, finde ich ziemlich merkwürdig. Es wird wohl aber einer Logik folgen.

Jack

22.10.2007 - 19:15 Uhr

Hallo.
Ja, das habe ich auch probiert. Leider auch keine Reaktion.

22.10.2007 - 17:15 Uhr

Der Debugger sagt leider gar nix.

20.10.2007 - 23:52 Uhr

Hallo.

Ich stehe eben auf dem Schlauch. Ich habe folgenden Code:


XmlTextReader xreader = new XmlTextReader(Datei);

while (xreader.Read())
{
  if (xreader.Name.Equals("elementname")) // <- hier, der entscheidende Punkt
  {
    //weitere Anweisungen
  }
}

Leider wird die If-Anweisung nie ausgelöst, obwohl das Element existiert. Die Rechtschreibung stimmt. Wenn ich alle Elemente ausgeben lasse, kommt das Element auch vor. Ich vermute einen Logikfehler meinerseits, konnte aber trotz längerer Suche keine Lösung finden.

Danke für den entsprechenden Hinweis im Voraus.

Jack

21.09.2007 - 23:26 Uhr

Ich habe mich noch nie näher mit Mono befasst, da ich auch nie mit Linux zu tun habe, hört sich aber ziemlich klasse an. Aber na gut, wo wir gerade schon so stark richtung Mono abgeschwiffen sind, versuche ich mal elegant Mono und PDA wieder zusammenzuführen:

Wie funktioniert das eigentlich, wenn ich ein C#-Programm geschrieben habe, das die Klasse "SpecialDirectories" benutzt? SpecialDirectories dient eigentlich dazu, Pfadangaben zu den Eigenen Dateien und ähnliches zu erhalten. Ich bezweifle aber stark, dass ein PDA / Linux das hat.

Ansonsten wäre es mir auch recht, wenn jemand noch ein paar Fragen aus meinem ersten Posting beantworten könnte. 🙂

Jack

PS und edit:
@egrath: Danke für deinen Hinweis mit dem N770/N800. Das PDA ist bei mir jetzt in der engeren Auswahl. 👍

20.09.2007 - 21:19 Uhr

Hallo egrath,

vielen Dank schon mal für die ausführliche Antwort. Deine Idee hört sich wirklich vielversprechend an. Bedeutet das also, dass ich im Gegensatz zu Windows-Mobile-PDAs auf das ganze .NET-Spektrum zugreifen kann? Das wäre ein ziemlicher Vorteil.

Grüße,
Jack

Weitere Meinungen und Erfahrungen sehr gerne willkommen!

20.09.2007 - 14:51 Uhr

Hallo!

Ich spiele derzeit mit dem Gedanken mit ein PDA zuzulegen. Auf dem PDA möchte ich auch selber programmierte C#-Applikationen (offline und online) benutzen. Soweit ich mitbekommen habe, soll das mit dem Compact Framework möglich sein.

Vor dem Kauf würde ich aber gerne noch von euch wissen:

  • Welche Erfahrungen habt ihr mit C# in Verbindung mit einem PDA gemacht?
  • Was muss ich beim Kauf eines PDAs beachten?
  • Welche Erfahrungen habt ihr mit der W-LAN-Fähigkeit eines PDAs gemacht? (Zuverlässigkeit, Reichweite...) (Ist W-LAN und WiFi eigentlich das selbe?)
  • sonstige Anmerkungen

Danke im Voraus für das Teilen eurer Erfahrung,
Jack

13.09.2007 - 20:15 Uhr

Hallo herbivore,

ich habe den Tipp mit "Button auf Website ausprobiert". Ich muss erstmal sagen, dass ich ganz erstaunt bin, dass es überhaupt solche Funktionen gibt. Ich habe dabei weitestgehend deinen Beispiel-Code übernommen und dabei die Control-IDs angepasst. Einloggen funktioniert auch, allerdings legt er scheinbar kein Cookie an. Wenn ich eine Unterseite auf der Website mit einem StreamReader auslesen möchte, wirft er mich wieder zur Login-Seite zurück.

Jack

08.09.2007 - 23:05 Uhr

Hallo.

Ich würde gerne an den HTML-Quellcode einer fremden Website gelangen. Normalerweise funktioniert das ganz gut, nur bei Websites mit Login (also solche, die mit Sessions arbeiten) funktioniert das Ganze nicht.

Mein Lösungsansatz wäre gewesen, die Cookie-Dateien auf dem Computer nach einer Session-ID zu durchsuchen und der Website als URL-Variable mitzugeben. Allerdings dauert das sehr lange, da die ganzen temporären Dateien durchsucht werden müssen. Und davon gibt es meist sehr viele. Außerdem muss der Variablenname der Session-ID stimmen, und ich weiß nicht, wie ich ihn finde (im Quellcode nicht, da PHP?). Ich hoffe, das Problem ist nachvollziehbar.

Deswegen, als Zusammenfassung:

  • Gibt es einen bewährten, schnellen Weg so eine Website auszulesen?
  • Ist es moralisch, so ein Programm weiterzugeben, auch wenn es etwas ganz harmloses tut? Ich habe Bedenken, weil Sessions doch ein sicherheitskritisches Thema ist und der Rechner dafür durchsucht werden muss.

Danke,
Jack

01.09.2007 - 00:53 Uhr

Ich versuche es jetzt mit keybd_event() im Zusammenspiel mit der Keys-Enumeration.

SendMessage() verlangt für mich, als fortgeschrittenen Anfänger, ziemlich merkwürdige Parameter, bzw. weiß ich nicht, wie man diese Parameter richtig marshallt. Also lieber keybd_event().

Meine Lösung wäre nur das Zirkumflex durch keybd_event() zu ersetzen und für alle anderen Zeichen SendKeys zu verwenden. Für alle, die es interessiert: Das Zirkumflex ist oem5.

Jack

PS: Ich habe gerade entdeckt, dass es das Problem schon früher einmal gab.

30.08.2007 - 18:47 Uhr

Mh. Na gut. Danke fürs Testen. Dann muss ich / man eben auf die dll-Funktion zugreifen.

Danke,
Jack

30.08.2007 - 14:31 Uhr

Das Problem ist, dass wenn ich nur die Zeile SendKeys.SendWait("{^}"); eingebe, ein Und-Zeichen dabei rauskommt. Ich habe auch probiert, das Zirkumflex als ASCII-Nummer ( char(94).ToString() ) anzugeben. Er macht trotzdem ein Und-Zeichen daraus.

Original von 0815Coder
^ wird ja auch nicht angezeigt, wenn du es einmal an der tastatur eingibst. erst wenn du danach space drückst, kommt das ^. vielleicht musst du einfach zwei SendKeys absetzen (bzw einen mit space hinterher).

Daran habe ich auch schon gedacht und es so ausprobiert. Das Ergebnis: Er wandelt das Zirkumflex in ein Und-Zeichen um und setzt dahinter ein Leerzeichen. Nicht unbedingt befriedigend...

Jack

Nachtrag:
Vielleicht kann hier ein Freiwilliger das Problem mit VS 2005 testen. Einfach einen Button erstellen und dann für das button.Click-Event:


Thread.Sleep(3000); // 3 Sekunden warten
SendKeys.SendWait("{^}");

Nach dem Klick auf den Button innerhalb von 3 Sekunden auf eine beliebige Textbox klicken (Texteditor z.B.) und dann schauen, welches Zeichen dabei rauskommt. Nur als kleine Idee.

29.08.2007 - 19:44 Uhr

Hallo.

Ich habe ein Problem mit dem Befehl SendKeys.SendWait. Wenn ich den Befehl SendKeys.SendWait("{^}"); ausführe, schreibt er kein Zirkumflex ^, sondern stattdessen ein Und-Zeichen &. Ich habe alle Sonderzeichen ausprobiert, die nach MSDN mit geschweiften Klammern angegeben werden sollen, aber nur das Zirkumflex wird vertauscht.

Ansonsten verwende ich zum Umwandeln diesen Code, aber auch wenn ich den Befehl direkt benutze wird es vertauscht:


      // bestimmte Zeichen müssen für SendWait in Format {x} gebracht werden
      char[] BoeseZeichen = new char[] { '^', '%', '~', '+', '(', ')', '{', '}', '[', ']' };

      string ZeichenToSend = String.Empty;
      
      for (int i = 0; i < Text.Length; i++)
      {
        ZeichenToSend = Text[i].ToString();

        foreach (char Zeichen in BoeseZeichen)
        {
          if (Text[i].Equals(Zeichen))
            ZeichenToSend = "{" + Text[i].ToString() + "}";
        }

        SendKeys.SendWait(ZeichenToSend); // alternativ: SendKeys.SendWait("{^}");
      }

Ist das Zirkumflex ein Spezialfall, oder bin ich nur wieder zu blöd? 😉

Grüße,
Jack

29.08.2007 - 02:25 Uhr

Ah, klar. Mausposition-ändern ist "Cursor.Position = Point".

29.08.2007 - 01:32 Uhr

Könnte man stattdessen nicht auch einen Thread mit höchster Priorität (höher als Maus) erstellen und den mit Sleep blockieren? Geht das überhaupt?

Jack

25.08.2007 - 22:08 Uhr

Ach klasse. Hab's schon:


  while ((AktuelleZeile = Reader.ReadLine()) != null)
  {
    MessageBox.Show(AktuelleZeile);
  }

Manchmal sieht man die Lösung vor lauter Vakuum nicht.

Jack