ein "möchtegern Pixel" erzeugen
-
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 kannich hab vieles ausprobirt:
Game Maker = zu dämlich - klick and create
Div (Gemix studio) = Sprache kann ich aber kaun jemand arbeitet mit der DIV2
SpracheXNA Studio = Viel zu komplizirt
SFML = viele seiten sind "nicht mehr verfügbar" und tutorials
sind viel zu umständlich geschrieben, aussdem bekommich 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 machtSFML 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 kannund 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 1PIXELerzeugen 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 wiederdazu 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