Laden...

Forenbeiträge von stefanpc81 Ingesamt 24 Beiträge

17.11.2020 - 16:34 Uhr

Innerhalb der 11 TextBlocks können aber auch leere Zeilen (wie ich sie im Beitrag Eine Klasse oder mehrere Klassen für ein WPF-Programm (Flugsimulator)? weiter oben versucht habe zu erklären). Daher ist m.E. eine ListView keine Alternative dazu. Für andere Text-Elemente ist die Position auch mit der Zeit anders. Zumal Elemente der Canvas je nach Wert bestimmter Felder aus anderen Klassen sogar teilweise ausgeblendet werden sollen.
Als ich die "berühmte" Frage stellte, ob ich alles in eine Klasse packen kann, wusste ich noch nicht, dass man wie von User JimStark erläutert, eine "Referenz einer Klasse einer anderen mitgeben" kann.

Ohne MVVM auf ein Canvas zu zeichnen, allerdings nur innerhalb der Klasse und dem Konstruktor MainWindow, weiß ich aber wie das geht. Ich habe mir schon seit ein paar Wochen vor dem Erstellen dieses Threads Lernprojekte gemacht. Canvas zeichnen, Audio abspielen, Daten aus Dateien auslesen, scrollen des Fensters, welches ca. 2200pixel hoch ist waren Inhalt dieser. Verständnis wie man if/else-Zweige und for-Schleifen logisch aufbaut, habe ich prinzipiell keine Probleme, siehe Vorkenntnisse Javascript. - Was soll ich deiner Meinung nach insbesondere von den "Grundlagen" anschauen?

17.11.2020 - 15:16 Uhr

Hallo,
ich verstehe. Ich war anfangs zu ungeduldig um längere Textpassagen zu lesen. Ich habe mich in der Zwischenzeit mit MVVM beschäftigt und MrSparkles Beispiel-Projekt heruntergeladen und es mir angeschaut.
Für meinen Simulator brauche ich später ein paar Canvas-Zeichenflächen, welche ich nicht mit den anderen WPF-Steuerelementen füllen möchte. Abgesehen evtl. von TextBlocks. Text und geometrische Elemente haben zur Laufzeit veränderbare X/Y-Koordinaten (Canvas.Left, Canvas.Top).
Im Internet habe ich nur wenige Lösungsansätze gefunden (welche ich teilweise auch nicht ganz verstanden habe), wie ich diese Elemente unter MVVM an das betreffende Canvas-Objekt binde bzw. bei Änderung eines mindestens einzelnen CanvasChild-Elements per DataBinding aktualisiere.
Mir wäre es persönlich lieber, die Objekte für die Canvas-Oberflächen in Klassen auszulagern und ich im XAML-Code z.B.

 <Canvas x:Name="canvas_eicas" HorizontalAlignment="Left" Height="400" Margin="200,100" VerticalAlignment="Top" Width="400" Background="Black" ClipToBounds="True"/>

schreiben würde. Ich würde gerne die „internal static class CanvasAssistant“, die ich unter
https://stackoverflow.com/questions/889825/is-it-possible-to-bind-a-canvass-children-property-in-xaml gefunden habe, als Teil der Lösung verwenden. Leider verstehe ich nicht, wie ich eine der definierten Klassen für die CanvasChild-Elemente diese Klasse „CanvasAssistant“ anspreche, bzw. ob ich die Methode SetBoundChildren(…) oder OnBoundChildrenChanged(…) verwenden muss.
Ein Beispielcode meiner Klasse „EICAS_canvas“ könnte so aussehen:
EDIT: Dass das Folgende über eine for-Schleife läuft, ist mir klar.

        public static void DrawMessages(object mess, int i, string text, string typ)
        {
            FontFamily arial = new FontFamily("Arial");
            TextBlock[] EICAS_message = (TextBlock[])mess;

            int y = (i * 15) + 2;
            int x = 200;
            if (typ == "advisory") { x = 208; }
            
            if (typ == "warning") { EICAS_message[i].Foreground = Brushes.Red; }
            else if (typ == "memo") { EICAS_message[i].Foreground = Brushes.White; }
            else { EICAS_message[i].Foreground = Brushes.Yellow; }
            
            EICAS_message[i].FontSize = 12;
            EICAS_message[i].FontFamily = arial;
            EICAS_message[i].TextAlignment = TextAlignment.Center;
            EICAS_message[i].Text = text;
            EICAS_message[i].Width = 200;

            Canvas.SetLeft(EICAS_message[i], x);
            Canvas.SetTop(EICAS_message[i], y);
        }

Dazu würde ein Array mit der Größe 11 (Parameter i) den Text (Parameter text) und den Typ (warning, caution, advisory oder memo) der Message übergeben.
Ich bitte um Hilfe.
Grüße

08.11.2020 - 17:36 Uhr

