QPalette - Farberkennung

Alles rund um die Programmierung mit Qt
Antworten
whit3
Beiträge: 42
Registriert: 1. Februar 2010 09:55

QPalette - Farberkennung

Beitrag von whit3 »

Hallo,
ich habe eine QPalette und will auf dieser eine bestimmte Farbe erkennen (grün).

Wie geht das mit QT?
Gibt es überhaupt eine Möglichkeit dies plattformunabhängig zu programmieren?
Stellt QT da gewisse Funktionen zur Verfügung?

Code: Alles auswählen

int xtest = 31, ytest = 12;
QPixmap pixmaptest(1,1);
BitBlt( &pixmaptest, 0, 0, palette, xtest, ytest, 1, 1 ); //palette -> QPalette
QRgb color = pixmaptest.toImage().pixel( 0,0 );
Allerdings krieg ich dann diese Fehlermeldung:
error: cannot convert 'QPixmap*' to 'HDC__*' for argument '1' to 'BOOL BitBlt(HDC__*, int, int, int, int, HDC__*, int, int, DWORD)'
Steh voll aufm Schlauch^^ :oops:
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Die Fehlermeldung hat ja mal absolut gar nix mit Qt zu tun. Du kannst nicht einfach ein QPixmap* übergeben, wo ein HDC__* erwartet wird.
Und was hat das eigentlich mit QPalette zu tun?
Um zu erkennen, ob eine QColor als grün oder blau bezeichnet werden kann, gibt es red(), green(), blue(), die du vergleichen und entsprechend deinen Kriterien als "Grün" usw. erkennen kannst.
whit3
Beiträge: 42
Registriert: 1. Februar 2010 09:55

Beitrag von whit3 »

franzf hat geschrieben:Die Fehlermeldung hat ja mal absolut gar nix mit Qt zu tun. Du kannst nicht einfach ein QPixmap* übergeben, wo ein HDC__* erwartet wird.
Und was hat das eigentlich mit QPalette zu tun?
Um zu erkennen, ob eine QColor als grün oder blau bezeichnet werden kann, gibt es red(), green(), blue(), die du vergleichen und entsprechend deinen Kriterien als "Grün" usw. erkennen kannst.
hm oke..
das problem ist folgendes : ich setze mit QPalette ein Hintergrundbild (jpg).
Dann will ich mittels x,y prüfen ob an der Stelle in dem Bild (QPalette) grün ist.

Dient als Kollisionserkennung für ein Spiel
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich werd immer noch nicht schlau...
*) ist BitBlt deine eigene Funktion?
*) Warum setzt du komplett andere Werte als in der Deklaration (jedenfalls in der Fehlermelsung) angegeben?

*) Soll das Pixmap als BackgrounRole in die Palette wandern oder
*) soll aus der Palette ein BackgroundRole extrahiert und ins Bitmap gesetzt werden?

*) Was hat das alles mit CollisionDetection zu tun?

Und am wichtigsten:
*) Was ist deine eigentlich Frage/Problem?
whit3
Beiträge: 42
Registriert: 1. Februar 2010 09:55

Beitrag von whit3 »

franzf hat geschrieben:Ich werd immer noch nicht schlau...
*) ist BitBlt deine eigene Funktion?
*) Warum setzt du komplett andere Werte als in der Deklaration (jedenfalls in der Fehlermelsung) angegeben?

*) Soll das Pixmap als BackgrounRole in die Palette wandern oder
*) soll aus der Palette ein BackgroundRole extrahiert und ins Bitmap gesetzt werden?

*) Was hat das alles mit CollisionDetection zu tun?

Und am wichtigsten:
*) Was ist deine eigentlich Frage/Problem?

Code: Alles auswählen

spiel::spiel (QWidget * w = 0):QDialog(w)
{  
    s = new schiff(this);
    s->show();
    s->set_life(80);
    myTimerId = startTimer(15);
    setAutoFillBackground(true);
    palette.setBrush(QPalette::Window, QBrush(QPixmap(statEnv+"lvl1.jpg")));
    this->setPalette(palette);
    anzeige = new QLabel(this);
    //set_anzeige("Game start ",true);
    anzeige->setStyleSheet("QLabel{background-color: white; color: black;font-size: 20px;}");
    anzeige->setFixedWidth(1024);
    anzeige->move(0,0);
    anzeige->show();
}

void spiel::timerEvent(QTimerEvent * event)
{
   QPixmap t = QPixmap::grabWindow(this->winId(), s->get_x(), s->get_y(), 1, 1);
   QRgb color = t.toImage().pixel( 0,0 );
   if(color == 4278255361)
      s->set_collision(true);

   if (event->timerId() == myTimerId)
   {       
       if( (s->tastenbuffer[0] == false) &&
           (s->tastenbuffer[1] == false) &&
           (s->get_status()    == true ) &&
           (s->get_ufoGif() != statEnv + "ufo.gif") )
       {
            s->set_ufoGif(0);
       }
   }
   else
   {
      QWidget::timerEvent(event);
   }
   s->bewege();

Es handelt sich um ein Spiel (lander) wo mittels Pfeiltasten ein Ufo navigiert wird.
Bild

Falls das UFO auf das grüne Feld gelangt soll es explodieren.
das funktioniert auch jetzt soweit mittels dieser Überprüfung:

Code: Alles auswählen

 QPixmap t = QPixmap::grabWindow(this->winId(), s->get_x(), s->get_y(), 1, 1);
   QRgb color = t.toImage().pixel( 0,0 );
   if(color == 4278255361)
      s->set_collision(true);
Gibt es eine Möglichkeit über diese grüne Fläche (rot sind die Landeflächen) eine Textur zu legen und trotzdem die grüne Farbe ausgelesen werden kann?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Das ist ja brutal inperformant :/ Für die CollisionDetection einen Screenshot nehmen, dort ein einziges (!) Pixel rausnehmen, die Farbe untersuchen...
Und nein, wenn du über einen Screenshot arbeitest, kannst du keine andere Textur drüber malen.

Schau dir doch mal QGraphicsView an. Für den Hintergrund würd ich kein Pixmap nehmen, sondern ein QGraphicsPolygonItem. Das Polygon kannst du dir ja durch (gesteuerte) Zufallswerte generieren lassen.
Dann bekommst du nämlich eine Collision Dection gratis, die um einiges besser sein dürfte als deine :)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das wurde ihm schon mal vorgeschlagen. Will er ja nicht.
whit3
Beiträge: 42
Registriert: 1. Februar 2010 09:55

Beitrag von whit3 »

Über ein winziges Beispiel würde ich mich sehr freuen...
ich habe mir das schon mal angeguckt aber wusste nicht wie ich das machen sollte...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

whit3 hat geschrieben:Über ein winziges Beispiel würde ich mich sehr freuen...
ich habe mir das schon mal angeguckt aber wusste nicht wie ich das machen sollte...
Wenn du Beispielcode suchst, wirst du in 95% der Fälle in den Qt Examples/Demos fündig. So auch hier.
-> Colliding Mice Example
Antworten