Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Selectionstut befolgt und trotzdem fehler??? :D Hilfe :-)! (https://www.delphipraxis.net/129292-selectionstut-befolgt-und-trotzdem-fehler-d-hilfe.html)

Choice 16. Feb 2009 15:47


Selectionstut befolgt und trotzdem fehler??? :D Hilfe :-)!
 
Hi Leute :-)!
Also ich probiere grad noch ein wenig rum mit OpenGL, ein richtiges "Projekt"
traue ich mir noch nich zu, aber man is ja am lernen, am fummeln :-D
und ich möchte erstmal gerne die "Grundgeheimnisse" verstehen!^^

Ich hab das Tutorial auf der DGL Seite zum Thema Selection durchgelesen und es anstatt auf 3 Figuren nur auf eine
angewand... nur ja .. hmmm funzt nich :-D:-D:-D (also läuft alles aber egal ob man das Objekt nun anklickt oder irgendwas anderes zeigt er immer an -->"sie haben auf nichts geklickt" ^^... meine Vorstellung wäre sie haben auf Figur geklickt oda so :-) )

Und ich verstehe einfach nich wieso.. ich hoffe ihr könnt helfen :-)
hier ma der ganze Code (ka ob man das so macht aber ^^
ich hoffe ihr verzeiht mir das ich hier einfach mal alles hinklatsche!^^ (bin ja n Anfänger und so :-P)

mfg Choice :-)

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, dglOpenGL, glBitmap, ComCtrls;