Hallo,

zur Drei-Schichten-Architektur:
"Die Präsentationsschicht übernimmt die Aus- und Eingabe der Daten": Stimmt in meinem Fall nur bedingt. Die Methode "Berechne0_5" könnte bspw. mitten im Flug feststellen, dass der rechte Treibstofftank leer wird und das rechte Triebwerk ausgeht. In diesem Fall würden im Monitor EICAS Warnmeldungen erzeugt (Canvas wird verwendet) und im gleichen Monitor ändert sich die Grafik der Drehzahl (BitmapImage wird verwendet). Der Autopilot (den ich bisher schon mit Javascript programmiert habe) ist ebenso eine Option im Hintergrund das Flugzeug zu steuern (x- und y-Achse), welches wiederum Änderungen im ND-Monitor zur Folge hat.

Zum DataBinding:
Die Änderungen (BitmapImage, Canvas) machen für meinen Zweck wenig Sinn. Es gibt einen MFD-Monitor mit 4 verschiedenen Oberflächen (Canvas) und einen ND-Monitor mit 3 verschiedenen Oberflächen (Canvas). Die anderen 3 bzw. 2 sind dann nicht sichtbar.
Diese Oberflächen haben hier einen bestimmten Modus und wurden von mir bisher immer mit der if/else-Logik gesteuert, sodass immer nur der Teil des Modi gezeichnet und aktualisiert wird, welcher gerade aktiv ist. Das DataBinding würde, wenn ich es richtig verstanden habe, alle Werte auf Updates überprüfen obwohl sie gerade gar nicht sichtbar sind.
Auf dem EICAS-Monitor werden bis zu 11 Warnmeldungen untereinander (Canvas) dargestellt, die jeweils über eine for-Schleife ermittelt werden. Das sieht dann nach folgendem Muster aus:
warnung[1] = string Warnung 1
warnung[2] = string Warnung 2
warnung[3] = string Warnung 3
...
warnung[11] = string Warnung 6

Allerdings kann sich der Inhalt ändern, z.B. so

warnung[1] = string Warnung 2
warnung[2] = string Warnung 5
...
warnung[11] = string Warnung 7

Ich weiß, dass ich dies alles wunderbar über ein Array steuern und auf dem Canvas positionieren kann (wie ich es auch mit Javascript gemacht habe). Worauf ich hinaus will ist, dass es hierfür wohl schwierig bis unmöglich wird, ein DataBinding zu benutzen, da die Array-Werte "dynamisch" sind.

Ich habe versucht, ein paar Klassen in mein Programm einzubinden, erst getrennt, dann vererbt untereinander in einer Linie (also ohne Verzweigungen). Nachdem innerhalb der Klassen soweit alles lief, wollte ich auf Felder einer anderen Klasse die public sind, zugreifen, was aber nicht geht ("in diesem Kontext nicht vorhanden"). Ich glaube immer mehr, dass ich in meinem Fall (fast) alles in eine Klasse schreiben sollte. Die meisten Klassen, die ich bisher verwendet habe, besitzen sowieso nur ein einziges Objekt. Lediglich die beiden Triebwerke wären 2 Objekte einer Klasse.
Was auch nicht funktioniert, ist, wenn ich über die Benutzeroberfläche einen Button anklicke und in dieser Methode (public partial class MainWindow : Window in der Datei MainWindow.Xaml.cs) if-Abfragen stelle bezüglich bspw. FMC.eigenschaft_xy (FMC wäre ein Objekt einer bestimmten Klasse), dann ist "FMC in diesem Kontext nicht vorhanden".

Eure Tipps zur Drei-Schichten-Architektur und dem DataBinding sind gut gemeint und nach meinem Verständnis nach für die meisten Fälle wohl machbar und ein professioneller Weg.

Unabhängig zu diesen Tipps möchte ich nun wissen, ob es einen Weg gibt, direkt die FMC.eigenschaft_xy aus einer anderen Klasse heraus zu ändern oder ob es doch besser die gleiche Klasse sein muss/sollte?
Vielen Dank für eure Hilfe.

Edit: Tippfehler behoben

06.11.2020 - 16:28 Uhr

Danke soweit. Habe noch Fragen zur Code-Platzierung:
Ist der nachfolgende Code in MainWindow.xaml.cs richtig platziert?
Wenn ich eine Master Klasse (class Airplane) schreiben würde, wo soll ich Airplane Flugzeug = new Airplane(); hinschreiben, auch in public MainWindow() ?

        public MainWindow()
        {
            InitializeComponent();

            EnglishFormat();

            DispatcherTimer timer0 = new DispatcherTimer();
            timer0.Interval = TimeSpan.FromSeconds(0.5);
            timer0.Tick += Berechne0_5;
            timer0.Start();

            DispatcherTimer timer1 = new DispatcherTimer();
            timer1.Interval = TimeSpan.FromSeconds(1.0);
            timer1.Tick += Berechne1;
            timer1.Start();
        }


        void Berechne0_5(object sender, EventArgs e)
        {
//Berechnungen alle 0.5 sec
        }

        void Berechne1(object sender, EventArgs e)
        {
//Berechnungen alle 1 sec
        }

        public void EnglishFormat()
        {
            var enculture = CultureInfo.GetCultureInfo("en-US");

            Dispatcher.Thread.CurrentCulture = enculture;
            Dispatcher.Thread.CurrentUICulture = enculture;
        }
