Klick auf bestimmtes Objekt



  • Hallo,
    erstmal Grundlegendes:
    Ich programmiere mit SDL2 und VisualStudio2017 und natürlich c++.

    Zu meinem Problem, ich habe jetzt eine "unförmige" Form, z.B. ein Land (total verzackt) als .gif file mit transparentem Hintergrund und ich will erkennen, wann auf dieses Land geklickt wird. Die Position ermitteln und manuell überprüfen, ob sie im Land liegt, geht nach meinen Kenntnissen hier nur sehr ungenau, das das Land nicht rechteckig ist...
    Gibt es eine Möglichkeit zu überprüfen auf welche "Farbe" geklickt wurde, bzw. geht das irgendwie anders?

    Hoffentlich kann mir jemand helfen, denn ich habe keine Lust dieses Land in Rechtecke oder so zu unterteilen ._.

    Mfg
    Boss



  • BOSS2000 schrieb:

    ich habe keine Lust dieses Land in Rechtecke oder so zu unterteilen

    Das Ding ist bereits in Rechtecke unterteilt. Nennen sich Pixel.



  • Caligulaminus schrieb:

    BOSS2000 schrieb:

    ich habe keine Lust dieses Land in Rechtecke oder so zu unterteilen

    Das Ding ist bereits in Rechtecke unterteilt. Nennen sich Pixel.

    Ach was! Du kennst dich ja voll aus!!!

    Ganz ehrlich, ich glaub jeder weiß was gemeint ist. Wenn du nix sinnvolles weißt, dann lass doch einfach sein!

    Aber wenn ich mir deine anderen Beiträge anschau, hast du einfach keine Ahnung von irgendwas...



  • BOSS2000 schrieb:

    lass doch einfach sein!

    Geht klar, Boss.


  • Mod

    wenn ich kurz danach 'google', finde ich zum Pixelfarbeauslesen:
    http://sdl.beuc.net/sdl.wiki/Pixel_Access



  • Okey, vielen Dank schonmal für die Antwort 🙂

    Ich versuchs jetzt schon den ganzen Tag, aber ich bekomm das einfach nicht hin, und Goolge hilft mir grad irgendwie auch nicht weiter...
    Wie genau muss ich das anwenden 😕



  • BOSS2000 schrieb:

    Ich versuchs jetzt schon den ganzen Tag, aber ich bekomm das einfach nicht hin, und Goolge hilft mir grad irgendwie auch nicht weiter...
    Wie genau muss ich das anwenden 😕

    Sorry, spoonfeeding not available here.



  • BOSS2000 schrieb:

    [...] denn ich habe keine Lust dieses Land in Rechtecke oder so zu unterteilen ._.

    BOSS2000 schrieb:

    Ach was! Du kennst dich ja voll aus!!!

    Ganz ehrlich, ich glaub jeder weiß was gemeint ist. Wenn du nix sinnvolles weißt, dann lass doch einfach sein!

    Anscheinend weiß wirklich jeder was gemeint ist, nur du selbst nicht.
    Ich weiß zwar was sinnvolles, aber ich lasse es trotzdem sein ¯\(ツ)

    https://wiki.libsdl.org/SDL_MouseButtonEvent


  • Mod

    BOSS2000 schrieb:

    Okey, vielen Dank schonmal für die Antwort 🙂

    Ich versuchs jetzt schon den ganzen Tag, aber ich bekomm das einfach nicht hin, und Goolge hilft mir grad irgendwie auch nicht weiter...
    Wie genau muss ich das anwenden 😕

    Zeig mal deinen code, ohne zu sehen wie du es versuchst und ohne beschreibung woran du scheiterst, koennen wir dir kaum helfen.



  • Naja.. um die Farbe zu bekommen, das sind ja nur ein paar Zeilen, glaub ich. Die x und y Koordinaten des Pixels hab ich ja und anhand von denen muss ich jetzt die Farbe am besten im RGB Format ermitteln:

    void Game::run() {
    	running = true;
    	while (running) {
    
    		SDL_RenderClear(renderer);
    		SDL_Event event;
    		while (SDL_PollEvent(&event)){
    			switch (event.type){
    			case SDL_QUIT:
    				running = false;
    				break;
    			case SDL_KEYDOWN:
    				switch (event.key.keysym.sym) {
    				case SDLK_ESCAPE:
    					running = false;
    					break;
    				}
    				break;
    			case SDL_MOUSEBUTTONDOWN:
    				switch (event.button.button) {
    				case SDL_BUTTON_LEFT:
    					int xg;
    					int yg;
    					SDL_GetMouseState(&xg, &yg);
    
    					// hier muss die Farbe ermittelt werden
    					break;
    				}
    			}
    		}
    		background->Draw(0, 0, high, width);
    		updateStates();
    
    		SDL_RenderPresent(renderer);
    	}
    

    Versucht hab ich alles mögliche mit SDL_PixelFormat und so...

    Ich hab im Internet mal das hier gefunden:

    Bitmap myBitmap = new Bitmap("Grapes.jpg");
      Color pixelColor = myBitmap.GetPixel(50, 50);
    

    Das sieht für mich ganz verständlich aus, aber Bitmap wird nicht erkannt, muss ich da ne extra Bibliothek implementieren?


  • Mod

    hast du versucht in zeile 26 die getpixel funktion aus meinem link einzubauen?



  • @BOSS2000: Dein Code aus dem Internet ist C# (Bitmap ist eine Klasse aus dem .NET-Framework) - das sieht man auch daran, daß der Zugriff auf die Methode mittels '.' und nicht '->' erfolgt.



  • Ne, bei dem Code den ich gesendet hab war das eine andere Funktion, hat aber nicht funktioniert...

    Bei deiner Funktion stürzt das Programm ab, was ist Uint32 für ein Rückgabetyp, also besser gesagt, als was speicher ich das, und wie kann ich das dann weiterverwenden?



  • Habs gelöst mit der Windows.h

    Die getPixel Funktion sieht jetzt folgendermaßen aus:

    int Game::getPixel(SDL_Surface *surface, int x, int y)
    {
    	HDC dc = GetDC(0);
    
    	COLORREF c = GetPixel(dc, x, y);
    	int r = GetRValue(c);
    	int g = GetGValue(c);
    	int b = GetBValue(c);
    
    	ReleaseDC(0, dc);
    
    	return r;
    }
    

    Es wird hier jetzt diret der "Rot-wert" zurückgegeben, ich änder das später noch ab, dass das direkt im Speicherplatz gespeichert wird 😋

    Ich bedanke mich trotzdem bei allen die mir geholfen haben!!! Vielen Dank 👍

    Grüße Boss

    EDIT:
    Funktioniert doch noch nicht so ganz.. es werden falsche Werte zurückgegeben, besonders häufig 255,255,255 und 0,0,0 und - warum auch immer - 45,45,48 😕 Jedoch nicht vollkommen zufällig, wenn ich z.B. 2 mal auf die selbe Stelle klicke kommt auch 2 mal das selbe Ergebnis, wenn ich das Programm aber neu öffne und nochmal auf diese Stelle klicke kommt wieder was völlig anderes. Oder auch wenn ich z.B. links vom Bild auf eine Farbe drücke kommt etwas anderes, als wenn ich rechts vom Bild auf eine Fläche drücke, die laut Bildbearbeitungsprogramm genau die gleiche Farbe habe 😡
    Liegt das vielleich am Format, oder mach ich was mit dem Speicher falsch? Vllt liegt es auch daran, dass ich mehrere Bilder mit transparentem Hintergrund übereinander gerendert hab und das transparente mach Probleme?
    Hoffentlich kann mir nochmal jmd helfen 😃

    Hier mal mein aktueller Code:

    #include "Game.h"
    #include "windows.h"
    
    #include <SDL2\SDL.h>
    #include <iostream>
    
    //......//
    
    void Game::run() {
    	running = true;
    	while (running) {
    
    		SDL_Event event;
    		while (SDL_PollEvent(&event)){
    			switch (event.type){
    			case SDL_QUIT:
    				running = false;
    				break;
    			case SDL_KEYDOWN:
    				switch (event.key.keysym.sym) {
    				case SDLK_ESCAPE:
    					running = false;
    					break;
    				}
    				break;
    			case SDL_MOUSEBUTTONDOWN:
    				switch (event.button.button) {
    				case SDL_BUTTON_LEFT:
    					int xm, ym;
    					SDL_GetMouseState(&xm, &ym);
    
    					int r, g, b;
    					r = g = b = 0;
    					getPixel(xm, ym, &r, &g, &b);
    
    					std::cout << r << ", " << g << ", " << b << endl;
    				}
    			}
    		}
    	}
    
    	// shutdown SDL
    	SDL_Quit();
    }
    
    void Game::initStates()[
    //.......//
    }
    void Game::getPixel(int x, int y, int* r, int* g, int* b) {
    	HDC dc = GetDC(0);
    
    	COLORREF c = GetPixel(dc, x, y);
    	*r = GetRValue(c);
    	*g = GetGValue(c);
    	*b = GetBValue(c);
    
    	ReleaseDC(0, dc);
    }
    


  • Hab das Problem gefunden, und zwar nimmt er wahrscheinlich nicht die Farben aus dem Spiel, sondern die aus dem Fenster, das dahinter geöffnet ist, deshalb auch immer die gleichen Farbwerte, weil meine IDE eben diese Farben hat..
    Wenn ich es z.B. vom Desktop aus öffne, bekomm ich eben die Farben vom Desktop

    Nur wie kann ich das beheben? Wird mein Spielfenster nicht erkannt oder einfach ignoriert oder wie 😕



  • Ohne mich mit SDL auszukennen, habe ich mal 'ne Runde gegoogelt und siehe da:

    https://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlgetrgb.html

    Dein GetDC() kommt doch nicht von sdl sondern direkt von OpenGL, oder?
    Und was für ein Device Context soll für GetDC(0) zurück gegeben werden?



  • Rufe einfach die von rapso verlinkte Funktion mit SDL_GetVideoSurface auf.

    GetDC ist eine WinAPI-Funktion und mit 0 als Parameter wird der Desktop angesprochen.

    PS: @Schlangenmensch, für deine Funktion muß aber ersteinmal der Pixel ausgelesen werden (dies ist nur eine Hilfsfunktion, um an die einzelnen R, G und B-Werte zu kommen).



  • Th69 schrieb:

    PS: @Schlangenmensch, für deine Funktion muß aber ersteinmal der Pixel ausgelesen werden (dies ist nur eine Hilfsfunktion, um an die einzelnen R, G und B-Werte zu kommen).

    Hm, ok. Ich war davon ausgegangen, dass er den Pixel durch den Mausklick hat. Danke für die Aufklärung 🙂



  • Schlangenmensch schrieb:

    Ohne mich mit SDL auszukennen, habe ich mal 'ne Runde gegoogelt und siehe da:

    https://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlgetrgb.html

    Dein GetDC() kommt doch nicht von sdl sondern direkt von OpenGL, oder?
    Und was für ein Device Context soll für GetDC(0) zurück gegeben werden?

    GetDC ist auch nicht von SDL sondern von der winAPI

    Th69 schrieb:

    GetDC ist eine WinAPI-Funktion und mit 0 als Parameter wird der Desktop angesprochen.

    Achso Ok, das wusste ich nicht, Danke 😃

    Th69 schrieb:

    Rufe einfach die von rapso verlinkte Funktion mit SDL_GetVideoSurface auf.

    Das werde ich mal versuchen, sobald ich am PC bin, danke schonmal 😉



  • Habs jetzt mal ausprobiert, aber SDL_GetVideoSurface gibt es bei mir nicht? Ich hab SDL2, vllt deshalb?


Anmelden zum Antworten