PaintEventHandler eigenen Parameter mitgeben?
- C#
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.
-
-
-
Jou. Eigenes Event, eigene EventParameter, eigener Event-Handler.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
geht natürlich nur, wenn man das Control selbst codet. Wenn man es aber selbst codet, kann man das Painting auch selbst durchführen, sodass ein besonderes Paint-Event wieder keinen Sinn ergibt.
Also malwieder die Frage: Was ist der Plan? -
-
Eistee schrieb:
die aktuellegameTime
Paint
kann dann einfach drauf zugreifen.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Dann werd ich mal meine Klasse umbasteln.
Bis jetzt sieht es ~ so aus:
VB.NET-Quellcode
- class Loop{
- delegate void MethodInvoker();
- private void Draw(){
- GameTime gameTime = new GameTime(x,y,z);
- while (isRunning)
- {
- //gameTime-hier-und-da
- Program.GameForm.Invoke(new MethodInvoker(mfi_Paint));
- //ABC = gameTime irgendwas
- //gameTime noch was
- }
- }
- void mfi_Paint(){
- Program.GameForm.Invalidate();
- }
- }
Wär es jetzt besser dieGameTime
in dieProgram.GameForm
zu verlegen oder nur aus Loop herraus zugänglich zu machen? Seit neustem tue ich mir mit dem Klassendesign echt schwer :pinch: -
Hi
VB.NET-Quellcode
- Public Class GameTimePaintEventArgs
- Inherits PaintEventArgs
- Private _gameTime As TimeSpan
- Public Sub New(graphics As Graphics, clipRect As Rectangle, gameTime As TimeSpan)
- MyBase.New(graphics, clipRect)
- Me.GameTime = gameTime
- End Sub
- Public Property GameTime As TimeSpan
- Get
- Return _gameTime
- End Get
- Private Set(value As TimeSpan)
- _gameTime = value
- End Set
- End Property
- End Class
- Public Class CustomControlBla
- Inherits Control
- Public Shadows Event Paint As EventHandler(Of GameTimePaintEventArgs)
- Protected Overrides Sub OnPaint(e As PaintEventArgs)
- MyBase.OnPaint(e)
- RaiseEvent Paint(Me, New GameTimePaintEventArgs(e.Graphics, e.ClipRectangle, GameTime))
- End Sub
- End Class
Hab' beim Programmieren leider nicht bemerkt, dass es als C# markiert war. Meinst du sowas in der Art? das GameTimePaintEventArgs sollte für dich das interessantere sein.
Program.GameForm.Invoke(new MethodInvoker(mfi_Paint));
kannst du auch einfach inProgram.GameForm.Invoke(new MethodInvoker(rogram.GameForm.Invalidate));
umschreiben.
GameTime würde ich in einer extra Klasse modellieren und einfachvoid Advance(TimeSpan)
definieren. Die Klasse hat dann eine ICollection<IProgressEntity>, bei der IProgressEntity ein Interface ist, das auf Advance reagiert. Z.B. Physik und Animation sind solche IProgressEntity-Objekte.
Gruß
~blaze~ -
Falls das eine GameEngine wird ist das PaintEvent der Form der falsche Ansatz zum rendern..
-
@ThuCommix: Was heißt GameEngine, ich möcht eig. nur Rund 10 bis max. 30 Objekte bewegen
(+ Hintergrund mit ~ 1400 x 900 Pixel).
Edit: Meinst Du eig. GDI+ selbst oder nur, dass das PaintEvent der Form nicht der richtige Weg ist?
~blaze~ schrieb:
in Program.GameForm.Invoke(new MethodInvoker(rogram.GameForm.Invalidate)); umschreiben.
(Hätt ich selber sehen müssen) Danke.
GameTime würde ich in einer extra Klasse modellieren und einfach [...]
Also GameTime als eigene Klasse (ist klar), mit einemvoid Advance(TimeSpan)
und einerICollection<IProgressEntity>
wobei dieIProgressEntity
aufAdvance
reagiert?
IProgressEntity gehört zu einzelnen Objekten oder wie? Ich kann dir leider nciht wirklich folgen, würdest Du das eventuell noch einmal etwas weiter ausführen? Eventuell könnt ich dann folgenDieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Eistee“ ()
-
C#-Quellcode
- public interface IProgressEntity
- {
- void Advance(TimeSpan timeSpan);
- }
- public class ProgressEntityList<T> : IProgressEntity //quasi composite pattern
- where T : IProgressEntity
- {
- public ICollection<T> Elements { get; private set; }
- public ProgressEntityList()
- {
- Elements = new LinkedList<T>();
- }
- public virtual void Advance(TimeSpan timeSpan)
- {
- foreach(T element in Elements)
- elements.Advance(timeSpan);
- }
- }
- public class GameClock
- {
- public ProgressEntityList<IProgressEntity> Elements { get; private set; }
- //advance z.b. durch einen Timer getriggert oder sowas Elements. Elements könnte man auch als IProgressEntity festlegen
- }
- public class Physics : IProgressEntity
- {
- //Kollision, etc. in Advance durchführen
- }
sowas in der Art. -
-
Sorry ich war in der Schule und konnte nicht ordentlich schreiben.
Was ich meinte:
Die Form hat für dich keine relevanten Events außer eventuell KeyDown, ansonsten ist sie nur eine Oberfläche, und du zeichnest via gdi32 auf diese Oberfläche. Du erstellst dir also eine Buffer Bitmap auf die du erstmal alles deine Objekte zeichnest. Wenn du mit zeichnen fertig bist zeichnest du den Buffer auf die Form, dabei sollte dir helfen:
Graphics.GetHdc()
CreateCompatibleDC
SelectObject
StretchBlt
DeleteObject
DeleteObject
Graphics.ReleaseHdc()
Alles zu findet in der gdi32 bzw in Graphics. -
also ich muß nochmal nach dem Plan fragen. "gameTime mitgeben" ist kein Plan - wozu soll man einem Paint eine gameTime mitgeben, was ist das, und wo kommt die her etc.
streng genommen kann man einem PaintEventHandler keinen anneren Parameter mitgeben, denn ein PaintEventHandler ist halt definiert wie er ist:ObjectBrowser schrieb:
Public Delegate Sub PaintEventHandler(sender As Object, e As System.Windows.Forms.PaintEventArgs)
Member von System.Windows.Forms
Und auch das Paint-Event ist bereits fertig definiert:ObjectBrowser schrieb:
Public Event Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs)
Member von System.Windows.Forms.Control
Ownerdrawing malt ganz gezielt nur dann, wenn sich etwas verändert hat, und auch nur genau das, was sich geändert hat.
PaintEvent ist also belegt, und wenn du ähnliches coden willst, dann nenne es anders.
Aber stichwort game deutet drauf hin, dass dir garkein Ownderdrawing vorschwebt.
Sondern du willst so render-engine-mäßig einen game-loop haben, wo ununterbrochen in sehr kurzen Abständen iwas gemalt wird.
Dassis ein ganz anneres Konzept als Ownerdrawing, und bei sowas spricht man besser von Rendern.
Ownerdrawing wird von WinForms unterstützt und ist sehr effektiv und resourcenschonend bei eher statischen Darstellungen (Formulare, "Forms" halt). Deshalb kann Ownerdrawing auf Grafikkarten-Unterstützung verzichten, und die ganze Zeichnerei inne CPU durchführen.
render-engines rasen ständig im Kreis und bauen jedesmal den ganzen bildschirm neu auf. Dassis vorteilhaft bei film-artigen Bewegungen, wie sie in games häufig auftreten. Dazu verwenden sie Grafikkarten-Unterstützung, weil wenn man das in GDI(+) absolvieren wollte, wäre das System im Ruhezustand wohl zu 80% ausgelastet.
also nochmal meine Frage nach dem Plan, was das eiglich werden soll?
jdfs. in keinem Fall kommtes mir sinnvoll vor, iwie ein neues Control zu erfinden, mit einem neuen Paint-Event. -
@ErfinderDesRades: Ok dann möchte ich etwas Rendern.
Zuerst einmal nur ein Feld aus Rechtecken (z. B. 60*40 mit einer größe von 20*20 Pixel [1200x800 Pixel]).
Auf dem Feld Werden regelmäßig Objekt bewegt, also wird das gesamte Bild immer wieder neu gerendert.
Dacht mir die 960.000 Pixel mit 60 oder ehr 30 FPS gehen mit Form.Invalidate klar.
Wollte nicht extra SharpDX installieren/verwenden. -
also wenn nur so kleine Rechtecke bewegt werden, könnte OwnerDrawing noch ausreichen.
guggemol Gezieltes OwnerDrawing, was so an Beweglichkeit noch machbar ist.
Das Prob mittm Rendern ist, dassich davon keine Ahnung hab. Ich hab mich auch an Artentus' "RenderEngine" versucht, aber mehr als eine große schwarze Fläche hat die mir nicht gerendert - also auch damit wird der Umgang vmtl. nicht einfach.
Ich hab vor langer Zeit auch mal mit DirectX rumgewurstelt, und da konnte ich schließlich Teekannen rotieren lassen, und Objekte herumfliegen, aber das war schon eine irrsinnige Menge Code, und noch nichtmal die einfachste Kollisionsabfrage war dabei. -
-
Und wieder mal verweise ich hier drauf:
[C#] [OpenSource] [Projektvorstellung] Langzeitprojekt - GameUtils
GameUtils besitzt einen (fast) vollständigen GDI-Renderer.
-
Ähnliche Themen
-
JackBauer - - Sonstige Problemstellungen
-
7 Benutzer haben hier geschrieben
- Gast (7)
- ErfinderDesRades (3)
- ThuCommix (2)
- RodFromGermany (2)
- ~blaze~ (2)
- jvbsl (1)
- Artentus (1)