06.11.2020 - 14:48 Uhr

Hallo,

derzeit programmiere ich mit WPF und .NET Framework 4.7.2 meinen Flugsimulator (bzw. einen 2D-Cockpitsimulator). Bisher dachte ich, dass alle Felder/Methoden mit "public" aus anderen Klassen zugegriffen werden kann. Dies funktioniert leider nicht so wie gedacht, wie ich über das Internet erfahren habe. Ob es in meinem Fall besser wäre dieses Programm mit einer einzigen Klasse zu bauen, ist meine Hauptfrage an euch.

Nachfolgend Beispiele bzw. der Logikaufbau des Simulators:

  1. Prinzipiell soll die Methode Berechne0_5() mit dem DispatcherTimer (unter "public MainWindow()", ist das dort richtig aufgehoben?) alle halbe Sekunde von Anfang an fortlaufend vieles berechnen bzw. die Grafik füttern.
            DispatcherTimer timer0 = new DispatcherTimer();
            timer0.Interval = TimeSpan.FromSeconds(0.5);
            timer0.Tick += Berechne0_5;
            timer0.Start();
  1. Das gesamte Programm hat neben auszulesenden Dateien oder Arrays (funktioniert innerhalb der Klasse) sehr viele Variablen bzw. Felder, die besagen, in welchem Zustand sich die Drehzahl der Triebwerke, die Schalter, die 3 Stromquellen, die aktiven Waypoints (zur Flugroute) etc. befinden. Diese Informationen werden wiederum auf Monitoren oder Schaltern dargestellt (für den Piloten).
  2. Geografische Koordinaten (latitude/longitude) haben sowohl unter der Klasse FMC.lat[], FMC.lon[] als auch das Flugzeug selbst Flugzeug.lat, Flugzeug.lon
    Über eine Methode FMC.GetDiffAndGrad() mit 4 Parametern kann der Winkel sowie die Entfernung aus zwei lat/lon-Koordinaten errechnet werden. Leider funktioniert nur die Kombination aus zwei FMC-Koordinaten, nicht aber eine mit FMC-Koordinaten (Klasse) zusammen mit den Flugzeug-Koordinaten (andere Klasse). Es kommt die Fehlermeldung "Der Name "Flugzeug" ist im aktuellen Kontext nicht vorhanden."

Kurz ausgedrückt beeinflussen sich viele Variablen/Felder gegenseitig oder von verschiedenen Seiten aus. Gerade deswegen gehe ich davon aus, dass ich eine einzige große Klasse verwenden müsste.
Ich hoffe, ich konnte den Sachverhalt gut genug darstellen. Den Code zu posten würde wohl den Rahmen sprengen.
Viele Grüße

26.10.2020 - 14:15 Uhr

Hallo,

die letzten beiden Posts möchte ich nicht unkommentiert lassen. Ich besitze das Buch „C# 6 mit Visual Studio 2015“, welches ich 2017 angefangen habe zu lesen. Aufgrund der großen Informationsflut und den vielen Bezeichnungen habe ich damals die Lust verloren und nichts mehr mit C# gemacht. Vor kurzem habe ich durch Nachlesen im Buch und einem Tutorial erst verstanden, wie Klassen verwendet werden. Ich muss zu meiner Person sagen, dass ich mehr praktisch veranlagt bin und deshalb reines Theorie-Lesen eines Buches mit Hunderten von Seiten nicht weit komme, da ich vieles schnell vergesse. Deshalb habe ich kleine Projekte mit VS 2019 gemacht, um zu testen ob meine Vorstellungen programmtechnisch machbar sind. Dazu ziehe ich meist das Internet zu Rate und suche im Index des Buches nach dem passenden Begriff, sofern mir dieser überhaupt bekannt ist. Wenn ich nach wenigen Stunden Recherche nicht weiterkomme (Internet, Microsoft Doku, o.g. Buch), schreibe ich eben ins Forum. Wenn mir dann bspw. Begriffe wie „Clipping“ in den Raum geworfen werden fand ich im Internet als auch im Buch nichts für mich passendes heraus. Als dann von einem anderen User der XAML-Code mit <Grid.Clip> kam, habe ich mein Problem erst mit diesem konkreten Beispiel lösen können. Dass dies über den XAML-Code lösbar ist, habe ich nicht gewusst geschweige denn irgendwo verständlich gefunden. Speziell der Link zu https://www.c-sharpcorner.com/uploadfile/mahesh/clipping-or-cropping-images-in-wpf/ hat mir nicht gezeigt, dass das auch mit Canvas funktionieren kann.

