Anfang mit 3D-Grafik.Programmierung



  • JKCody schrieb:

    @hellihjb: was sind denn "topmost- und fullscreen-flags" in meinem Fall?

    CreateWindowEx erzeugt durch das Flag WS_EX_TOPMOST ein Fenster das immer vor allen anderen ist, SetDisplayMode wechselt zudem die Bildschirmaufloesung was das Debuggen etwas behindert.
    Vielleicht gibt es ja in Deinem Buch auch ein Beispiel das im Fenster arbeitet?

    ist es denn wirklich soooooo zu empfehlen, dass ich mich vorher mit der Windows-Programmierung beschäftige?

    Es ist nicht unbedingt empfehlenswert die zugrundeliegenden Konzepte gaenzlich zu ignorieren.



  • Hallo und frohes neues Jahr erstmal noch (auch wenns schon bissl spät is 😉 )!

    Also ich hab das Beispiel, so wie es im Buch steht aufgegeben - ich bekomm es nicht zum Laufen.

    ABER der Pixeltoaster funktioniert, d.h. ich hab erstmal wieder was zum Rumbasteln und bin beschäftigt, so lange ich die Beispiele aus dem Buch halberwegs umschreiben kann (auch wenns nicht schlecht wär, wenn die so funktionieren würden).

    Allerdings hätte ich zu dem Pixeltoaster gleich noch zwei kleine Fragen:
    1.) Kann ich die Konsole, die ja im Hintergrund zu sehen ist, irgendwie verstecken?
    2.) Kann ich den Pixeltoaster auch aus einer WinMain-Funktion heraus verwenden, weil die Beispiele dazu sind ja alle in einer "normalen" main-Funktion?

    mfg JKCody



  • JKCody schrieb:

    Allerdings hätte ich zu dem Pixeltoaster gleich noch zwei kleine Fragen:
    1.) Kann ich die Konsole, die ja im Hintergrund zu sehen ist, irgendwie verstecken?
    2.) Kann ich den Pixeltoaster auch aus einer WinMain-Funktion heraus verwenden, weil die Beispiele dazu sind ja alle in einer "normalen" main-Funktion?

    Die Konsole kannst du ausschalten, indem du den Anwendungstyp auf GUI-Anwendung stellst.

    Wofür willst du denn WinMain verwenden? Ich sehe da keine Vorteile.



  • Die Konsole kannst du ausschalten, indem du den Anwendungstyp auf GUI-Anwendung stellst.

    Und wo mach ich das?

    mfg



  • Im Visual-Studio stellst Du in den Projekteinstellungen unter Linker->System auf Subsystem:Windows; dann brauchst Du auch WinMain anstatt main.



  • ok, werd ich bei Gelegenheit mal ausprobieren!

    danke auch für die Antworten - ich denk, damit ist das Thema erledigt

    mfg JKCody



  • hellihjb schrieb:

    Im Visual-Studio stellst Du in den Projekteinstellungen unter Linker->System auf Subsystem:Windows; dann brauchst Du auch WinMain anstatt main.

    Nein brauchst du nicht. main kannst du trotzdem verwenden. Du musst nur als Entry-Point mainCRTStartup eintragen. Wenn man eine Plattform unabhängige Bibliothek benutzt, muss man sich ja nicht durch so einen Blödsinn wieder mehr Arbeit machen.

    http://msdn.microsoft.com/en-us/library/f9t8842e(VS.71).aspx





  • Hi JKCody,

    ich hatte ebenfalls dasselbe Problem mit dem Buch. So habe ich es gelöst: Das Hauptproblem ist die 8 Bit Farbtiefe, die ab Windows XP scheinbar nicht mehr funktioniert. Auf der CD des Buches gibt es aber auch Programme, die mit der Farbtiefe von 16 und 32 Bit arbeiten, ich glaube ab dem 6. Kapitel. Sollte die Auflösung 640x480 nicht arbeiten, probiere es mit 1024x768, aber die 32 Bit Farbtiefe ist wichtig. Diese erkennt man anhand von Befehlen wie:

    initialise_world( hInstance, 640, 480, 32 );

    pixel_32 *screen = (pixel_32 😉 surface.get_screen_pointer();

    Diese Programme laufen wie sie sollten, auf meinem Rechner wenigstens. Ich habe einfach eines dieser Programme genommen (a6_8), und ihn so weit wie möglich vereinfacht. Darauf konnte ich dann meine eigenen Versionen der Beispielprogramme aufbauen. Ein weißer Pixel an der Position (sx, sy) wird dann wie folgt gesetzt:

    screen[ sy * 640 + sx ] = pixel_32( 255, 255, 255 );

    Eine Farbpalette von gelb nach blau wird erstellt durch:

    pixel_32 palette[ 256 ];
    for( int i=0 ; i < 256 ; i++ ) palette[ i ] = pixel_32( 255-i, 255-i, i );

    und ein Pixel dann auf dem Bildschirm gesetzt:

    long x = 200;
    screen[ sy * 640 + sx ] = palette[ x ];

    Ich hoffe, ich konnte Dir helfen. Sag bitte, ob dieser Vorschlag funktioniert hat.



  • Hallo!
    @Coding4fun:

    Ich war einige Tage nicht im Forum, deshalb hab ich deine Antwort jetzt erst gelesen. Also ich hab jetzt versucht, das Programm 6_8 (welches dieses tolle Grundgerüst von dem Raumschiff anzeigt) so umzugestalten, dass es das macht, was eigentlich das Programm 2_1 machen soll.
    Hier mein Ergebnis:

    #include <windows.h>
    
    #include "s6_8.h"
    #include "m6_8.h"
    #include "t6_8.h"
    #include "gv6_8.h"
    
    uchar handle_input( MSG *msg );
    
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow )
    {
      initialise_world( hInstance, 640, 480, 32 );
    
      pixel_32 *screen = (pixel_32 *) surface.get_screen_pointer();
    
      for( long x=0 ; x<255 ; x++ )
         for( long y=0 ; y<480 ; y++ )
            screen[ y * 640 + x ] = pixel_32( 255, 255, 255 );
    
      surface.release_screen_pointer();
    
      MSG message;
      while( !handle_input( &message ) ) ;
    
      destroy_world();
    
      return message.wParam;
    }
    
    uchar handle_input( MSG *msg )
    {
      if( PeekMessage( msg, NULL, 0, 0, PM_REMOVE ) )
      {
        if( msg->message == WM_QUIT || msg->message == WM_KEYDOWN ) return 1;
    
        TranslateMessage( msg );
        DispatchMessage( msg );    
      }
    
      return 0;
    }
    

    Folge ist, dass das Programm startet, der Bildschirm schwarz wird und dann das Programm auf einen Tastendruck zum Beenden wartet - aber von Farben weiterhin keine Spur 😞 ! (Und ja, ich hab auch verschiedene Auflösungen und Farbtiefen versucht.)

    Hoffe, dass du mir weiterhelfen kannst, da du ja das gleiche Problem hattest. Übrigens, welchen Compiler hast du verwendet, weil mit nem anderen, als dem Mitgelieferten, krieg ich gleich gar kein funktionsfähiges Programm hin.

    mfg JKCody


Anmelden zum Antworten