Variable in Klasse wird nicht erhöht.
-
Hallo zusammen,
ich habe folgende Klasse:class cBall { public: cBall(int livetime); ~cBall(); int GetXpos() const; int GetYpos() const; int GetEnergie() const; void SetXpos (int Xpos); void SetYpos (int Ypos); void SetEnergie(int itsEnergie); private: int itsXpos; int itsYpos; int itsEnergie; int itslivetime; }; cBall::cBall(int livetime) { itslivetime = livetime; } cBall::~cBall() { } int cBall::GetXpos() const { return itsXpos; } int cBall::GetYpos() const { return itsYpos; } int cBall::GetEnergie() const { return itsEnergie; } void cBall::SetXpos(int Xpos) { itsXpos = Xpos; } void cBall::SetYpos(int Ypos) { itsYpos = Ypos; } void cBall::SetEnergie(int Energie) { itsEnergie = Energie; }und möchte nun im Message Loop das die Y-Position mit der Energie erhöht wird,
was auch noch klappt, und dann soll die Energie steigen und mit Setenergie wieder in das Objekt ball1 geschrieben werden, damit beim nächsten aufruf von GetEnergie der höhere wert ausgelesen wird. u.s.w. u.s.f.LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HBITMAP hBitmap; static HINSTANCE hInstance; static HDC hdc,hdcmem; static PAINTSTRUCT ps; static cBall ball1(12); ball1.SetXpos(250); ball1.SetYpos(30); ball1.SetEnergie(1); static int cy=10; static int ce=1; switch (message) /* handle the messages */ { case WM_CREATE: hInstance = ((LPCREATESTRUCT) lParam)->hInstance; hBitmap = LoadBitmap (hInstance, "BALLBMP"); break; case WM_PAINT: ce=ball1.GetEnergie(); cy=cy+ce; // Klappt noch prima ball1.SetYpos(cy); ce=ce+1; // scheind nicht zu funktionieren ball1.SetEnergie(ce); // oder aber das zurückschreiben funzt nicht hdc = BeginPaint (hwnd, &ps); hdcmem = CreateCompatibleDC (hdc); SelectObject (hdcmem, hBitmap); BitBlt (hdc, ball1.GetXpos(),ball1.GetYpos(),32,32,hdcmem,0,0,SRCCOPY); DeleteDC (hdcmem); EndPaint (hwnd, &ps); return 0; case WM_TIMER: RECT test; test.left = 0; test.top = 0; test.right =500; test.bottom =500; InvalidateRect(hwnd,&test,false); break; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ DeleteObject (hBitmap); break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }Demnach müßte die Y-Position immer schneller steigen.
Warum tut sie daß nicht?Ich binn fast sicher es ist wieder irgend was supersimples!

-
Hä

Ich sehe da nicht durch bei deinem Code.Wo ist denn der Zusammenhang zwischen cBall::istEnergie und cBall::itsYpos?
Außerdem hat in der Deklaration von cClass::SetEnergie der Parameter einen anderen Namen als in der Definition. Das ist zwar nicht verboten, aber verwirrend.
-
Beim abarbeiten von WM_PAINT wird zuerst cy mit GetYpos gefüllt.
Dann wird ce mit GetEnergie gefüllt. Dann wird zu cy ce hinzugezählt.
Und dann cy mit SetYpos wieder ins Objekt geschrieben.
Dann wird ce erhöht und mit SetEnergie wieder ins Objekt geschrieben.Ich find das nicht verwirrend

-
Jetzt hab ich grad noch was gemerkt.

ich hab cy garnicht aus dem Objekt gelesen sondern nur zurückgeschrieben.
wenn ich cy mit GetYpos auslese geht garnix!
-
Schon mal darüber nachgedacht, dass du am Beginn deiner Nachrichtenfunktion Folgendes machst
ball1.SetXpos(250); ball1.SetYpos(30); ball1.SetEnergie(1);Da kann ja nichts kontinuierlich steigen.
-
Tja... jetzt wo dus sagst (is ja fast schon peinlich :p )
Aber ich geh mal davon aus daß ich daß object ball1 auch woanders erzeugen sollte ... Richtig???
-
Nunja, kommt drauf an. Ich kenne deine Anwendung ja nicht, aber du kannst die Variable durchaus in der Funktion belassen. Du solltest dann aber die initialen Werte im ctor setzen.
-
irgendwie sollte man sowas auch nicht in WM_PAINT machen

das sollte nur zum zeichnen benutzt werden und nicht um irgendwelche variablen dort zu setzen.
-
O.K. ...
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HBITMAP hBitmap; static HINSTANCE hInstance; static HDC hdc,hdcmem; static PAINTSTRUCT ps; static cBall ball1(12); static int cy=10; static int ce=1; switch (message) /* handle the messages */ { case WM_CREATE: hInstance = ((LPCREATESTRUCT) lParam)->hInstance; hBitmap = LoadBitmap (hInstance, "BALLBMP"); break; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); hdcmem = CreateCompatibleDC (hdc); SelectObject (hdcmem, hBitmap); BitBlt (hdc, ball1.GetXpos(),ball1.GetYpos(),32,32,hdcmem,0,0,SRCCOPY); DeleteDC (hdcmem); EndPaint (hwnd, &ps); return 0; case WM_TIMER: //ball1.SetYpos(100); ce=ball1.GetEnergie(); cy=ball1.GetYpos(); cy=cy+ce; ball1.SetYpos(cy); ce=ce+0.1; ball1.SetEnergie(ce); RECT test; test.left = 0; test.top = 0; test.right =500; test.bottom =500; InvalidateRect(hwnd,&test,false); break; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ DeleteObject (hBitmap); break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }so Funktionierts auch.
Gibts da noch was zu verbessern?? bzw. is jetzt noch was da was grundsätzlich
schlechter C++ stil ist???