Wie auch immer, meine Programmierkenntnisse müssen mir nur im Bereich meines Hobbys genügen, nicht unbedingt als Profi. Und ich bin, abgesehen von Javascript/CSS/HTML, Anfänger mit einer objektorientierten Sprache.

Viele Grüße

23.10.2020 - 18:40 Uhr

Nachdem ich den von User Palladin007 geposteten Code mit GRID durch CANVAS ersetzt habe funktioniert es jetzt endlich wie gewünscht. Vielen Dank an alle!

23.10.2020 - 17:39 Uhr

Hallo,

nachdem ich mit MonoGame nicht zum Ziel kam, möchte ich dies nun mit WPF versuchen zu erreichen. (s. Thread Kann ich mit MonoGame ein Objekt definieren, auf dem jeglicher Inhalt am Rand abgeschnitten wird?).
Nochmal zum Verständnis:
Ich möchte kein vorhandenes Bild als ein rundes anzeigen lassen (clipping).
Das Bild https://cdn.mycsharp.de/attachments/attachment-15437.jpg stellt nicht das gesamte Window/Fenster dar und ist deshalb nur ein Ausschnitt davon.

Das Ziel ist es, dass diejenigen magenta-farbigen Linien mit wechselnden X/Y-Koordinaten automatisch dort abgeschnitten werden sollen, die oberhalb des Halbkreises hinausragen (also noch innerhalb des Monitor-Rechtecks). Eine Ermittlung des Schnittpunktes finde ich zu aufwändig.

Ich habe mit WPF ein rechteckiges Canvas erzeugt und habe die Ränder mit ClipToBounds = true gesetzt. Somit ist mein Monitor nach außen hin abgeschnitten. Soweit gut. Mit 3 Herangehensweisen komme ich aber nicht zum Ziel:

  1. Ich habe einen Kreis mittels Ellipse auf das rechteckige Canvas gesetzt. Die Linien darüber werden dann aber natürlich nicht abgeschnitten, da sie schließlich auf dem rechteckigen Canvas sind.
  2. Ich habe nirgends gefunden, ob man ein rundes Canvas erzeugen kann. Dies wäre die optimale Lösung für mich.
  3. Was ich noch versucht habe war folgender Code (=Eckenabrundung, hat aber nicht funktioniert, auch mit anderen Werten):
    <Grid>
        <Canvas x:Name="canvas_ND" HorizontalAlignment="Left" Height="400" Margin="200,100,0,0" VerticalAlignment="Top" Width="400" Background="#000000">
            <Border BorderThickness="0" CornerRadius="309,309,309,309" Width="618" Height="618" Margin="-109,41">
                <Canvas x:Name="canvas_ND_unten" Margin="0,0,0,0" Background="#FF0000">
                </Canvas>
            </Border>
        </Canvas>
        <Button Content="Button" HorizontalAlignment="Left" Margin="1150,346,0,0" VerticalAlignment="Top" Width="334" Height="290" Click="Button_Click"/>
    </Grid>

canvas_ND ist das Rechteck und
canvas_ND_unten der nicht gelungene Kreis.

21.10.2020 - 14:39 Uhr

@MrSparkle
Mit den anderen Dateien ist der Workflow mit MonoGame tatsächlich nicht so. Aber das ist nicht weiter schlimm für mich.
Was die Programmierumgebung angeht, sind es nett gemeinte Vorschläge von dir. Ich habe bereits einen Flugsimulator oder besser gesagt, einen Cockpitsimulator, mit Javascript/CSS und HTML gebaut. Mit <DIV> kann man da nämlich ganz schnell Bereiche schaffen, worauf alles gezeichnete am Rand abgeschnitten wird. Das ist dort extrem schnell möglich im Gegensatz zu meinen Bemühungen unter C#/MonoGame. Was mir bei den WinForms und bei WPF nicht gefällt, ist die Benutzeroberfläche die mir zu statisch erscheint. Ich brauche keine Windows-Buttons o.ä. Der Cockpitsimulator der unter einem Browser läuft, gerät von der Rechenleistung her aber an seine Grenzen. Deswegen wollte ich diesen mit einer neuen Programmiersprache neu schreiben, um etwas Neues zu lernen. Du meintest mit "Erfahrung sammeln" wahrscheinlich wie man Linien o.ä. mit X,Y-Koordinaten programmiert. Da muss ich ehrlich sagen, dass ich damit keine großen Probleme habe (Erfahrung mit Javascript) und auch schon mit MonoGame und WPF eigene kleine Übungen gemacht habe. Lediglich für das Clipping an Objekten habe ich noch keine Lösung mit C# bzw. MonoGame gefunden. Aber wie gesagt, WinForms und WPF erscheint mir nicht dynamisch genug. Im Cockpitsimulator muss vieles aktualisiert und grafisch dargestellt werden. Deshalb wurde mir wohl auch von einem anderen User in meinem vorherigen Thread MonoGame als die bessere Variante ans Herz gelegt, was meine Meinung bestätigt.
Mal sehen, wo und wie ich weiter mache.

