Bewegte Kugel abprallen lassen



  • Hi Leute,

    ich habe eine Kugel die sich bewegt. Möchte gerne, dass sie in einem Rechteck sich nur bewegt. Zu testzwecken habe ich mal ein Rechteck folgendermaßen in dr OnDraw erstellt:

    CRect m_rechteck(10,10,300,300);
    	mempDC->Rectangle(m_rechteck);
    

    Ist also 290*290 Pixel groß.
    Kommt die Kugel nach rechts, soll sie abprallen und nach Links fliegen.
    Das versuche ich wie folgt zu realisieren:

    if(m_pos_x > m_rechteck.right)
    		m_xwert = m_xwert * (-1);
    

    Leider geht das nicht.
    m_rechteckt leite ich von CRect ab.
    Immer wenn ich das Programm nun starte, geht dieser circa 2 pixel nach rechts und wieder 2 pixel nach links.

    Es liegt hunterprozentig an m_Rechteck.right.
    Denn mit cr.right geht es.
    Nur das ich ja in dem Rechteck bleiben will und nichts den Client-Bereich.
    Hoffe auf Hilfe. Danke.



  • Da es sich ja offensichtlich um einen Logikfehler handelt, sollten wir etwas mehr über die Positionsberechnung erfahren.



  • Ok, die Position wird wie folgt berechnet.

    Im Kontruktor steht folgendes:

    m_start = GetTickCount();	//Zeit seit Programstart
    

    Mittels

    SetTimer(1,100,NULL);
    

    In einer eigenen Funktion welche auf Knopfdruck ausgeführt wird, wird der Timer gesetzt.

    Das steht in OnTimer:

    DWORD ticks = GetTickCount();
    	delta_t = ticks - m_start;
    	m_start = ticks;
    	//Berechnungen mit delta_t
    
    	m_pos_x = m_pos_x + (m_xwert * delta_t)/1000;
    	m_pos_y = m_pos_y + (m_ywert * delta_t)/1000;
           	Invalidate();
    

    Dort soll auch der Algorithmus für das abprallen stehen.
    Am Ende wird der Timer in der Destroy Methode wieder zerstört.
    Allerdings wird die Position meiner Meinung nach korrekt berechnet. 👍



  • Und m_pos* sind die Koordinaten der linken oberen Ecke des Objekts?



  • Decimad schrieb:

    Und m_pos* sind die Koordinaten der linken oberen Ecke des Objekts?

    Ich glaube daran liegt es m_pos_x gibt als Ergebnis ziemlichen Mist aus.
    0 und -1587852364 eine sehr lange Zahl.
    Habe die nämlich mal ausgeben lassen.
    Deswegen geht die Kugel wohl auch nach rechts und sofort wieder nach links.



  • Keiner mehr nen Tipp wo der Fehler sein könnte?



  • Zerlege alle rechnungen so, dass du alle Zwischenergebnisse im Debugger betrachten kannst und siehst, wo der Rechenfehler beginnt!
    Ich sehe halt keine offensichtliche Fehlerquelle dort, tut mir Leid.



  • Hallo,

    soweit ich gelesen habe, gibt es die Funktion "right" bei CRect nicht.
    Stattdessen gibt es diese Funktion(VC++6):

    CPoint& CRect::BottomRight( );

    Vielleicht ist das die Lösung.



  • AndiE schrieb:

    soweit ich gelesen habe, gibt es die Funktion "right" bei CRect nicht.

    WAS? "Funktion"? "Right" ist eine VARIABLE!

    AndiE schrieb:

    Stattdessen gibt es diese Funktion(VC++6):

    CPoint& CRect::BottomRight( );

    Was soll er damit?

    Autor: Du musst schon mehr Informationen liefern, ansonsten kann dir niemand helfen ... das Umdrehen einer Bewegungsrichtung stelle ich mir recht leicht vor, vielleicht zeigst du uns einfach mal ausgesuchten oder seperat verlinkten Quelltext, hier kannst du hochladen ohne jemanden mit 3 Seiten Text zu nerven


Anmelden zum Antworten