ein "möchtegern Pixel" erzeugen



  • Hallo ^^

    ich habe mir mal folgendes überlgegt:

    ich möchte gerne ein spiel schreiben (weis jetzt auch wie das geht)

    und nun soll mein spiel "GRAFFIK" bekommen

    weil aber

    SET_PIXEL
    

    in der Konsole unsinn ist

    dachte ich mir folgendes aus:

    cout<<"............";
    

    schön und gut aber wie kann man den abstant zwischen den
    pünktchen weg machen , so das das eine linie ergibt ????

    PS: ASCII wern toll , wenn man da ein "." symbol hätte ohne das es dann so auf dem bildschifm aussieht: ....

    sondern so: ___



  • es gibt eine lib für grafik auf der console



  • und die heisst ? ...? 😃



  • nuna ich hab jetzt folgendes gefunden:

    http://www.daniweb.com/code/snippet216430.html#

    // draw two lines and a circle on your console screen
    // original BCX basic code by Sir Joe Caverly
    // translated to C code and modified to work with Dev-C++
    // link with GDI32.lib or with Dev-C++ link libgdi32.a via
    // Project>>Project Options>>Parameters>>Add Lib>>libgdi32.a
    // this is a Windows Console Application
    
    #include <windows.h> // Win32API Header File
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    #define Red RGB (255,0,0)
    #define Lime RGB (206,255,0)
    #define Blue RGB (0,0,255)
    
    static HWND hConWnd;
    
    int BCX_Line (HWND,int,int,int,int,int=0,HDC=0);
    int BCX_Circle (HWND,int,int,int,int=0,int=0,HDC=0);
    HWND GetConsoleWndHandle (void);
    
    int main()
    {
    hConWnd = GetConsoleWndHandle();
    
    if (hConWnd)
    {
    BCX_Circle(hConWnd, 150, 130, 105, Blue);
    BCX_Line(hConWnd, 5, 5, 300, 250, Red);
    BCX_Line(hConWnd, 295, 5, 5, 250, Lime);
    getchar(); // wait
    }
    return 0;
    }
    
    int BCX_Line (HWND Wnd,int x1,int y1,int x2,int y2,int Pen,HDC DrawHDC)
    {
    int a,b=0;
    HPEN hOPen;
    HPEN hNPen = CreatePen(PS_SOLID, 2, Pen);
    if (!DrawHDC) DrawHDC = GetDC(Wnd), b = 1;
    hOPen = (HPEN)SelectObject(DrawHDC, hNPen);
    MoveToEx(DrawHDC, x1, y1, NULL);
    a = LineTo(DrawHDC, x2, y2);
    DeleteObject(SelectObject(DrawHDC, hOPen));
    if (b) ReleaseDC(Wnd, DrawHDC);
    
    return a;
    }
    
    int BCX_Circle(HWND Wnd,int X,int Y,int R,int Pen,int Fill,HDC DrawHDC)
    {
    int a, b = 0;
    if (!DrawHDC) DrawHDC = GetDC(Wnd), b = 1;
    HPEN hNPen = CreatePen(PS_SOLID, 2, Pen);
    HPEN hOPen = (HPEN)SelectObject(DrawHDC, hNPen);
    HBRUSH hOldBrush;
    HBRUSH hNewBrush;
    if (Fill)
    {
    hNewBrush = CreateSolidBrush(Pen);
    hOldBrush = (HBRUSH)SelectObject(DrawHDC, hNewBrush);
    }
    else
    {
    
    hNewBrush = (HBRUSH)GetStockObject(NULL_BRUSH);
    
    hOldBrush = (HBRUSH)SelectObject(DrawHDC, hNewBrush);
    
    }
    
    a = Ellipse(DrawHDC, X-R, Y+R, X+R, Y-R);
    
    DeleteObject(SelectObject(DrawHDC, hOPen));
    
    DeleteObject(SelectObject(DrawHDC, hOldBrush));
    
    if (b) ReleaseDC(Wnd, DrawHDC);
    
    return a;
    
    }
    HWND GetConsoleWndHandle(void)
    
    {
    
    HWND hConWnd;
    
    OSVERSIONINFO os;
    
    char szTempTitle[64], szClassName[128], szOriginalTitle[1024];
    
    os.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
    
    GetVersionEx( &os );
    if ( os.dwPlatformId == VER_PLATFORM_WIN32s ) return 0;
    GetConsoleTitle( szOriginalTitle, sizeof( szOriginalTitle ) );
    sprintf( szTempTitle,"%u - %u", GetTickCount(), GetCurrentProcessId() );
    SetConsoleTitle( szTempTitle );
    Sleep( 40 );
    hConWnd = FindWindow( NULL, szTempTitle );
    SetConsoleTitle( szOriginalTitle );
    
    if ( os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
    {
    hConWnd = GetWindow( hConWnd, GW_CHILD );
    
    if ( hConWnd == NULL ) return 0;
    GetClassName( hConWnd, szClassName, sizeof ( szClassName ) );
    while ( strcmp( szClassName, "ttyGrab" ) != 0 )
    {
    
    hConWnd = GetNextWindow( hConWnd, GW_HWNDNEXT );
    if ( hConWnd == NULL ) return 0;
    GetClassName( hConWnd, szClassName, sizeof( szClassName ) );
    }
    }
    return hConWnd;
    }
    


  • tja einfacher gehts auch , zeichnet ein einfaches rotes rechteck,

    #include "stdafx.h"
    #include "windows.h"
    #include "wingdi.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    HWND CW=GetConsoleWindow();
    HDC hdc=GetDC(CW);
    for(int i=50;i<100;i++){
    	for(int u=50;u<100;u++){
    SetPixel(hdc,i,u,RGB(200,0,0));
    	}
    }
    getc(stdin);
    return 0;
    }
    

    tja du solltest dir die funktionen deines gefundenen beispiel schritt für schritt auf der Msdn seite durchlesen, falls du eine grafik bewegen willst solltes du dir noch überlegen wie du das machst...

    hier gibts alles über das GDI:
    http://msdn.microsoft.com/de-de/library/dd145203%28en-us,VS.85%29.aspx



  • 🙄 ich hab da so eine richtig gute idee:

    kann ich irgentwie ein 256. ASCII zeichen erstellen ?

    es sollte nur 1 pixel haben (oben links)



  • Thrash schrieb:

    🙄 ich hab da so eine richtig gute idee:

    kann ich irgentwie ein 256. ASCII zeichen erstellen ?

    es sollte nur 1 pixel haben (oben links)

    also mit SetPixel kannst du einen pixel hinzeichnen wo du willst!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    bist du dir sicher du kennst den c syntax?



  • Es ist viel zu aufwendig das auf diese Weise lösen zu wollen.

    Arbeite dich lieber in eine richtige Lib ein, wie SDL (in C) oder SFML (in C++).



  • SFML ? - toll es gibt fast kein tutoiral , wie man

    ein einfaches sprite erstellt welches man bewegen kann / später dann eine
    coliision mit ein anderen sprite erzeugen kann

    ich hab vieles ausprobirt:

    Game Maker = zu dämlich - klick and create

    Div (Gemix studio) = Sprache kann ich aber kaun jemand arbeitet mit der DIV2
    Sprache

    XNA Studio = Viel zu komplizirt

    SFML = viele seiten sind "nicht mehr verfügbar" und tutorials
    sind viel zu umständlich geschrieben, aussdem bekomm

    ich es nur auf code blocks installiert (will aber weiter mit DEV C++ arbeiten)
    MSV C++ gibs ja jedes jahr eine neue version und aussderem WER BRAUCHT DEN GANZEN KRAM zum Programmieren - ich weis bis heute nicht was ein Debugger macht

    SFML IST VIEL ZU KOMPLIZIRT

    wie gesagt zeigt mir tutorials , wie man ein sprite erstellt , welches man bewegen kann und am aller besten , wie man mit diesem sprite gegen eine
    wand kollidirten kann

    ⚠

    und irgentwie mag ich das nicht ein aller : lade_bild(...);
    zu programmieren - das ist irgentwie kein normales proggen sondern einfach
    nur Sch**** - ich finde man sollte einfach ein 1PIXEL

    erzeugen können und das bewegen / irgentwo mit collidiren und dann tuts das

    - set_pixel ist aber leider so , wenn man ein pixel ereugt und dann z.b. ein text irentwo in der konsole packt - bewegt , dann verschwindet der pixel wieder



  • Thrash schrieb:

    - set_pixel ist aber leider so , wenn man ein pixel ereugt und dann z.b. ein text irentwo in der konsole packt - bewegt , dann verschwindet der pixel wieder

    Ja, weil die Konsole für solche Spielerein nicht gemacht wurde, folglich muss man sich um das alles selber kümmern.

    Deine Kritik an SFML kann ich nicht wirklich nachvollziehen. Ich finde die Tutorials vollkommen ausreichend.

    http://www.sfml-dev.org/tutorials/1.5/

    Das SFML mit Dev-C++ nicht funktioniert kann ich mir gut vorstellen, da Dev-C++ nicht mehr weiterentwickelt wird. Es ist daher auch nicht mehr zu empfehlen!

    Stattdessen solltest du Code::Blocks oder Visual Studio nutzen. Ein Debugger macht durchaus Sinn, wenn man weiß, wie man damit umgeht.

    Im Übrigen ist die Vorgehensweise zur Abfrage von Kollisionen immer gleich.
    Das ganze sollte sich also nachdem man das Prinzip verstanden hat, auch mit SFML umsetzen lassen.

    Allerdings glaube ich mich zu erinnern, dass SFML sogar eine Funktion dafür bereitstellt.



  • klar ists möglich mit der Konsole zu zeichnen das Problem ist nur das du in der
    Regel auf die 80x50 Auflösung , 16 Farben und die Ascii-zeichen angewiesen bist.
    Und natürlich für so grundlegende Dinge wie etwa Antialiasing komplett neue Ideen
    entwickeln musst.Der Vorteil liegt natürlich darin das man eine enorme Masse an
    Geschwindigkeit erhält und das man das Ganze auch komplett ohne ein OS laufen
    lassen kann (was nochmal ne ganze Ecke an Geschwindigkeit bringt).Ich hab z.b.
    mir einen C-Kernel geschrieben der eine 10mhz CPU emuliert um halt mal richtig
    krasse Sachen machen zu können.Schau mal hier rein dort findest nen paar Anregungen 🙂



  • @Trash:
    - set_pixel ist aber leider so , wenn man ein pixel ereugt und dann z.b. ein text irentwo in der konsole packt - bewegt , dann verschwindet der pixel wieder

    dazu gibt es den Screen Consolen Buffer, du kannst dir dadurch eine art tribbel buffer für deine graphiken basteln,ausserdem kannst du dir deine eingene schriftart machen die nur aus pixel besteht , ein a sieht zb so aus:

    ....ppp....
    ...p...p...
    ..ppppppp..
    .p.......p.
    

    wobei eben hier der . ein schwarzes pixel ist und ein p ein farbpixel ist..
    ausserdem ob du mit dem GDI in ein consolenfenster oder in eine andere windowsform zeichnest ist scheissegal.

    man könnte sogar ein opengl surface auf ein consolenfenster legen...

    wenn du dich damit wirklich beschäftigst und du dir dein dogma für das programm zusammenlegts wirds wohl funktionieren aber wenn du selbst noch nicht genau weisst was du willst wirds wohl etwas langwirig:

    hier ein beispiel:~(nur zur anregung)~
    1. Das Programm soll nur in der Dos Console laufen
    also sollte man/frau viel über die Console wissen wie: SetConsoleBuffer,
    etc...

    2. Es sollten pixel dargestellt werden.
    also viel über den GDI/GDI+ wissen.

    3. Collusion detection
    aslo sollte man/frau sich überlegen wie man sowas macht.
    zb den schnittpunkt zweier kreise die sich nahe kommen etc, etwas mathe
    (phytagoras)

    naja wenn du eine 16bit DOS programm entwirfst wirds etwas anders dazu brauchst du etwas assembler um die VESA oder VGA bios funktionen zu nutzen stichwort:int 10h.



  • danke für diese informationen ,
    ich werde nochmal sehn was sich machen läst - dann werde ích wohl wieder auf
    SET_PIXEL setzen


Anmelden zum Antworten