If bedingung
-
hallo Forum,
ich hbe folgendes problehm, ich habe mir ein Code gemacht, wo abgefragt wird ob man gerade die pfeil tasten drückt oder nicht ...
nun möchte ich dort einfügen, das eine linie gezeichnet wird, wenn eine taste gedrückt wird, aber nur eine von den pfeiltasten ...das ist der Code:
#include <windows.h> #include "stdafx.h" #include "hvhjbhlk.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; char szAppName[] = "Tastaturabfragen"; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static RECT rect; static bool ArrowKeys[4]; switch (message) { case WM_SIZE: { rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); return 0; } case WM_KEYDOWN: { switch (wParam) { case VK_LEFT: ArrowKeys[0] = true; break; case VK_UP: ArrowKeys[1] = true; break; case VK_RIGHT: ArrowKeys[2] = true; break; case VK_DOWN: ArrowKeys[3] = true; break; default: return 0; } InvalidateRect(hWnd, NULL, FALSE); return 0; } case WM_KEYUP: { switch (wParam) { case VK_LEFT: ArrowKeys[0] = false; break; case VK_UP: ArrowKeys[1] = false; break; case VK_RIGHT: ArrowKeys[2] = false; break; case VK_DOWN: ArrowKeys[3] = false; break; default: return 0; } InvalidateRect(hWnd, NULL, FALSE); return 0; } case WM_PAINT: { PAINTSTRUCT ps; HDC hDC; int a; int i; SIZE size; char szKeyStatus[40]; int iKeyLength; hDC = BeginPaint(hWnd, &ps); for (int i = 0; i < 4; i++) { iKeyLength = wsprintf(szKeyStatus, "Pfeil-Taste %i: %i", i, ArrowKeys[i]); GetTextExtentPoint32(hDC, szKeyStatus, iKeyLength, &size); TextOut(hDC, rect.right / 2 - size.cx / 2, rect.bottom / 2 - 2 * size.cy + i * size.cy, szKeyStatus, iKeyLength); if(i=0) { for(a=0; a<1024; a++) SetPixel( hDC, a, 100, RGB(0,0,255) ); } } EndPaint(hWnd, &ps); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }Aber wenn ich das programm nun starte, dann haut es meine CPU auf 100% ...
Das liegt warscheinlich hier drann:
hDC = BeginPaint(hWnd, &ps); for (int i = 0; i < 4; i++) { iKeyLength = wsprintf(szKeyStatus, "Pfeil-Taste %i: %i", i, ArrowKeys[i]); GetTextExtentPoint32(hDC, szKeyStatus, iKeyLength, &size); TextOut(hDC, rect.right / 2 - size.cx / 2, rect.bottom / 2 - 2 * size.cy + i * size.cy, szKeyStatus, iKeyLength); if(i=0) { for(a=0; a<1024; a++) SetPixel( hDC, a, 100, RGB(0,0,255) ); } } EndPaint(hWnd, &ps);wenn ich die If nun aus der For schleife raus nehme, bleibt meine CPU normal, aber ansheinent wird dann die variable i nicht mehr mitgenommen

kann mir da vieleicht jemand weiter helfen?
-
ohne es genau anzuschauen, versuch mal i==0
-
ja, jetzt klappt es, aber schon habe ih ein neues problehm

ich möchte das eine linie erstellt wird, sobald man eine der pfeil tasten drückt und dafür benutze ich das true un false, weil die tastendrucke ja uauch mit true und false ausgegeben werden.
es entseht wenn man das fenster öffnet einmal eine linie aber ich kann so oft auf den pfeilatsten drücken wie ich will, es will einfahc net klappen