19.10.2020 - 17:56 Uhr

Warum auch immer, war in einem Projekt auf einmal im "Monogame Pipeline Tool" die PNG-Datei mit einer für Windows typischen Link-Datei dargestellt. In Content.mgcb steht dort der Code

#begin ../../../../test.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:../../../../test.png;test.png

Wenn ich diesen in ein anderes Projekt eintrage und die PNG-Datei nur in den Projektmappen-Explorer ziehe, funktioniert er dort auch.

19.10.2020 - 16:02 Uhr

Hallo,

ich arbeite mit Visual Studio 2019, Monogame 3.7.1 mit DirectX, Windows 10 64-bit. Egal, ob ich eine o.g. PNG-Datei über das "Monogame Pipeline Tool" hinzufüge oder es direkt in den Bereich Projektmappenexplorer - Content hineinziehe, kommt jedes mal beim Debuggen der Fehler

Fehlermeldung:
Microsoft.Xna.Framework.Content.ContentLoadException:
"The content file was not found."
Innere Ausnahme
FileNotFoundException: Could not find file 'F:\PC\Programmierung_C#\MG2\bin\Debug\netcoreapp3.1\Content\test.xnb'.

Wenn ich vor dem Debuggen versuche das Bild über das "Monogame Pipeline Tool" hinzuzufügen, und dann auf "Build" gehe, kommt eine andere Fehlermeldung, welche etwas länger ist und leider nicht über Copy&Paste hier posten kann.

Eine Beispieldatei im Anhang.

Was kann ich versuchen um das Problem zu beheben? Ich habe die Bilder über Paint gezeichnet/bzw. per Screenshot eingefügt und mit Adobe Photoshop Elements 13 den transparenten Bereich erstellt.

17.10.2020 - 16:54 Uhr

Inzwischen konnte ich immerhin die gewünschten "Objekte" unter Monogame.Extended mit

            _spriteBatch.DrawString(font12, "CDU TEXT", new Vector2(470, 260), Color.Red, 0, Vector2.Zero, 1.0f, SpriteEffects.None, layerDepth: 0.4f);
            _spriteBatch.DrawCircle(new CircleF(new Vector2(390, 550), 310), 310, Color.Gray, thickness: 310, layerDepth: 0.1f);
            _spriteBatch.DrawRectangle(new Rectangle(200, 200, 400, 400), Color.Black, thickness: 200, layerDepth: 0.2f);
            _spriteBatch.DrawCircle(new CircleF(new Vector2(390, 550), 311), 310, Color.White, thickness: 1, layerDepth: 0.3f);
            _spriteBatch.DrawLine(250, 250, 400, 400, Color.Red, layerDepth: 0.4f);

realisieren. Damit könnte ich gut meine "Objekte" dynamisch berechnen und anzeigen. Nach einiger Google-Suche konnte ich folgende Sachverhalte dazu leider nicht herausfinden:

  1. Wie funktioniert das von User MrSparkle erwähnte "Clipping" mit diesen Objekten speziell für DrawCircle() und DrawRectangle()?
    bzw. 2. ist es mein Ziel, auf (also über) die gemeinsame Fläche des schwarzen Rechtecks und des grauen Kreises alles abzuschneiden was hier rot (Text rechts oben und die Linie links oben) dargestellt ist. Die schwarzen und grauen Flächen sollen später nur schwarz sein und der restliche Teil des Kreises sollte dann optimalerweise gar nicht erst angezeigt werden. - Wie schneide ich die roten Elemente also ab?
    PS: Es gibt später noch mehr Monitore etc. im Fenster des Programms (Flugsimulator). Daher brauche ich eine Möglichkeit über einen bestimmten Bereich hinaus die Objekte automatisch abzuschneiden.
16.10.2020 - 13:42 Uhr

Danke soweit. Ich muss erst mal schauen, mit welcher Umgebung (MonoGame, Windows Forms oder Windows WPF) ich meine Vorstellungen am besten unter einen Hut bekomme. Da vieles während der Laufzeit des "Spiels" Flugsimulator dynamisch sein muss, glaube ich aber eher, dass MonoGame doch besser ist. Vielleicht stelle ich später noch Fragen.

15.10.2020 - 13:57 Uhr

