myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grafik und Sound » Kann ich mit MonoGame ein Objekt definieren, auf dem jeglicher Inhalt am Rand abgeschnitten wird?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Kann ich mit MonoGame ein Objekt definieren, auf dem jeglicher Inhalt am Rand abgeschnitten wird?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
stefanpc81
myCSharp.de-Mitglied

Dabei seit: 18.07.2017
Beiträge: 19


stefanpc81 ist offline

Kann ich mit MonoGame ein Objekt definieren, auf dem jeglicher Inhalt am Rand abgeschnitten wird?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

stefanpc81 hat dieses Bild (verkleinerte Version) angehängt:
ziel.jpg
Volle Bildgröße

14.10.2020 16:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.535
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich weiß wirklich nicht, wie man deine Fragen beantworten soll. Einerseits willst du dich nicht mit MonoGame beschäftigen, andererseits willst du wissen, wie man Grafiken rendern kann.

Ganz allgemein kann man sagen, daß man mit jeder Game- bzw. Rendering-Engine machen kann, wonach du fragst. Und die Unterschiede sind auch nicht besonders groß. Aber du sagst ja noch nicht einmal, ob es sich dabei um 3D- oder 2D-Grafiken handelt, einerseits schreibst du "Flugsimulator", andererseits Linien und Text...

Siehe dazu auch  [FAQ] Wie finde ich den Einstieg in die 3D-Programmierung mit C#?
14.10.2020 19:51 Beiträge des Benutzers | zu Buddylist hinzufügen
stefanpc81
myCSharp.de-Mitglied

Dabei seit: 18.07.2017
Beiträge: 19

Themenstarter Thema begonnen von stefanpc81

stefanpc81 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

stefanpc81 hat dieses Bild (verkleinerte Version) angehängt:
ND.jpg
Volle Bildgröße

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von stefanpc81 am 15.10.2020 14:11.

15.10.2020 13:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.780
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von stefanpc81:
... 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.

Klar geht das auch mit WPF (Stichwort: Z-Layer). Und Abschneiden geht mittels "Region clipping", s.  Clipping or Cropping Images in WPF.

Und zum Zeichnen von Linien (und [gefüllten] Rechtecken etc.) in MonoGame s.  Line drawing (z.B. über die Extension  MonoGame.Extended).

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am 15.10.2020 15:13.

15.10.2020 15:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.535
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das "Abschneiden" am Rand des Bildschirms bzw. des Viewports bzw. der Grafik nennt sich "Clipping". Das ist aber in jeder Rendering- oder Game-Engine bereits implementiert, und wird automatisch angewendet.

In deinem Fall wäre es wohl am einfachsten, das Ganze direkt in WinForms ( [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)) oder in WPF (mit einer Canvas) zu zeichnen, dann brauchst du keine externen Bibliotheken.
15.10.2020 20:16 Beiträge des Benutzers | zu Buddylist hinzufügen
stefanpc81
myCSharp.de-Mitglied

Dabei seit: 18.07.2017
Beiträge: 19

Themenstarter Thema begonnen von stefanpc81

stefanpc81 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
16.10.2020 13:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.641
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Da MonoGame eine richtige Library für Spieleprogrammierung ist, wirst du damit vermutlich besser fahren als mit Windows Forms und WPF.
Wenn du daraus ein richtige Spiel machen willst, müsstest du dich bei Windows Forms und WPF arg verdrehen, da dies nicht die Anwendungszwecke der beiden Libraries ist.

T-Virus
16.10.2020 16:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
stefanpc81
myCSharp.de-Mitglied

Dabei seit: 18.07.2017
Beiträge: 19

Themenstarter Thema begonnen von stefanpc81

stefanpc81 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Code:
1:
2:
3:
4:
5:
            _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.

stefanpc81 hat dieses Bild (verkleinerte Version) angehängt:
Monogame.jpg
Volle Bildgröße

17.10.2020 16:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.535
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Alles, was außerhalb des Viewports ist, wird sowieso nicht gerendert.

Ansonsten siehe die 4 Möglichkeiten in der Antwort zu  How to clip before DrawUserPrimitive?
18.10.2020 15:33 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 31.10.2020 23:40