Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 20:47

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Sep 08, 2006 10:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
hi Leute,
Hab mich an das gleichnamige Tutorial gehalten, und versuche ne Selktion im Ortho-Modus hinzubekommen.
Leider kommen nur werte von zB- "-125603629" bzw "3274589" raus. Definiert ist aber nur bis 18.

befinden tu ich mich mit folgender Anweisung darin:
Code:
  1.  
  2. {...}
  3.   glOrtho(0, OwnerForm^.ClientWidth, OwnerForm^.ClientHeight, 0, -2, 2);
  4. {...}


und zuvor wurde auch
Code:
  1.  
  2.   glInitNames;
  3.   glPushName(0);
  4.  

angegeben.

Namens"Vergabe" erfolgt dann zB hier:
Code:
  1. procedure TKonfig_Menu.DrawPfeilBtn( index : integer; BlendValue : single );
  2. begin
  3.   glEnable(gl_blend);
  4.   TextureManager.BindTexture('Pfeilbtn');
  5.   case index of
  6.     0: glLoadName( cOSSpeakerLeft );
  7.     1: glLoadName( cOSBalanceLeft );
  8.     2: glLoadName( cOSMusicLeft );
  9.     3: glLoadName( cOSSoundLeft );
  10.     4: glLoadName( cOSScreenLeft );
  11.     5: glLoadName( cOSColorLeft );
  12.     6: glLoadName( cOSSpielModusLeft );
  13.     7: glLoadName( cOSTimeModusLeft );
  14.   end;
  15.   glColor4f( 1,1,1, BlendValue * SokobanGame.KonfigBlend );
  16.   glBegin(GL_Quads);                                                // Linker Pfeil zum verstellen
  17.     glTexCoord2f(1,1); glVertex3f( ThisRect.Left + 1.8*RingWidth - PfeilBtnWidth, TextRects[index].Top + 3*Screen.Height/768, 0);  // OL
  18.     glTexCoord2f(0,1); glVertex3f( ThisRect.Left + 1.8*RingWidth                , TextRects[index].Top + 3*Screen.Height/768, 0);  // OR
  19.     glTexCoord2f(0,0); glVertex3f( ThisRect.Left + 1.8*RingWidth                , TextRects[index].Bottom, 0); // UR
  20.     glTexCoord2f(1,0); glVertex3F( ThisRect.left + 1.8*RingWidth - PfeilBtnWidth, TextRects[index].Bottom, 0); // UL
  21.   glEnd;
  22.  
  23.   case index of
  24.     0: glLoadName( cOSSpeakerRight );
  25.     1: glLoadName( cOSBalanceRight );
  26.     2: glLoadName( cOSMusicRight );
  27.     3: glLoadName( cOSSoundRight );
  28.     4: glLoadName( cOSScreenRight );
  29.     5: glLoadName( cOSColorRight );
  30.     6: glLoadName( cOSSpielModusRight );
  31.     7: glLoadName( cOSTimeModusRight );
  32.   end;
  33.   glColor4f( 1,1,1, BlendValue * SokobanGame.KonfigBlend );
  34.   glBegin(GL_Quads);                                               // rechter Pfeil zum verstellen
  35.     glTexCoord2f(0,1); glVertex3f( ThisRect.Right - 1.56*RingWidth - PfeilBtnWidth, TextRects[index].Top + 3*Screen.Height/768, 0);  // OL
  36.     glTexCoord2f(1,1); glVertex3f( ThisRect.Right - 1.56*RingWidth                , TextRects[index].Top + 3*Screen.Height/768, 0);  // OR
  37.     glTexCoord2f(1,0); glVertex3f( ThisRect.Right - 1.56*RingWidth                , TextRects[index].Bottom, 0); // UR
  38.     glTexCoord2f(0,0); glVertex3F( ThisRect.Right - 1.56*RingWidth - PfeilBtnWidth, TextRects[index].Bottom, 0); // UL
  39.   glEnd;
  40.   glDisable(gl_blend);
  41. end;
  42.  