Hallo,

ich meinte, wenn es nicht möglich wäre, die schwarze Fläche (Rechteck + Teilkreis) und Zeichenobjekte/Texte darauf abgeschnitten darzustellen, würde es für mich persönlich keinen großen Sinn machen, mich tiefer mit MonoGame zu beschäftigen und mich stattdessen lieber einer anderen Programmiersprache zu bedienen mit der eben Genanntes ginge. z.B. kann ich mit C#/WPF dies nicht realisieren, da es die für mich wichtigen Layer (Zeichenobjekte in bestimmter Reichenfolge hintereinander überlappend darstellen) nicht gibt.

Meine gesamte Programmierung ist rein in 2D. 3D-Objekte und 3D-Steuerung brauche ich m.E. hierfür nicht.

Zur 1. Frage (mit MonoGame)
Text kann ich bspw. mit
_spriteBatch.DrawString(font12, "CDU TEXT", new Vector2(500, 150), Color.White, 0, Vector2.Zero, 1.0f, SpriteEffects.None, layerDepth: 0.2f);
realisieren.

Bilddateien (JPG etc.) kann ich bspw. mit
_spriteBatch.Draw(adi_h, destinationRectangle: new Rectangle(100, 100, 200, 200), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, layerDepth: 0.1f);
realisieren.

Wozu ich aber noch gar nichts gefunden habe, wie ich eine Linie von x,y nach x,y oder ein Rechteck etc. zeichen kann ohne eine Bilddatei zu verwenden. Dies ist mir schleierhaft.
Das waren die (Zeichen-)Objekte die ich meinte.

Zur 2. Frage (mit MonoGame)
Wenn ich nun diese in der 1. Frage genannten Zeichenobjekte darstellen könnte, womit (Stichpunkt?) kann ich den Text und die Zeichenobjekte auf dem Bereich der Fläche (Rechteck + Teilkreis) abschneiden?

Im Bildanhang ist ein Bsp. zu sehen, wie der spätere Monitor aussehen sollte. Oberhalb des großen weißen Pfeils (unten) bis unterhalb des weißen Halbkreises sollen die weißen und magenta-farbig dargestellten Texte und Linien angezeigt werden, außerhalb davon abgeschnitten werden (so wie es die obere Linie nach "ESUPI" ist).

Ich hoffe, nun ist klarer geworden, was ich meine.

Viele Grüße,
Stefan

14.10.2020 - 16:37 Uhr

Hallo,
bevor ich mich noch tiefer mit MonoGame und C# beschäftige, möchte ich wissen, ob folgendes damit möglich ist:

Für einen Flugsimulator möchte ich auf einem rechteckig dargestellten Monitor Linien, geometrische Objekte und Texte abbilden, welcher im Flugverhalten kontinuierlich verändert werden muss. Das Bild im Anhang soll den gesamten Monitor darstellen. Auf dem schwarzen Bereich sollen die o.g. Objekte dargestellt werden und an der Grenze davon abgeschnitten werden. Im roten Bereich soll aber auch anderer Text und o.g. Objekte dargestellt werden können.

Meine Fragen:

  1. Wie man Text und Bilder anzeigen kann, weiß ich im Prinzip. Womit kann ich die Objekte Rechteck, Linie etc. unter MonoGame darstellen?
  2. Die Objekte, die am Rand abgeschnitten werden sollen: wie/womit geht das?

Viele Grüße,
Stefan

03.04.2018 - 18:24 Uhr

In der Klasse Class_ICAO_apt steht unten

bool compare = txt == ICAO_apt[a].Name;
                if (compare) { return a; }

welche mir die Fehlermeldung ausgibt, dass ICAO_apt im aktuellen Kontext vorhanden ist. Wie muss es korrekt lauten?

Kompletter Code:
in Program.cs

        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            Class_ICAO_apt kl_apt = new Class_ICAO_apt("",0,0);
            int ICAO_apt_gesamt = kl_apt.Get_ICAO_apt_gesamt();
            Class_ICAO_apt[] ICAO_apt = new Class_ICAO_apt[ICAO_apt_gesamt];

            ICAO_apt[0] = new Class_ICAO_apt("EDDF", 50.0264, 8.5431);
            ICAO_apt[1] = new Class_ICAO_apt("EGCC", 53.3537, -2.27495);


        }

und in der Klasse

    public class Class_ICAO_apt
    {
        private int ICAO_apt_gesamt = 2;
        private string _Name;
        private double _Lat;
        private double _Lon;
        
        public Class_ICAO_apt(string Name, double Lat, double Lon)
        {
            string _Name = Name;
            double _Lat = Lat;
            double _Lon = Lon;
        }
                
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        public double Lat
        {
            get { return _Lat; }
            set { _Lat = value; }
        }

        public double Lon
        {
            get { return _Lon; }
            set { _Lon = value; }
        }

        public int Get_ICAO_apt_gesamt()
        {
            return ICAO_apt_gesamt;
        }

        public int Get_ICAO_apt_name(string txt)
        {
            for (int a = 0; a < ICAO_apt_gesamt; a++)
            {
                bool compare = txt == ICAO_apt[a].Name;
                if (compare) { return a; }
            }
            return 999;
        }

    }

