Borland C++ 6 + DirectX & OpenGL



  • Ich muß schon sagen ihr seid echt Klasse!

    Ich möchte mich ganz Herzlich bei euch beiden @promicha @Bigwill bedanken.

    @promicha:
    Vielen Dank für den Code. Ich werd mir den gleich mal ansehen und schauen wie du es gelöst hast. Ich freu mich wirklich über jede Hilfe die ich von euch bekommen kann.

    @Bigwill:
    Danke für den Tipp mit SDL. Ich hab in der Tat jede Menge Tutorials gefunden zum Thema SDL. Vielleicht finde ich ja noch eine Klasse für den CBuilder 6 damit ich es per Click einbinden kann 🙂

    Zum Thema Visual C++ kann ich dir folgendes Berichten. Also ich habe mir von der Bücherhalle früher 1 Buch ausgeliehen. Visual C++ 6 für Dumies. Ich hab das Buch bestimmt 2x durchgelesen. Dann hab ich gleichzeitig alle Tutorial 2x durchgearbeitet. Aber weißt du was ich an dem Visual C++ vermisse? Ganz einfach. Bei Borland läuft es ja so ab. Ich starte Borland C++ 6. Dann erstell ich ne neue Anwendung z.B. dann klick ich mir mein Fenster zusammen und proge dann mit C++ den Code zusammen. Und fertig ist das Programm (in windeseile :)). Vielleicht habt ihr ja den Anschein dass ich Visual c++ gleich schlecht geredet habe. Kann ja sein aber dem ist nicht so. Ich habe großen Respekt vor Visual C++ programmierern. Ich denke mal Borland ist für den Einstieg ideal. Visual C++ ist ebend für die C++ Gurus gedacht. Weil dort sieht es ja gleich wieder ganz anders aus. Wenn ich dort eine Anwendung programmieren möchte klick ich auf Neu -> Neue Win32 Anwendung -> Titel eingeben -> Verzeichnis eingeben und dann gibts nur nen Quellcode mit dem ich alles machen kann was ich will. Ich meine das ist mit sicherheit super für alle Profies in C++. Weil so können sie genau das Programmieren was sie wollen. Ich denke für Spieleprogrammierung eignet sich Visual C++ natürlich besser dazu. Weil wer klickt sich den Ein Spiel zusammen? Ne Anwendung ok aber kein Spiel. Deshalb mein ich ja Visual C++ ist schon ein Profi Werkzeug denn mit MFC kannste keine wirklich schnellen Spiele programmieren soweit ich gehört habe. Soviel zum Thema Visual C++ und BCB. Ich hoffe ihr versteht nun mein Feedback zu den beiden mächtigen IDEs 🙂 Schaut mal für Visual C++ gibts unmengen gute Tutorials -> siehe http://nehe.gamedev.net/ von GameDev.net. usw 🙂 Für Borland C++ hab ich bislang nur eine Site kennengelernt. Und dort wird leider nichts erklärt. Leider. Hier der Link: http://www.hellix.com/People/AGarny/OpenGL/ und hier bekommt ihr die Klasse bzw. Komponennte her: http://www.hellix.com/Products/TOpenGL.asp Vielleicht könnt ihr mir die Beispiele ein bischen näher erklären. Weil was bringen denn nur die Quellcodes wenn ich den Sinn nicht kapiere. Schaut mal ich hab es soweit gekriegt das Borland bei OpenGL::OnPaint ein Quadrat gepinselt hat 🙂 Mein erster Erfolg. Aber dann hab ich den selben code in ein OpenGl::OnClick ereigniss kopiert und dann die Farbe geändert von dem Quadrat aber er zeigte mir leider nichts an sobald man draufklickt. Vielleicht könnt ihr mir genau erklären wie das geht. Ich hab was von PipeLines gehört in OpenGL was hat es damit auf sich?

    PS: Nochmals 1000x Danke für alle Antworten und jede Hilfe 🙂



  • 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