Announcement

Collapse
No announcement yet.

Alle 10 msec Hintergrundbild & verschiedene Objekte zeichnen (wie bei Moorhuhn)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Alle 10 msec Hintergrundbild & verschiedene Objekte zeichnen (wie bei Moorhuhn)

    Hi<p>Ich sitz gerade daran, ein Spiel ähnlich den Anfängen von Moorhuhn mit Delphi 7 Personal zu programmieren. Es gibt ein konstantes Hintergrundbild und darauf werden verschiedene, sich ständig bewegende Objekte gezeichnet. Damit die Bewegung flüssig erscheint, sollte das ganze alle 10 Millisekunden neu gezeichnet werden. Dabei zeichne ich immer zuerst das Hintergrundbild (um die alten Positionen der Objekte zu überdecken) und dann die Objekte darauf. Jetzt habe ich aber das Problem, dass das mein 3,2 GHz-Prozessor nicht schafft, das ganze so oft neu zu zeichnen. Da es Moorhuhn aber schon seit einer ganzen Weile gibt, muss es ja eine schnellere Methode zum Zeichnen geben...hat jemand eine Idee?<p>edit: achja - ich zeichne das gesamte bild immer zuerst in einen Buffer (TBitmap) und erst das fertige Bild dann auf den Canvas, um flakern zu vermeiden.<p>cu, Sebastian Meßmer

  • #2
    Das ist schon mal eine gute Variante, das du zu erst auf ein Bitmap Zeichnest, denn wenn du auf eine Komponente zeichnest, die sichtbar ist wird das noch mal langsamer.
    Ich habe aber mal ein Programm geschrieben, das nur eine kleine Bitmap scrollt. Da hat es auch funktioniert, das ich es schon angezeigt habe.
    So weit ich weis passiert das mit einem Memcopy. Schaue mal nach:

    BitBlt(ScrollPaintBox.canvas.Handle, 0, -ScrollPosition+ScrollPaintBox.height,
    ScrollPaintBox.width, scroller.height, bitmap.canvas.Handle, 0, 0, SRCCOPY);

    Falls dieses nicht von der geschwindigkeit reicht, solltest du Assembler lehrnen, oder eine Komponente im netz suchen, die schnell genug ist

    Comment


    • #3
      Hast Du schon mal an OpenGL bzw. DirectX gedacht? Zumindest beim Moorhuhn musstest Du auch schon damals eins von beiden haben.
      .
      Ansonsten würde ich das Hintergrundbild nicht alle 10 Millisekunden aktualisieren. Vielleicht reichen auch 50 oder sogar 100 ms aus, könnte mir zumindest vorstellen, dass wenn sich ein Objekt nur um 1 mm nach links bewegt, es gar so nicht auffällt, wenn da plötzlich ein Pixel fehlt

      Comment


      • #4
        Er sollte mindestens alle 40 ms das Bild aktualisieren, das wäre eine fps von 25

        Comment


        • #5
          Hi<p>Ich habe das mit der Refreshrate ausprobiert und lasse das jetzt auf 20ms laufen...da ist es gerade noch so eine annehmbar flüssige Bewegung. Aber ich bin mir ziemlich sicher, dass Moorhuhn damals ne höhere Framerate hatte (und somit auch eine flüssigere Bewegung hatte).<p>Die Sache mit dem Memcopy verstehe ich nicht ganz, weil ich ein festes Hintergrundbild habe. Es werden nur die Objekte hin und her bewegt. Es wird nicht das Hintergrundbild verschoben, also muss eigentlich auch nicht gescrollt werden<p> Und was bringt mir OpenGL oder DirectX? Die sind doch für 3D-Engines gedacht...naja - moohrhuhn hat nicht wirklich viel mit 3D zu tun...<p>Assembler ist so ne Sache - kann ich eben nicht. Und wurde Moorhuhn damals wirklich mit Assembler programmiert? Ich glaube nicht - und die PCs damals waren ja noch um einiges langsamer, als die PCs heute...also MUSS es doch eine Möglichkeit geben, das ganze flüssiger darzustellen..

          Comment


          • #6
            Naja, also mit einer 3D engine kan man auch 2D sachen darstellen, und bei OpenGL oder DirectX müstest du dich nicht mehr ums Zeichnen kümmern müssen, sondern nurn och um die Objektpositionierung. Und so weit mir bekannt benutzt Moorhun DirectX. Und das ist meines wissens in in C++ geschrieben und für Grafik ausgaben optimiert.
            Zum Thema memcopy: Memcopy hat den nachteil, das man keine Sachen wie größen veränderung oder so beim Copieren einer Bitmap machen kann. Großer vorteil es geht sehr schnell. Eigentlich genau, das, was zu für dein Hintergrundbild brauchst, wenn du nicht aud DirectX oder so etwas zugreifen willst

            Comment


            • #7
              "Es gibt ein konstantes Hintergrundbild und darauf werden verschiedene, sich ständig bewegende Objekte gezeichnet."

              Unter http://g32.org/ gibt es die Komponente Graphics32. Im Demo Sprites_Ex sieht man ständig bewegende Objekte über einen konstanten Hintergrund umherflitzen

              Comment


              • #8
                Hi<p>So wie ich das mit memcopy verstanden habe, wird da doch ein Ausschnitt eines großen Bildes angezeigt, den man dann sehr schnell scrollen kann...oder?<p>das hilft mir aber leider nicht...<p>das graphics32 schau ich mich gleich mal an...und directX hab ich mir schon angeschaut, kam damit aber leider nicht klar <p>cu, Sebastia

                Comment


                • #9
                  Zu DirectX gibt es eine Delphi-Kapselung, nennt sich DelphiX. Die Homepage existiert sogar noch: http://www.yks.ne.jp/~hori/index-e.html
                  Ich weiss nicht, ob es mittlerweile ein Update (wenn ja, wo?) gibt, da ich mich eigentlich nie wirklich damit beschäftigt habe

                  Comment


                  • #10
                    Hi Sebastian,<br>du solltest das unbedingt mit directx / Gl bewerkstelligen. Du kannst dann sogenannte Sprites über den Bildschirm schieben und auch Kollisionen feststellen. Google mal nach Directx und delphi. (evtl. auf DSP DelphiSuperPage nachschauen)<br>
                    http://gd.tuwien.ac.at/softeng/delphi/ftp/d40free/GLScene080.zip
                    <br>Ansonsten würde ich vorschlagen die bewegten Objekte nicht in die Hintergrundbitmap zu malen, sondern diese auf dem Hintergrund transparent zu bewegen (eigenes Grafikobjekt), damit ersparst du dir die Sache, den Hintergrund ständig neu zu schreiben!<br>Mit BitBlt solltest du das flackern eigentlich wegbekommen, das ist schnell genug.<br>cu Michae

                    Comment


                    • #11
                      Nur zur Info, BitBlt macht nen memcopy

                      Comment


                      • #12
                        Hi Shadows,<br>soweit war mir das auch klar :-)<br>der zweite Abschnitt meiner Antwort bezog sich auf die Möglichkeit, dass er es NICHT mit directx / GL lösen möchte.<br>cu Michae

                        Comment


                        • #13
                          Hi<p>Vielen Dank für eure Hilfe <br>Ich hab mir jetzt mal die DelphiX - Komponenten heruntergeladen und mach das über ein TDXDraw und ne TDXImageList...ihr habt recht - ist viel schneller.<p>Aber irgendwie klappt das mit der Transparenz nicht. Manche Bilder zeigt er Transparent an, manche nicht. Aber die Eigenschaften der Bilder ( TDXImageList.Items[x].Transparent und TDXImageList.Items[x].TransparentColor) sind alle gleich und die Werte TDXImageList.Items[x].Picture.Bitmap.Canvas.Pixels[0,0] (also die Hintergrundfarbe, die Transparent werden soll), ist auch überall die selbe...ich weiß nicht, woran das noch liegen könnte. Ich hab auch schon die direkten Transparent-Werte (TDXImageList.Items[x].Picture.Bitmap.Transparent & TDXImageList.Items[x].Picture.Bitmap.TransparentColor) überprüft, und die stimmen auch überein.<p>Etwas komisch finde ich es, dass TDXImageList.Items[x].TransparentColor und TDXImageList.Items[x].Picture.Bitmap.TransparentColor nicht übereinstimmen. Beide Farben ergeben rot (255 & 33554687) und ich kann sie mit dem Auge nicht auseinanderhalten, aber es sind eben andere Farbwerte. Der obere linke Bildpunkt hat den Farbwert 255 und wie schon gesagt - diese Werte sind bei allen Bildern gleich, aber nur manche werden Transparent angezeigt...die anderen haben einen roten hintergrund...<p>Kann mir jemand helfen?<p>cu, Sebastian<p>edit:<br>Wenn ich ne Zeile bevor die Bitmap aus der Liste gezeichnet wird (TDXImageList.Items[x].Draw(TDXDraw.Surface,100,100,0) nochmal TDXImageList.Items[x].Transparent:=True; stehen habe, funktioniert das Transparente bei allen Bildern...aber dieser Wert steht schon zuvor auf True...ich bin das mal Schritt für Schritt mit dem Debugger durchgegangen - und somit ändert diese Zeile eigentlich gar nichts und deshalb verstehe ich nicht, wieso es dann geht.<br>Bin verzweifelt...bitte helft mir :

                          Comment


                          • #14
                            Es wird immer komischer...wenn ich<pre>If not (TDXImageList.Items[x].Transparent) then
                            TDXImageList.Items[x].Transparent:=True;</pre>schreibe, geht er nicht in die Zeile, um die Eigenschaft auf True zu setzen und manche der Bilder werde dann auch nicht Transparent angezeigt. Wenn ich aber<pre>If not (TDXImageList.Items[x].Transparent=True) then
                            TDXImageList.Items[x].Transparent:=True;</pre>schreibe, geht er in die entsprechende Zeile und führt sie aus.<br>Was zum Teufel ist der Unterschied zwischen not(TDXImageList.Items[x].Transparent) und not(TDXImageList.Items[x].Transparent=True) ?<p>edit:<br>Wenn ich<pre>If (TDXImageList.Items[x].Transparent=False) then
                            TDXImageList.Items[x].Transparent:=True;</pre>schreibe, erkennt er die Bedingung auch als unwahr und führt den folgenden Befehl nicht aus. Also nochmal zusammengefasst:<p>
                            not(TDXImageList.Items[x].Transparent) ergibt False<p>
                            not(TDXImageList.Items[x].Transparent=True) ergibt True<p>
                            (TDXImageList.Items[x].Transparent=False) ergibt False.<p>Also ist dieser Wert weder True noch False, aber ergibt, wenn man ihn direkt als If-Bedingung nimmt, trotzdem True. Zuerst dachte ich, es sei evtl ein Integerwert "1", oder so. Der ist ja nicht true, nicht false, ergibt aber in ner if-bedingung "true"...aber der Wert TDXImageList.Items[x].Transparent ist ein Boolean-Wert (ich hab in den DelphiX-Units nachgeschaut..

                            Comment


                            • #15
                              Ist [x] immer gleich? Ist x ein Integer oder Double? Oder greifst Du möglicherweise <b>nach</b> der For-Schleife auf x zu? Poste mal bitte die For-Schleife

                              Comment

                              Working...
                              X