type
TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure IdleHandler(Sender: TObject; var Done: Boolean);
    procedure FormResize(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Render;
  private   { Private-Deklarationen }
    StartTime, TimeCount, FrameCount : Cardinal; //FrameCounter
    Frames, DrawTime                 : Cardinal; //& Timebased Movement
    fTexture: TglBitmap2D; // Instanz unserer Textur
    procedure SetupGL;
    procedure ErrorHandler;
  public   { Public-Deklarationen }
    DC                               : HDC; //Handle auf Zeichenfläche
    RC                               : HGLRC;//Rendering Context
  end;

var
  Form1: TForm1;
  xs, ys: Integer;

const
  NearClipping = 1;
  FarClipping = 1000;
  Figur = 0;
  namen: array[-1..0] of string = ('nichts','Figur');

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  DC:= GetDC(Handle);
  if not InitOpenGL then Application.Terminate;
  RC:= CreateRenderingContext( DC,
                               [opDoubleBuffered],
                               32,
                               24,
                               0,0,0,
                               0);
  ActivateRenderingContext(DC, RC);
  {fTexture := TglBitmap2D.Create; // Instanz der Klasse erstellen
  fTexture.LoadFromFile('thelfer04.bmp'); // Datei laden
  fTexture.GenTexture; // geladene Textur an OpenGL übergeben }
  SetupGL;
end;

procedure TForm1.SetupGL;
begin
  glClearColor(0, 0, 0, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  glEnable(GL_DEPTH_TEST);         //Tiefentest aktivieren
  glEnable(GL_CULL_FACE);          //Backface Culling aktivieren
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeactivateRenderingContext;
  DestroyRenderingContext(RC);
  ReleaseDC(Handle, DC);
  fTexture.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
var tmpBool : Boolean;
begin
  glViewport(0, 0, ClientWidth, ClientHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);  
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  IdleHandler(Sender, tmpBool);
end;

function Selection : integer;
var
  Puffer      : array[0..256] of GLUInt;
  Viewport    : TGLVectori4;
  Treffer,i   : Integer;
  Z_Wert      : GLUInt;
  Getroffen   : GLUInt;
begin
  glGetIntegerv(GL_VIEWPORT, @viewport);     //Die Sicht speichern
  glSelectBuffer(256, @Puffer);              //Den Puffer zuordnen

  glMatrixMode(GL_PROJECTION);               //In den Projektionsmodus
  glRenderMode(GL_SELECT);                   //In den Selectionsmodus schalten
  glPushMatrix;                              //Um unsere Matrix zu sichern
  glLoadIdentity;                            //Und dieselbige wieder zurückzusetzen

  gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  gluPerspective(60.0, Viewport[2]/Viewport[3], 1, 256);
  glMatrixMode(GL_PROJECTION);               //Wieder in den Projektionsmodus
  glPopMatrix;                               //und unsere alte Matrix wiederherzustellen

  treffer := glRenderMode(GL_RENDER);        //Anzahl der Treffer auslesen

  Getroffen := High(GLUInt);                 //Höchsten möglichen Wert annehmen
  Z_Wert := High(GLUInt);                    //Höchsten Z - Wert
  for i := 0 to Treffer-1 do
    if Puffer[(i*4)+1] < Z_Wert then
    begin
      getroffen      := Puffer[(i*4)+3];
      Z_Wert := Puffer[(i*4)+1];
    end;

  if getroffen=High(GLUInt)
    then Result := -1
    else Result := getroffen;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  xs := x;
  ys := y;

  statusbar1.SimpleText := 'Sie haben auf ' + namen[selection] + ' geklickt!' + 'Maus koords x:'+inttostr(xs)+ 'Maus koords y:'+inttostr(ys);
end;

procedure TForm1.Render;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0, 0, -5);

glLoadName(Figur);
glBegin(GL_QUADS);
  glTexCoord2f(0,0); glVertex3f(-0.4,0.4,0); //lo
  glTexCoord2f(0,1); glVertex3f(-0.4,-0.4,0); //lu
  glTexCoord2f(1,1); glVertex3f(0.4,-0.4,0); //ru
  glTexCoord2f(1,0); glVertex3f(0.4,0.4,0);  //ro
glEnd;

  SwapBuffers(DC);
end;

procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
  StartTime:= GetTickCount;
  Render;
  DrawTime:= GetTickCount - StartTime;
  Inc(TimeCount, DrawTime);
  Inc(FrameCount);
 
  if TimeCount >= 1000 then begin
    Frames:= FrameCount;
    TimeCount:= TimeCount - 1000;
    FrameCount:= 0;
    Caption:= InttoStr(Frames) + 'FPS';
    ErrorHandler;
  end;
 
  Done:= false;
end;

procedure TForm1.ErrorHandler;
begin
  Form1.Caption := gluErrorString(glGetError);
end;
end.

nuclearping 16. Feb 2009 16:16

Re: Selectionstut befolgt und trotzdem fehler??? :D Hilfe :-
 
90% weniger Smileys wären auch eine Wahlmöglichkeit gewesen.

Cyf 16. Feb 2009 16:28

Re: Selectionstut befolgt und trotzdem fehler??? :D Hilfe :-
 
Außer das es imho besser wäre Fragen zu einem Tutorial auch im Forum der entsprechenden Seite zu stellen oder es hier zumindest zu verlinken.
Da du das Tutorial hier schon quasi hin kopiert hast, wieviel davon hast du bis jetzt verstanden und was hast du schon versucht um dein Problem zu lösen? Selection gibt ja offenbar wie du in deiner Ausgabe lesen kannst -1 zurück, d. h. entweder dein Objekt ist nicht auf dem Namestack registriert, oder es wird bei der Überprüfung nicht getroffen.

Choice 17. Feb 2009 15:29

Re: Selectionstut befolgt und trotzdem fehler??? :D Hilfe :-
 
Zitat:

Zitat von nuclearping
90% weniger Smileys wären auch eine Wahlmöglichkeit gewesen.

Was produktives wäre eine Wahlmöglichkeit gewesen. ... hilf mir, oder lass es einfach...


Zitat:

Zitat von Cyf
[...] wieviel davon hast du bis jetzt verstanden und was hast du schon versucht um dein Problem zu lösen?[...]

Ich habe alles verstanden, nur es funktioniert nicht.(Ich habe gehofft es findet einer zufällig einen Dreh oder einen Fehler den ich irgendwie übersehen habe, aber wenn hier mehr meine Art zu schreiben bemängelt wird als meine Fehler im Quelltext kann ich auch auf Beiträge verzichten) Is ja nich so das ich ein Delphi Einsteiger bin, ich taste mich nur grad na OpenGL an.. und natürlich habe ich schon versucht das Problemfeld einzugrenzen das sieht man ja wohl daran das ich mir zum Beispiel beim Klicken auch die Mauskoords anzeigen lasse, um zu sehen ob das funktioniert... Ich finde nur überhaupt keinen Fehler (alles erscheint plausibel das ist das Problem).

Frankfurtoder 17. Feb 2009 15:37

Re: Selectionstut befolgt und trotzdem fehler??? :D Hilfe :-
 
Zitat:

Zitat von Choice
ich hoffe ihr verzeiht mir das ich hier einfach mal alles hinklatsche!^^ (bin ja n Anfänger und so :-P)

So wird dir wohl kaum einer helfen können. Bzw. es gar nicht versuchen. Ich unterstütze zudem #2. Das hier ist kein Spielkreis.
Statt Code tags ruhig Delphi tags benutzen.

grüße

Phoenix 17. Feb 2009 15:41

Re: Selectionstut befolgt und trotzdem fehler??? :D Hilfe :-
 
Zitat:

Zitat von Frankfurtoder
So wird dir wohl kaum einer helfen können.

Das ist wohl leider auch nicht mehr nötig.
Ihr habt es soeben geschafft, ein komplett neues Mitglied mit Euren unkonstruktiven und unhöflichen Antworten hier dazu zu bewegen, seinen Account sofort wieder löschen zu lassen.

Man kann Neulinge auch um längen höflicher darauf hinweisen, dass übermäßiger Smiley-Gebrauch vom eigentlich Inhalt ablenkt und in normalen Fragestellungen idealerweise auf das nötigste Beschränkt werden sollte.

Vielen Dank :evil:

nuclearping 17. Feb 2009 16:43

Re: Selectionstut befolgt und trotzdem fehler??? :D Hilfe :-
 
Tut mir leid, aber was können wir dafür, wenn er mit Kritik nicht umgehen kann und seine eigenen Fehler nicht sieht? Andere Leute hätten wahrscheinlich darüber gelacht, die Smileys rauseditiert und sich nochmal Mühe bzgl. ihres Problems gegeben. Aber er hat sich dazu entschieden, es persönlich zu nehmen und seinen Account zu kündigen.
Wenn er hier als Newb reinplatzt, seinen ganzen Code hier "hinklatscht" und dann nach dem Motto "nun helft mir mal" Hilfe erwartet, darf er sich nicht wundern, wenn er damit gegen die Wand fährt.

Imho wars einfach die Situation "Wie es in den Wald hineinruft, schallt es auch wieder heraus."

Wenn das Tutorial funktioniert und sein Konstrukt (immernoch) nicht, an wem liegts dann wohl? An uns bestimmt nicht.

Gestern jemand "Wer wird Millionär" geguckt? Da war auch so'ne Situation: Frage -> Publikumsjoker -> Er hat die Antwort geglaubt -> War falsche Antwort. Wessen Verantwortung war das nun? Die vom Joker, weil er die falsche Antwort gegeben hat oder die vom Spieler, weil er sich dazu entschieden hat, die Antwort zu glauben?

Phoenix 17. Feb 2009 22:46

Re: Selectionstut befolgt und trotzdem fehler??? :D Hilfe :-
 
Zitat:

Zitat von nuclearping
Wenn das Tutorial funktioniert und sein Konstrukt (immernoch) nicht, an wem liegts dann wohl? An uns bestimmt nicht.

Natürlich nicht. Aber wenn es nicht funktioniert und Choice deswegen hier um Hilfe fragt, dann hat er, sei er nun ein Neuer User oder nicht, das Recht, entsprechend Respektvoll behandelt zu werden.

Es steht hier niemanden zu, andere User derart grob auf Ihre Fehler hinzuweisen. Selbst wir Moderatoren tun das freundlich. So einen Satz bekommt von uns höchstens jemand vor die Nase geklatscht, der sich in dieser Hinsicht als anfänglich Beratungsresistent erweist und auf mehrfaches, höfliches Aufmerksam machen nicht reagiert. Dann muss man halt ab und zu etwas bestimmter reagieren.

Fürs nächste mal also bitte die angemessene Höflichkeit walten lassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz