Problem bei GDI-TicTacToe



  • Hi Leute,

    ich übe mich derzeit an einem TicTacToe mit GDI programmiert. Von der Logik her klappt alles, nur mit den Mausklicks hackt es. Wenn ich auf ein Feld klicke, zeigt er manchmal bei dem links daneben ein Kreuz an, manchmal fühlt er sich gar nicht angesprochen. Ich kann den Fehler einfach nicht finden, wahrscheinlich ist es nur ein kleiner doofer... Könnt ihr ihn finden? Die relevanten Teile:

    //in der WndProc
    case WM_LBUTTONDOWN:
    	POINT p;
    	p.x = LOWORD(lParam); 
    	p.y = HIWORD(lParam);		
    	TTT.MouseClick(p);
    	InvalidateRect(hWnd, 0, true);
    	break;
    
    // TTT.MouseClick :
    // Er testet alle neun Rechtecke, ob sie den Punkt enthalten
    // Rechtecke sind in rField
    void MouseClick(POINT p)
    {		
    	for(int i = 1; i < 10; i++)
    	{			
    		if( Contains(rField[i], p)  )
    		{					
    			SetOnField(i, ActivePlayer);
    			break;
    		}
    	}
    }
    // TTT.Contains:
    // Testet ob sich der Punkt im Rechteck befindet:
    bool Contains(RECT r, POINT p)
    {
    	if((r.top < p.y) && (r.bottom > p.y) && (r.left < p.x) && (r.right > p.y))
    	{
    		return true;
    	}
    	return false;
    }
    

    Die restlichen Funktionen sind meiner Meinung nach unrelevant...

    Hoffe ihr könnt den Fehler finden!
    Vielen Dank.
    mfG TheCrip 🙂



  • ich hab mir letztens auch nen hittest geschrieben(anfänglich die gleiche schreibweise wie du), und bei mir hat es auch nicht geklappt.

    ich hab es dann so gelöst.

    ich hab zuerst gefragt ob der punkt innerhalb der linken oberen ecke ist. Ist das zutreffend, prüfe ich ob der punkt noch innerhalb der unteren rechten ecke ist. danach hat es einwandfrei geklappt. Auserdem ist mir aufgefallen das du bei r.right Y prüfst. es müste aber X sein. wenn ich das koordinatensystem richtig verstanden hab.

    if((r.top < p.y) && (r.left < p.x))
    {
    
        if((r.bottom > p.y) && (r.right > p.x))
        {
    
           return true;
        }
    }
    


  • Danke das war der kleine Fehler. Jetzt klappt es einwandfrei. Ich reg mich grad so auf. Aber danke 🙂



  • Du hast da einen Fehler:

    if((r.top < p.y) && (r.bottom > p.y) && (r.left < p.x) && (r.right > p.y))
    

    Wird zu:

    if((r.top < p.y) && (r.bottom > p.y) && (r.left < p.x) && (r.right > p.x))
    

Log in to reply