Borland C++ 6 + DirectX & OpenGL



  • OnPaint() wird aufgerufen, wenn neugezeichnet werden soll, deshalb gehört deine Zeichenoperation dorthinein. Wenn du jetzt möchtest, das er bei Click zeichnet, packst du bei onClick nur einen Aufruf zum neuzeichnen rein.

    z.Bsp.:
    Code ist ausm Kopf, kann also sein, das irgendwas leicht anders geschrieben ist.

    void __fastcall Komponente::OnClick(TObjekt* Sender)
    {
      Komponente->Repaint();
    }
    

    Jetzt bringts das alleine natürlich nicht, weil dadurch das zeichnen ja immer in der gleichen Farbe wäre, also musst du im OnPaint() noch die Farbe durch eine Variable ersetzen un diese Variable je nach gewünschter Farbe z. Bsp. vorm Repaint() setzen/ändern.

    P.S.
    Die richtige Spieleentwicklung läuft unter BCB eigentlich genau wie unter VC++, nämlich im Endeffekt als reine Win32 Anwendung (wenns für Win ist) unter Ausschluss von VCL bzw. MFC. Was du das jetzt machst ist so ne Art zwischending, ist aber ganz in Ordnung so, habs auch so gemacht. 🙂



  • na dann bin ich ja beruhigt.

    Ich werde es gleich mal versuchen. Danke nochmals für die Hilfe. 🕶

    Habt ihr ein paar Tips zum Thema SDL für mich ???

    Gibt es vielleicht ein paar Komponennten dafür oder so ???



  • promicha schrieb:

    Hi,

    wenn du ein Hintergrundbild, bzw. das Spielfeld scrollen möchtest, würde
    ich vorschlagen das diese Aufgabe von einem eigenen Thread erledigt wird.
    Ob dies nun per DX oder OpenGL geschieht oder nur per Canvas->CopyRec,
    ist das meines Erachtens eine gute Lösung.

    Um dir mal zu Zeigen wie in etwa sowas Aussehen kann, habe ich mal ein kleines
    Beispiel gemacht, versuch zu Verstehen was dort Passiert und progge dazu
    dein eigenen Bewegungsablauf.

    Hier kannst du es runterladen (und andere):
    Scroll.zip

    gruß Micha

    PS: Es ist nur auf der Schnelle Programmiert, daher Public-Variablen und
    keine Sicherheitsabfragen, es soll nur zur Veranschaulichung und Anregung
    dienen.

    So habs mal getestet. Es macht leider nur ein Problem bei mir. Er zeigt kein Bild an. Ich habs auch schon mit dem Absoluten Pfad versucht klappt leider auch nicht. Hab ich was Falsch in den Optionen? Weil normalerweise muss ich immer den Absoluten Pfad eingeben. Hast du einen Tipp für mich.



  • Ändere mal den Code in TForm1::FormShow in folgenden ab:

    backpic = new Graphics::TBitmap;
            backpic->Width = 1280;
            backpic->Height = 400;
            backpic->LoadFromFile(ExtractFilePath(ParamStr(0))+"berge.bmp");
            links = 0;
            oben = 0;
            picmove *sub = new picmove(false);
    

    Mit "ExtractFilePath(ParamStr(0))" ermittelst du den Path zum Ordner des
    Programms, bzw. Projekt in dieser sollte auch berge.bmp liegen.

    Wenn kein Bild geladen werden kann, sollte BCB darauf eine Fehlermeldung
    ausgeben, erscheint diese Fehlermeldung?
    Wenn nicht ist eigentlich der Path ok, aber der Fehler liegt wo anders,
    welche BCB Version hast du?

    gruß Micha

    PS: Ich habe dieses Beispiel unter BCB6 pro erstellt.

    EDIT Zusatz:
    Wenn du einen Absoluten Phat angiebts, wie z.B.:
    "c:\Programme\Borland\CBuilder6\Projects\test1\berge.bmp"
    dann mußt du es folgender massen schreiben, fals es nicht Bekannt ist,
    "c:\\Programme\\Borland\ßCBuilder6\\Projects\\test1\\berge.bmp"

    das "\" (Backslash) ist ein Sonderzeichen um wiederum dieses darzustellen müßen
    2 Backslashes angegeben werden.



  • Ich hab auch BCB 6 pro 🙂

    Nur ehm ich glaube ich hab nicht alle Dateien im Projekt hinzugefügt.

    Bei mir steht beim Quellcode Editor bei den unteren reitern nur 3 reiter:

    1-> Unit1.cpp
    2-> Unit1.h
    3-> Diagramm

    Aber in deinem Programm hast du ja noch 2 andere *.cpp Dateien dabei. Vielleicht muß ich diese erst manuell einbinden? Wie gesagt bin BCB Newbie in der IDE im momment 😞



  • gehe oben im Menu auf "Projekt" -> "Dem Projekt hinzufügen" und wähle die
    Testscroll.cpp aus, das ist der Threadcode, die Scroll.cpp brauchst du nicht
    zu öffnen oder zufügen.

    Normalerweise ist das in der Projektdatei mit gespeichert, und muß nicht
    Manuel geschehen, hast du denn Fehlermeldungen, wenn ja welche?

    gruß Micha



  • Also ich hab die Datei Testscroll.cpp eingefügt.

    Leider klappt es immer noch nicht nun wird aber auch gleich 2 quellcode Fenster angezeigt, also hats geklappt.

    Er meldet mir folgende Warnung:
    [C++ Warnung] Unit1.cpp(35): W8004 'sub' wurde ein Wert zugewiesen, der nie verwendet wird.

    Er startet nur die Form und ich kann per PopUp Menü das Fenster schließen.



  • ...bei einem Freund sein C++ von Borland gesehen und da flog ich von den Socken erlich.

    AMEN. Ich wollt mich nur mal zu Wort melden 😃
    FInd den VC++ auch viel schlehter als den BCB



  • Ist doch so erlich 🙂



  • Die Fehlermeldung ist nicht schlimm, in dieser Zeile wird der Thread
    gestartet, da aber sub sonst nicht verwendet wird im Quellcode kommt
    diese Warnung.

    Vermutlich wird der Thread nicht gestartet, den der zeichnet das Bild.
    Starte mal das Programm und gehe dann in der IDE auf "Ansicht"->"Debug-Fenster"->"Threads"
    In diesem Fenster müßte dann einmal Scroll.exe stehen und darunter picmove..
    oder eine HexZahl.

    Du kannst mal folgendes unter "picmove *sub = new picmove(false);" schreiben:

    sub->Resume();
    

    gruß Micha



  • klappt leider immer noch nicht ich habs wie folgt geändert:

    Hier nochmal der komplette Code:

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Testscroll.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Beenden1Click(TObject *Sender)
    {
            Close();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
            backpic = new Graphics::TBitmap; 
            backpic->Width = 1280;
            backpic->Height = 400; 
            backpic->LoadFromFile(ExtractFilePath(ParamStr(0))+"berge.bmp"); 
            links = 0; 
            oben = 0; 
            picmove *sub = new picmove(false);
            sub->Resume();
    
    }
    //---------------------------------------------------------------------------
    

    Testscroll.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Testscroll.h"
    #include "Unit1.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //   Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur
    //   in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
    //
    //      Synchronize(UpdateCaption);
    //
    //   wobei UpdateCaption so aussehen könnte:
    //
    //      void __fastcall picmove::UpdateCaption()
    //      {
    //        Form1->Caption = "In Thread aktualisiert";
    //      }
    //---------------------------------------------------------------------------
    
    __fastcall picmove::picmove(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void picmove::SetName()
    {
            THREADNAME_INFO info;
            info.dwType = 0x1000;
            info.szName = "picmove";
            info.dwThreadID = -1;
            info.dwFlags = 0;
    
            __try
            {
                     RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info );
            }
            __except (EXCEPTION_CONTINUE_EXECUTION)
            {
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall picmove::Execute()
    {
            SetName();
            while (!Terminated) {
                    // neue Bildposition setzten
                    Form1->links = Form1->links + 1;
                    if (Form1->links == 780) {   //1280 - 500 bild ende
                            Form1->links = 0; // von vorne Anfangen
                    }
                    // Auf Vsync warten (Elektronenstrahl am Bildende)
                    asm mov dx, 3dah
                    loop1:
                    asm in al, dx
                    asm test al, 8
                    asm jz loop1
                    //Bild neu Zeichnen
                    Form1->Canvas->CopyRect(Rect(0,0,500,400),Form1->backpic->Canvas,Rect(Form1->links,Form1->oben,Form1->links+500,Form1->oben+400));
    
            }
    
    }
    //---------------------------------------------------------------------------
    


  • Ja jetzt brat mir einer nen Storch 😡

    Was zeigt das Debug-Fenster an???
    Steht der Thread mit drinn??

    Wenn nicht so wird er, aus welchem Grund auch immer, nicht gestartet!

    gruß Micha



  • Ich glaub ich weiß warum es bei dir nicht geht!

    Normalerweise muß Synchornize() aufgerufen werden,
    wenn ein Thread auf ein VCL Objekt zugreifen will,
    so ist die Regel, aber ich mache es bei Versuchs-
    Programme fast nie und bei mir klappt es auch.

    Nun gut, dann wollen wir es mal Richtig machen,
    ändere den Code von Testscroll.cpp in folgenden ab:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Testscroll.h"
    #include "Unit1.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //   Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur
    //   in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
    //
    //      Synchronize(UpdateCaption);
    //
    //   wobei UpdateCaption so aussehen könnte:
    //
    //      void __fastcall picmove::UpdateCaption()
    //      {
    //        Form1->Caption = "In Thread aktualisiert";
    //      }
    //---------------------------------------------------------------------------
    
    __fastcall picmove::picmove(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void picmove::SetName()
    {
            THREADNAME_INFO info;
            info.dwType = 0x1000;
            info.szName = "picmove";
            info.dwThreadID = -1;
            info.dwFlags = 0;
    
            __try
            {
                     RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info );
            }
            __except (EXCEPTION_CONTINUE_EXECUTION)
            {
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall picmove::Execute()
    {
            SetName();
            while (!Terminated) {
                    Synchronize(bewege);
            }
    
    }
    //---------------------------------------------------------------------------
    void __fastcall picmove::bewege()
    {
            // neue Bildposition setzten
            Form1->links = Form1->links + 1;
            if (Form1->links == 780) {   //1280 - 500 bild ende
                    Form1->links = 0; // von vorne Anfangen
            }
            // Auf Vsync warten (Elektronenstrahl am Bildende)
            asm mov dx, 3dah
            loop1:
            asm in al, dx
            asm test al, 8
            asm jz loop1
            //Bild neu Zeichnen
            Form1->Canvas->CopyRect(Rect(0,0,500,400),Form1->backpic->Canvas,Rect(Form1->links,Form1->oben,Form1->links+500,Form1->oben+400));
    
    }
    

    und in der Headerdatei Testscroll.h füge diese ein:

    //---------------------------------------------------------------------------
    
    #ifndef TestscrollH
    #define TestscrollH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    //---------------------------------------------------------------------------
    class picmove : public TThread
    {
      typedef struct tagTHREADNAME_INFO
      {
        DWORD dwType;     // muß 0x1000 sein
        LPCSTR szName;    // Zeiger auf Name (in user addr space)
        DWORD dwThreadID; // Thread-ID (-1=caller thread)
        DWORD dwFlags;    // Reserviert für spätere Verwendung, muß 0 sein
      } THREADNAME_INFO;
    private:
      void __fastcall bewege();  //Hier wurde geändert, bzw. zugefügt
      void SetName();
    protected:
            void __fastcall Execute();
    public:
            __fastcall picmove(bool CreateSuspended);
    };
    //---------------------------------------------------------------------------
    #endif
    

    Jetzt sollte es funktionieren!

    gruß Micha



  • Ich hab folgenden Post gefunden:
    http://www.c-plusplus.net/forum/topic,39436.html

    Ich denke mal das reicht für das Thema zu beginn...

    Aber ich teste mal deinen Code.


Anmelden zum Antworten