EDIT: Achkja der Code:
#include <windows.h> #include "stdafx.h" #include "hvhjbhlk.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; char szAppName[] = "Tastaturabfragen"; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); hWnd = CreateWindow(szAppName, TEXT("FullscreenWindow"), WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // window darstellen und maximieren ShowWindow(hWnd, SW_MAXIMIZE); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static RECT rect; static bool ArrowKeys[4]; switch (message) { case WM_SIZE: { rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); return 0; } case WM_KEYDOWN: { switch (wParam) { case VK_LEFT: ArrowKeys[0] = true; break; case VK_UP: ArrowKeys[1] = true; break; case VK_RIGHT: ArrowKeys[2] = true; break; case VK_DOWN: ArrowKeys[3] = true; break; default: return 0; } InvalidateRect(hWnd, NULL, FALSE); return 0; } case WM_KEYUP: { switch (wParam) { case VK_LEFT: ArrowKeys[0] = false; break; case VK_UP: ArrowKeys[1] = false; break; case VK_RIGHT: ArrowKeys[2] = false; break; case VK_DOWN: ArrowKeys[3] = false; break; default: return 0; } InvalidateRect(hWnd, NULL, FALSE); return 0; } case WM_PAINT: { PAINTSTRUCT ps; HDC hDC; int a; int b; b=200; SIZE size; char szKeyStatus[40]; int iKeyLength; hDC = BeginPaint(hWnd, &ps); for (int i = 0; i < 4; i++) { iKeyLength = wsprintf(szKeyStatus, "Pfeil-Taste %i: %i", i, ArrowKeys[i]); GetTextExtentPoint32(hDC, szKeyStatus, iKeyLength, &size); TextOut(hDC, rect.right / 2 - size.cx / 2, rect.bottom / 2 - 2 * size.cy + i * size.cy, szKeyStatus, iKeyLength); if(i==true) { for(a=1; a<1024; a++) SetPixel( hDC, a, b, RGB(0,0,255) ); b++; } } EndPaint(hWnd, &ps); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }
-
Nur mal so zum Verständnis: Das Ergebnis soll dann so ähnlich aussehen wie das allseits bekannte "Snake"-Spiel?
D.h. du drückst "rechts" und es taucht eine linie die nach rechts wandert auf?
drückst du nach "oben" gibt es einen knick und die linie wandert nach oben weiter?
-
also ich war darauf am hin arbeiten, wollte aber erstmal verstehen wie ich die tastatur mit variablen abfragen kann.
Also ich habe das aus einem tut und noch nen wenig dran herum gebastelt. soweit wie ich das sehe, ist das ob die taste gedrückt ist oder nicht mit tue und false gemacht oder???
aber ie kann ich das nun mit in einer bedingung einbringen, das nur wenn die Abwertspfeil taste gedrückt ist, das die bedingung dann erfüllt ist??
MfG
Showball!
-
les ein Buch zu dem Thema !!!
-
ja ich weiß doch garnet wo man so eines her bekommt!
das standart buch für WinAPI ist doch "der Petzold", oder?
So, und jetzt zitiere ich mal von ein paar seiten, die auf dieses tutorial verlinken:
Win-API.de ist ähnlich aufgebaut wie das C++ standard Buch "Der petzold" das für jeden C++ programmierer mindestens einmal gelesen werden sollte! wer sich das buch nicht kaufen will, kann mit diesem Tutorial ebendfalls seine kentnisse in C++ verbessern!
Das hat ja wohl was zu sagen

und die haben recht, ich finde es perfekt, dieses Tutorial, ich habe mir noch garnet alles durchgelesen, aber einfach genial!
-
ich mache nochmal Werbung für das Buch und eines über C++
übrigens:
Linien kann man so malen:MoveToEx(hDC,xStart,yStart,NULL); LineTo(hDC, xEnd,yEnd);" steht im Petzold "

