Hintergrund animieren :) TBitmap->Canvas



  • Hallo Leute,

    könnt ihr mir mal ein beispiel machen wie ich folgendes realisieren kann:

    Ich möchte einen Hintergrund (Sternenhimmer), dass der sich von oben nach unten bewegt und sobald er sich nach unten verschiebt, soll oben wieder der Sternenhimmel aufgefrischt werden als ob man halt immer sterne von oben fallen sieht. Wie kann ich es am besten realisieren wenn ich folgendes Picture habe:

    Graphics::TBitmap *stern = new Graphics::TBitmap();
    

    Ich weiß das hat was mit Canvas zu tun.

    Hier das Beispiel schaut euch mal den Hintergrund an wie der so schön scrollt das will ich auch für meinen Shooter haben 🙂
    http://bcb.24day.de/BCBGame.zip



  • Iss eigentlich nich so schwer.
    Ich würd das folgender maßen machen:

    1. Du erstellt dir einen Timer mit dem du einstellst wie schnell sich der Hintergrund bewegen soll.

    2. Du erstellst 2 offscreen Bitmaps in die du dein Hintergrundbild lädst.

    Graphics::TBitmap *hg1 = new Graphics::TBitmap();
    Graphics::TBitmap *hg2 = new Graphics::TBitmap();
    hg1->LoadFromFile("dateiname");
    hg2->LoadFromFile("dateiname");
    

    3. du brauchst Variablen die dir die Y-Position des jeweiligen Bitmaps angeben

    int y1, y2;
    

    4. Im OnTimer Event zeichnest du die offscreen Bitmaps an der jeweiligen Position auf das Canvas der Form

    Form->Canvas->Draw(0,y1,hg1);
    Form1->Canvas->Draw(0,y2,hg2);
    

    Jetzt musst du dir nur noch auskaspern, wie du y1 und y2 berechnest, das das Bitmap hg2 oder hg1 immer so an das vorhergehende gezeichnet werden, das keine Lücken entstehen und du einen scheinbar unendlichen Hintergrund hast.

    5. Die Resourcen wieder freigeben

    delete(hg1);
    delete(hg2);
    

    Wäre mir jetzt so auf die schnelle eingefallen. 😃 . Kein Ahnung obs dir was bringt.



  • Ag3nt schrieb:

    Hier das Beispiel schaut euch mal den Hintergrund an wie der so schön scrollt das will ich auch für meinen Shooter haben 🙂
    http://bcb.24day.de/BCBGame.zip

    Kleiner Tip: Da gibt es den Quelltext dazu. Warum guckst du dir den nicht einfach mal an?
    MfG Aoeke



  • Weil ich grad den Teil nicht verstehe @Aoeke 🙂

    Danke @MORL ich werde den Code gleich mal testen 🙂



  • Ag3nt schrieb:

    Weil ich grad den Teil nicht verstehe @Aoeke 🙂

    Dann frag konkret, indem du den Code hier aufdröselst!



  • Dann frag konkret, indem du den Code hier aufdröselst

    Sag ihm das nicht, sonst wird der Post auch wieder etlich lang und er wurde
    bereits gepostet, zudem habe ich nochmal ein Dokumentierten Code gepostet
    und er, wie er sagt jetzt klar kommt.

    Nun bin ich mal gespannt auf das Ergebniss, und ob er auch Klassen für z.B.
    die Gegner erstellt, oder zumindest Strukturen.
    Wie ich das in einem "dieser Art" Postings erwähnt habe.

    gruß Micha



  • So weit ich mich erinnern kann, wurde in diesen Threads hier noch kein Code aufgedröselt.



  • Tada 🙂 fertig 🙂

    Nun versteh ich es auch mit Canvas->Rect *grins*

    Danke für eure Geduld 🙂

    Das Beispiel könnt ihr hier runterladen:
    http://sm2.funpic.de/ag3nt/myProjects/bgscroll.rar

    PS: Ihr müßt den Link selber in den Browser eingeben, da mein Hoster sich sonst in die hosen macht 🙂 er meldet dann wenn ihr es nicht manuell macht linken verboten

    Ich hoffe es gefällt euch 🙂



  • da ist nichts zu finden (404)



  • Das Beispiel könnt ihr hier runterladen:
    http://sm2.funpic.de/ag3nt/myProjects/bgscroll.rar

    PS: Ihr müßt den Link selber in den Browser eingeben, da mein Hoster sich sonst in die hosen macht er meldet dann wenn ihr es nicht manuell macht linken verboten

    OK ?



  • Nö. Bei mir (IE) geht's nicht!



  • Grotten Schlecht!

    hast du dir das Ergebnis mal selbst Angeschaut, und gesehen wie nach kurzer
    Zeit lange Streifen kommen, und auch gefargt Warum?

    Als Startwert hast du 960
    diesen Wert zählst du runter (hohe--)
    Wann ereichst du dann den Wert 1440???

    if (hohe==1440) {
                    hohe=960;
                    }
    

    solte es nicht besser "hohe <= 0" heissen?

    warum hast du jpeg.hpp included wenn sie nicht genutzt wird?

    // Warteschleife
            idletime = GetTickCount()+1;
            Application->ProcessMessages();
    

    wo ist da die Schleife, was für ein Sinn hat das Ganze jetzt in deinen Code? Kein!

    Warum ladest du das Hintergrundbild inerhalb der Schleife immer neu?

    Warum versuchst du nicht den Ablauf zu verstehen und nicht durch unüberlegtes
    Copy´n Paste so ein Misst auf zu Tischen?

    Wenn du schon von meinem Code abschaust, dann mach es doch wenigstens richtig!

    So kann aus dir nie ein Spieleprogger mit dem BCB werden, also werde ich dich
    wohl nie Einstellen können 🙄



  • Leute ich glaube hier gabs ein missverständnis der Code den du beschreibst micha ist falsch also das war der anfangscode 🙂 Den code hatte ich vergessen in der rar zu updaten hier ist der richtige code:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    // Public Variablen
    
            // INT VARIABLEN
            int xwingX=300;
            int xwingY=300;
    
            // BOOL VARIABLEN
            bool schuss=false;
            bool GameOver=false;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    
            // Einstellungen
    
                    Form1->Cursor = crCross;
                    Button1->Visible=false;
                    // Puffergrafiken *background *puffer
                    Graphics::TBitmap *puffer = new Graphics::TBitmap();
                    Graphics::TBitmap *backpic = new Graphics::TBitmap();
                    Graphics::TBitmap *xwing = new Graphics::TBitmap();
                    puffer->Width = 640;
                    puffer->Height =480;
    
            // Bilder in Bitmaps laden
                    backpic->LoadFromFile(ExtractFilePath(ParamStr(0))+"bg.bmp");
                    xwing->LoadFromFile(ExtractFilePath(ParamStr(0))+"xwing.bmp");
    
            // Bilder transparent darstellen
                    xwing->TransparentColor=clLime;
                    xwing->Transparent=true;
    
            schuss = false;
            DWORD idletime;
            int hohe=960;
    
            while (!GameOver)
            {
            // Warteschleife
            idletime = GetTickCount()+35;
            Application->ProcessMessages();
    
            puffer->Canvas->CopyRect(Rect(0,0,640,480),backpic->Canvas,Rect(0,hohe,640,hohe+480));
            hohe--;
    
            // Prüft wo der Hintergrundscroller ist und setzt nochmal auf std
            if (hohe<=0)
                    hohe=960;
    
            // Zeichnet X Wing
            puffer->Canvas->Draw(xwingX,xwingY,xwing);
    
            // Zeichnet X Wing -> Schuss
            if (schuss==true) {
                    // Schuss linke Seite
                    puffer->Canvas->Pen->Color = clWhite;
                    puffer->Canvas->PenPos = Point (xwingX,xwingY);
                    puffer->Canvas->LineTo(xwingX,0);
                    // Schuss rechte Seite
                    puffer->Canvas->Pen->Color = clWhite;
                    puffer->Canvas->PenPos = Point (xwingX+31,xwingY);
                    puffer->Canvas->LineTo(xwingX+31,0);
                    schuss=false;
    
                            }
    
             while (GetTickCount() < idletime)
             Sleep(0);
    
            Form1->Canvas->Draw(0,0,puffer);
            }
            delete puffer;
            delete backpic;
            delete xwing;
            Form1->Close();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
            if (Key==VK_ESCAPE)
                    GameOver=true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
            xwingX=X-15;
            xwingY=Y-25;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
            schuss=true;
    }
    //---------------------------------------------------------------------------
    

    PS: Micha ich hab nie gesagt das ich ein Profi bin ich sachen Gamedev ok? Deshalb find ich es nicht passend gleich solch eine kritik über mich auszuüben erlich. Ich geb doch mein bestes und so langsam mach ich doch fortschritte oder nicht? Also ganz erlich, dass fand ich echt traurig, so demotivierst du anfänger wie mich 😞



  • PS: Micha ich hab nie gesagt das ich ein Profi bin ich sachen Gamedev ok? Deshalb find ich es nicht passend gleich solch eine kritik über mich auszuüben erlich. Ich geb doch mein bestes und so langsam mach ich doch fortschritte oder nicht? Also ganz erlich, dass fand ich echt traurig, so demotivierst du anfänger wie mich

    Damit versuche ich nicht dich nieder zu machen.
    Sondern ich Versuche dich auf den richtigen Weg zu bringen, und da
    gehört krasse Kritik dazu, oder besser gesagt man gebe mal ein Denk
    anstoß.

    Ich habe mich mal über eine Wortwahl von Junix aufgeregt, aber jetzt verstehe ich
    auch warum es auch mal unfreundlich erscheinen kann, (sorry @Junix,
    jetzt verstehe ich erst warum)

    Fakt ist, das du weder mit der C++ programmierung noch mit dessen Ablauf
    vertraut bist, ebenso versuchst du dich (was ja nicht verkehrt ist) an
    großen Sachen ran, ohne vorher simple Sachen zu verstehen.
    Zur klammerung oben, ist gemeint das du Wissensdurst hast, aber es Falsch angehst.

    Wenn du Spiele Programmierer werden willst, mußt du zuerst Programmieren
    lernen, gebe dich doch erst mal mit kleinen Resultaten aus Test-Programmen zufrieden,
    als gleich ein Diablo und Co Ergebniss beim Testen zu erzielen!

    ((((Ungeduld ist des Programmierers schlimmster Feind))))

    Wenn ich dich nieder machen wollte, hätte ich nicht Beispiele gepostet,
    sondern wäre mir nen Bier trinken gegangen, da ich dein Ergeitz verstehe,
    bin ich auch weiterhin bereit zu helfen, aber wenn ich einen Code sehe
    der aus dem Fleischwolf kommt, gebe ich harte Kritik daran.

    In diesem Sinne
    Micha



  • Was kann ich denn besser dran machen???

    PS: Ich kann doch schon die Standart sachen programmieren 🙂



  • Versuch doch mal, dein Raumschiff als eine Klasse zu implementieren. Dazu gehört, das die Bitmap und die Position des Raumschiffs nicht in der Form definiert werden.
    Oder versuche mal, die Laserschüsse durch Kugelschüsse zu ersetzen, möglichst so, das mehrere Schüsse gleichzeitig auf dem Bildschirm zu sehen sind.


Anmelden zum Antworten