Seite 1 von 1
QPalette - Farberkennung
Verfasst: 24. Mai 2010 14:20
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^^

Verfasst: 24. Mai 2010 20:14
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.
Verfasst: 25. Mai 2010 09:35
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
Verfasst: 25. Mai 2010 11:57
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?
Verfasst: 25. Mai 2010 15:54
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.
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?
Verfasst: 25. Mai 2010 19:17
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

Verfasst: 25. Mai 2010 20:47
von upsala
Das wurde ihm schon mal vorgeschlagen. Will er ja nicht.
Verfasst: 26. Mai 2010 07:38
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...
Verfasst: 26. Mai 2010 11:38
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