und diese Funktion (aus dem WIKI) soll's dann auflösen wenn mit der Maus geklickt wurde.
Code:
  1. function OSselection( xs, ys : integer) : integer;
  2. var
  3.   Puffer       : array[0..256] of GLUInt;
  4.   Viewport     : TGLVectori4;
  5.   Treffer,i    : Integer;
  6.   Z_Wert       : GLUInt;
  7.   Getroffen    : GLUInt;
  8. begin
  9.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  10.   glSelectBuffer(256, @Puffer);               //Den Puffer zuordnen
  11.  
  12.   glMatrixMode(GL_PROJECTION);                //In den Projektionsmodus
  13.   glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  14.   glPushMatrix;                               //Um unsere Matrix zu sichern
  15.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  16.  
  17.   gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, Viewport);  //100.0, 100.0, viewport);
  18.   glOrtho(0, SokobanGame.OwnerForm^.ClientWidth, SokobanGame.OwnerForm^.ClientHeight, 0, -2, 2);
  19.   SokobanGame.DrawSelectedScene;              //Die Szene zeichnen
  20.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  21.   glPopMatrix;                                //und unsere alte Matrix wiederherzustellen
  22.  
  23.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  24.  
  25.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  26.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  27.   for i := 0 to Treffer-1 do
  28.     if Puffer[(i*4)+1] < Z_Wert then
  29.     begin
  30.       getroffen := Puffer[(i*4)+3];
  31.       Z_Wert    := Puffer[(i*4)+1];
  32.     end;
  33.  
  34.   if getroffen=High(GLUInt)
  35.     then Result := -1
  36.     else Result := getroffen;
  37. end;
  38.  


Nur find ich leider keinen Fehler :oops:

:?: Jemand ne Idee, wie ich diese :idea: nun zum leuchten bringen kann ?

Gruß Uwe

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 08, 2006 11:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Im Othomodus benutzt man am besten nicht die GL-Selection. ;)

Einfachste Methode: Mach den Viewport so groß wie dein Fenster (ClientWidth/ClientHeight) dann kannst du die Mauskoordinaten mit deinen Objektpositionen vergleichen und leicht bestimmen was getroffen wurde - pixelgenau.

Dieses Verfahren wird eigentlich von so ziemlich jedem Benutzt der GUI Komponenten mit OGL schreibt. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 08, 2006 11:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
hi Flash,

Du meinst also sowas wie ich auch im OmouseDown des Formulars abfangen könnte ?
Da es sich im ein dreieckiges "Dings" handelt, wollt ich schon einen dreieeckigen "Bereich" haben,
der dann für die entsprechende Reaktion vorgesehen ist.
Die Koordinaten sind kein Problem, die kann ich während der Laufzeiz bekommen,(schliesslich muss ich
es ja auch zur Laufzeit positionieren, siehe Namens-Vergabe im Beitrag )

Na da wird ja die OnMouseDown langsam seeehr groß als if then ...Abfrage

Gruß Uwe

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 08, 2006 12:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Da kommt auch eh noch ein anderes Problem hinzu und zwar, dass wärend der Selektion alle Texturen ignoriert werden und damit arbeitet sie wieder auf Flächenbasis. Deinen Pfeil renderst du auch als Fläche nur wird durch das Blending einige Teile nicht mit gezeichnet. Bei der Selektion werden aber wiederrum die ganzen Quads berücksichtigt. Somit würdest du auch nur die Vierecke selektieren.

So gesehen entdecke ich in dem Code jetzt aber keine große Schwäche. Aber bei der Selektion genügt schon die kleinste Ungereimtheit um den Code aus dem Tritt zu bringen. Und das wichtigste. Das Zeichnen und das Selektieren müssen 100%tig identisch sein. Besonders auch die intialisierung etc. Interssant wäre an der Stelle noch was du in der Methode "DrawSelectedScene" machst.

Zitat:
Na da wird ja die OnMouseDown langsam seeehr groß als if then ...Abfrage

Dafür wurde ja die wunderbare Objekt Orientierte Programmierung erfunden. Es wäre doch Schade, wenn sie ungenutzt bleiben würde, oder? Falls du das Gefühl hast das war ein wink mit dem Zaunspfahl. Dein Gefühl täuscht dich nicht. :twisted:

Spaß bei Seite. Wenn du das ein oder andere sinnvoll in Objekte kappselst lässt es sich sehr einfach erweitern und der Code bleibt sauber und klar Strukturiert. Man kann es natürlich immer auch übertreiben. Aber es gibt auch einen sinnvollen mittelweg.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 08, 2006 12:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
hi Loss eX,

ja, ja die gute OOP. Ich muss mal schauen ob ich da was als WM_Event abfrage reinbekomme.
Die "Pfeile" selbst sind bisher keine Objecte, sondern einfach nur so dahingepinselt.

DrawselectedScene verzweigt nur über case in den Renderteil der aktiven Szene (Menü / Neue Game etc ) und rendert diese.

glOrtho und Selektion hab ich nun schon abgeschrieben, soviel ist schon mal klar.

Wie ich das nun löse ?, werd mal die Framerate im Auge behalten und ganz einfach das OnMouseDown des Forms
im Auge behalten. Ich denke mal 18 Quad-flächen zu berücksichtigen (liegen dann als array[0..17]of TRect vor),
lässt mich dann noch zuversichtlich erscheinen.

Wenn nicht, na dann mach ich da objecte draus, und hab dann ne eigene OnMouseMove bzw OnMousClick
wo ich mich dann "austoben" kann :?

Danke für EURE Hilfe und Hinweise
Gruß und ein schönes WE
Uwe

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 08, 2006 12:37 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wegen den Pfeilen und den Weggeblendeten Teilen.
Was passiert denn wenn man den Alphatest benutzt, und dann versucht die transparenten Teile des Pfeils zu treffen. Wurde die Selektion den Pfeil zurück liefern, oder geht das "durch"?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 08, 2006 12:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
keine Veränderung, es funzt einfach net.

kleines PS:
definiertes "0" als Rückgabe hab ich schonmal erreicht, aber mehr nicht.
(habe
glInitNames;
glPushName(0);
an anderer Stelle im Source positioniert )

ich bastel mir eine Procedure ins Object rein, ist das einfachste :lol:

Danke Uwe

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 08, 2006 13:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie gesagt. Bei der Selektion ist jede noch so winzige Kleinigkeit wichtig. Und man sieht es leider nicht wenn irgendwo ein Fehler ist. Das ist leider alles nur ein einziges raten.

Aber um die Geschwindigkeit würde ich mir bei 18 Rects mal keine Gedanken machen. Dank des inteligenten Kompilers ist so etwas alles kein Thema.

Für mich als ein absoluter Verfechter von OOP ist das gesamte Menü ein Vorzeigefall für Objekte. Denn als Objekte mit einer entsprechenden Struktur würdest du das Menp zu Begin ein Mal definieren und erstellen und der Rest würde sich dann mehr oder weniger Selbst verwalten. Und bei Änderungen an der Menüstruktur bräuchtest du lediglich einen Eintrag Löschen/Ändern oder Erstellen und schon wärs erledigt.

Aber wie ich oben schon gesagt hatte. Es muss ja nicht immer das volle Programm sein. ;-) Eine recht einfache Sache wäre zum Beispiel, dass du dein Array of TRect in ein Array mit Records verwandelst. Das Record würde neben dem TRect dann noch ein TNotifyEvent beinhalten. Diesem kannst du dann Methoden zuweisen. Genau wie einem TButton.OnClick. Und in der MouseClick würdest du dann durch das Array gehen und dir den entsprechenden Eintrag raussuchen und das Event aufrufen. Und so müsste diese Methode schon nicht mehr wissen worum es sich handelt. Das aber nur eine kleine Anregung für den Fall, dass die Selektion sich weiterhin weigert.

Flash: Bei meinen alten Komponenten (die ohne eigenen Inhalte) habe ich vor dem Zeichnen noch ein Stück Code ausgeführt der mir die Selektion vereinffacht hat. Ich hoffe das beantwortet deine Frage. ;-)
Code:
  1.   glEnable(GL_ALPHA_TEST);
  2.   glColor4f(1, 1, 1, 0);
  3.   glBegin(GL_QUADS);
  4.     ...
  5.   glEnd;

Obwohl man nichts sieht hat er die entsprechenden Bereich dennoch immer mit ausgewählt.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]