Ziel ist es, durch den Vergleich von txt und von ICAO_apt[a].Name den Indexwert zu ermitteln (a). Danach will ich weiter programmieren, die entsprechenden Werte Lat und Lon des Arrays auszulesen.

01.04.2018 - 11:22 Uhr

Anhand des Bsp. habe ich es verstanden. Aber das macht aus meiner Sicht keinen Sinn zu Programmieren, wenn die Klassen, Variablen und Arrays nur innerhalb ihrer Klasse bzw. der .cs-Datei verfügbar zu haben.
Und womit kann ich jetzt diese Arrays "öffentlich" machen? Ich dachte immer, public und private regeln dies...
Das war ja mit Javascript in HTML deutlicher zu lösen bzw. es gab erst gar nicht solche Probleme!

01.04.2018 - 08:35 Uhr

Hallo,

bevor ich mein Problem schildere, poste ich erst mal nur meinen Code, das sagt mehr aus:

in Program.cs

        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            int ICAO_apt_gesamt = 5;
            Class_ICAO_apt[] ICAO_apt = new Class_ICAO_apt[ICAO_apt_gesamt];
            int i;
            for (i = 0; i < ICAO_apt_gesamt; i++)
            { ICAO_apt[i] = new Class_ICAO_apt(); }

            //ICAO_apt[].name = ""; ICAO_apt[].lat = ; ICAO_apt[].lon = ;
            ICAO_apt[0].name = "EDDF"; ICAO_apt[0].lat = 50.0264; ICAO_apt[0].lon = 8.5431;
            ICAO_apt[1].name = "EGLL"; ICAO_apt[1].lat = 51.4706; ICAO_apt[1].lon = -0.4619;
            ICAO_apt[2].name = "KATL"; ICAO_apt[2].lat = 33.6367; ICAO_apt[2].lon = -84.42807;
            ICAO_apt[3].name = "EGCC"; ICAO_apt[3].lat = 53.3537; ICAO_apt[3].lon = -2.27495;
            ICAO_apt[4].name = "LOWW"; ICAO_apt[4].lat = 48.1103; ICAO_apt[4].lon = 16.5697;

            
        }

In Klasse Class_ICAO_apt.cs

    public class Class_ICAO_apt
    {
        public string name;
        public double lat, lon;

    }

und in Form1.cs

        public void textBox1_TextChanged_1(object sender, EventArgs e)
        {
            string j = TextBox1.Text;
            int i;
            for (i = 0; i < ICAO_apt_gesamt; i++)
            {
                if (j==ICAO_apt[i].name)
                { ... }
            }

Es folgt für Form1.cs die Fehlermeldung> Fehlermeldung:

Der Name "ICAO_apt" ist im aktuellen Kontext nicht vorhanden

Was mache ich falsch?
Danke für Antworten.
Frohe Ostern!

30.03.2018 - 09:53 Uhr

Hallo,

ich habe jahrelang jeweils eine HTM-Seite mit Javascript programmiert und konnte recht gut einen Flugsimulator aufbauen. Das Problem besteht nun darin, dass der Browser (IE 11 als auch Google Chrome) schnell in die Knie gezwungen wird (viele Berechnungen im Intervall 0.1 sec).
Nun stellt sich mir die Frage, ob ich mit C# besser davon käme. Was ich bräuchte, kommt gleich in einer kurzen Liste, ansonsten weiß ich nicht, ob ich das alles entweder mit der
"Entwicklung für die universelle Windows-Plattform" oder ".NET-Desktopentwicklung" (Windows Forms) besser programmieren kann?

  1. wie in JS ein Intervall in min. 0.5 Sekunden-Schritten zur Berechnung in einer größeren Methode (Flugzeugposition und -lage, Treibstoffverbrauch, Geschwindigkeit etc.)
  2. Arrays o.ä. die z.B. so aussehen:
    Arrays für Flughafen-Code, Runway-Name, geografische Koordinate, Länge der Runway
    Anhand der Array-Nummer werden z.B. die geografischen Koordinaten in eine andere einfache Variable eingetragen
  3. Bevor der eigentliche Flugsimulator gestartet wird, sollen bestimmte Variablen aus einer Datei ausgelesen werden.
  4. Grafische Darstellung von Bildern, Text und Linien auf veränderlichen x/y-Koordinaten auf einem Monitor im Cockpit; Stichwort GDI
  5. Bilder an festen Positionen, die durch andere Bilder ersetzt werden können, also Taster, Hebel, Schalter (bei JS: mit ID, Name ansprechbar)
  6. möglichst mit Tastatur- und Joystick-Eingaben (letzteres nur die x/y-Achse ohne Knöpfe).
  7. Fast vergessen: Layer, also Ebenen, sind auch sehr wichtig.

Ich brauche kein 3D und auch keine Szenerie, die aus dem Cockpitfenster zu sehen sind.
Was meint ihr, mit welcher Umgebung geht das alles zusammen am besten?

Vielen Dank für wertvolle Hinweise!
Grüße
Stefan

23.07.2017 - 18:58 Uhr

Wenn du ein File hast, bei dem du das Bedürfnis hast dieses mit "partial" aufzuteilen - hast du in 99% der Fälle mies programmiert, was du dir besser gleich abgewöhnst 😉

Danke für den Hinweis. Dann kriege ich eben eine Monsterdatei 😉

23.07.2017 - 15:34 Uhr

Hallo,

ich habe zuletzt ein Programm komplett mit HTML/Javascript programmiert und bin jetzt dabei, Schritt für Schritt mit C# neu zu Programmieren. Da die 11 Javascript .js-Dateien zusammengefasst mehrere Hundert Zeilen Code enthalten, würde ich gerne mein C#-Projekt auch aufteilen um einen besseren Überblick zu haben. Wie das konkret gehen soll, verstehe ich weder über meine beiden Bücher noch über Suchen im Internet. Ich verwende Visual Studio Community 2017.
Mein Projekt heißt "GDI" und die "Form1.cs" enthält den Code

namespace GDI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Code...
    }
}