zu Deinem Problem:
Timer, Thread, ...
ich denke da gibts viele MöglichkeitenPS: Bücher bekommt man in der Buchhandlung oder im Onlineshop ( bei Amazon zum Beispiel
)
-
Mein Vorschlag wäre:
- OffscreenDC benutzen
- Timer benutzen und alle x ms die gedrückten Tasten prüfen und dem entsprechend in das OffscreenDC zeichnen. Dann OffscreenDC auf das Fenster blitten.
Das erspart einem den Aufwand die einzelnen gezeichneten Linien zu merken.
-
Also wenn du dir ein Snakeklon machen möchtest, kannst du dir dieses ganze getrue und gefalse sparen.
Du brauchst nur eine Variable anlegn die für die Richtung steht, wobei jede der vier Richtungstasten diese Variable mit der entsprechenden Richtung füllt, es sei denn dies würde die Schlange in die entgegengesetzte Richtung lenken (womit sie durch sich durch laufen würde).
Fortbewegen tut sich die Schlange ja sowieso von alleine, daher ist es auch unwichtig zu wissen ob die zuletzt gedrückte Bewegungstaste noch gedrückt ist.Damit wäre die Bewegung oder eher gesagt die Steuerung für ein klassisches Snakespiel eigentlich schon abgehakt.
Die schlange selbst könntest du als Feld darstellen, wenn du es einfach haben mmöchtest (wegen Größenänderungen usw) wäre ein vektor vielleicht noch besser.
Dieses Feld enthält dann einfach nur die Feldkoordinaten.
Das hat den Vorteil, dass du alle Freiheiten der Welt hast die Schlange und das Feld darzustellen, soll heißen das kannst du ändern ohne Die Bewegungsmechanismen zu ändern.
Wie du die Koordinaten interpetierst ist halt deine Sache.Wenn die Schlange bewegt wird, setzt du den Kopf halt in die Richtung welche die Richtungsvariable vorgibt, das erste halssegment auf die vorige Position des Kopfes, das zweite Halssegment auf die vorige Position des ersten halssegments usw.
Hat man dieses zeug erstmal erstellt ist es auch kein Problem mehr das Vieh anzuzeigen.
Z.B. wäre es möglich die Feldkoordinaten im Feld/Vektor als Multiplikator für die gewünschte Segmentbreite zu verwenden, welche dann als eine beliebige Ecke für einen Rectangle-Aufruf dient.
Rectangle(Xkoordinate im Feld mal Segmentbreite in Pixel, das gleiche für y, Xkoordinate im Feld mal Segmentbreite + Segmentbreite, das gleiche für y).Damit die Schlange nicht schon weit aus den Bildschirm rausgehuscht ist bevor du sie auch nur einmal gesehen hast, könntest du auch einen Timer starten und die schlange nur alle X Zeiteinheiten bewegen lassen.
-
ja so in der art habe ich mir das auch geacht, aber jetzt weiß ich j wie ich es umsetzen kan dnake!!!
hab e da noch eine Frage, ginge es net um die schlange bewegen zu lassen, eifach eine while schleife zu nehmen und darin ein sleep rein zu packen?
z.b speep 1000;
dann bewegt die sich jede eine sekunde vorwärtst s oder?
Also in dem code steht ja die vaiable i für gedrückt oder nicht gedrückt, also darin kann stehen 1 und 0, so wieich das sehe...
nun ist meine frage, wie kann ich in einer bedingung also in einer if heraus finden, bzw die bedingung stellen, das z.b VK_Right = false ist damit die linie angezeigt wird. habe die linie erstmal nur als beispiel genommen, weil ich noch ein paar merh sachen mit einbauen möchte

MfG Showball!
-
Was ich eigentlich in ganz ferner zukunft vor hatte, ist ein hintergrunf bild zu bewegen, also wie ein scrolling nur mit den pfeil tasten, aber man darf nur mit den pfeil tasten scrollen können.
wenn man nun die downarrow taste besispielsweise gedrückt hält, dann verschiebt sich das Bild nach oben und anderherum dann halt nach unten ...
Nun habe ich alles mögliche ausprobiert haber es kommt winfach nix

es kommen netweder errors, oder cpu geht auf 100% oder es passoert halt garnix ...
im runden und ganzen will ich eigentlich nur, das wenn z.b A gedrückt wird, das sich der wert einer variable ändert, das eine variable nicht mehr den wert 2 hat sondern 3, halt wen ich jetzt wie gesagt A gedrückt halte, es z.b jede sekunde um einen hochzählt!

kann mir vielciht jemand helfen oder einen tipp geben ?