Wenn ich eine Datei über GDI->Hinzufügen->Neues Element->Codedatei erstelle, bekomme ich eine Datei "CodeFile1.cs". Nach Umbenennen dieser möchte ich mit (in JS hieß es Funktionen) public void... Code hinzufügen wollen.

1.Muss ich in die Datei "CodeFile1.cs" schreiben

namespace GDI
{
    public partial class Form1
    {
        public void funktion1()
        {
        public int variable1 = ...
        Code...
        }
    }
}

oder wie geht das?

  1. Kann in "CodeFile1.cs" z.B. ein Code wie
private void pictureBox41_Click(object sender, EventArgs e)

abgerufen werden?

🤔

Vielen Dank schon mal.
Grüße,
Stefan

23.07.2017 - 08:56 Uhr

Ich habe es inzwischen anders gelöst:

Bitmap EICAS_1bis8_b = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics EICAS_1bis8_g = Graphics.FromImage(EICAS_1bis8_b);
EICAS_1bis8_g.DrawString("TAT", font9, pinsel_blau, 0, 0);
pictureBox1.Image = EICAS_1bis8_b;
22.07.2017 - 18:42 Uhr

Hallo,

wenn ich folgenden Quellcode verwende, wird der Text "TAT" auf x=160,y=15 px ab der Referenz von Form1 genommen. Ich möchte aber, dass der Nullpunkt die linke obere Ecke bspw. von pictureBox1 oder eines Panels ist. Die Referenz soll also ein Objekt sein, welches ja wiederum irgendwo auf der Form1-Fläche definiert wurde.
Warum will ich nicht einfach die Werte addieren und direkt eingeben? Weil ich mir offen halten will, die Referenz des Nullpunktes der pictureBox o.ä. später während des Programmierens ändern zu können, ohne Tausend Änderungen für die .DrawString() o.ä. -Objekte vornehmen zu müssen.

Graphics EICAS_1bis8 = CreateGraphics();
EICAS_1bis8.DrawString("TAT", font9, pinsel, 160, 15);

Vielen Dank für Antworten.
Grüße,
Stefan

19.07.2017 - 19:00 Uhr

Hallo,
bisher habe ich mit HTML und Javascript programmiert, welche einen Internetbrowser voraussetzt. Nun möchte ich mit C# ein eigenständiges Programm schreiben und habe mir "MS Visual Studio Community 2017" zugelegt. Die Umgebung "Windows Forms-App (.NET-Framework)" gefällt mir am besten. Hierfür habe ich folgendes Problem: Ich will mit Panels und Images eine Oberfläche von 1900x1500 px gestalten, welche in der Höhe gescrollt werden soll. Wenn ich diese Werte eingebe, korrigiert das Programm aber automatisch die 1500 auf 1100 px (m.E. wegen der Bildschirmauflösung 1920x1080). Was kann ich tun, um mein Vorhaben dennoch zu lösen? Die Entwicklungsumgebung von WPF gefällt mir nicht, damit wäre ein Fenster mit meinen Werten zwar möglich, WPF ist meinerseits aber nicht erwünscht (wie gesagt). 🤔

Vielen Dank für Antworten.

Grüße
Stefan