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

Aktuelle Zeit: So Jun 16, 2024 18:47

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Dez 22, 2002 18:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 14, 2002 14:00
Beiträge: 14
Wohnort: Saarland
ich möchte gerne mehrer Rechteck Instanzen zur Laufzeit erzeugen, die übereinander angeordnet werden, dass heißt ich habe einen button und per click soll ein neues Rechteck entstehen. klicke ich nochmal drauf soll ein weiteres entstehen, dass über dem ersten liegt.

Wie kann ich solch verschiedene instanzen erzeugen? ich habs bisher nur geschafft ein rechteck zu erzeugen und dass wird per click einfach nur nach oben verschoben.

MfG

Jack Falworth

_________________
Warum soll ich über eine Mauer klettern wenn ich auch durch das Tor reingehen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 22, 2002 19:01 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Was hällst du davon, das Ganze mit ner for-Schleife zumachen. Jedes mal wenn du auf den Knopf drückst, erhöhst du den Wert, bis zu dem die Schleife geht. Die Position der Rechtecke kannst du mit dem Wert der for-Schleife berechnen.

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 23, 2002 00:30 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 14, 2002 14:00
Beiträge: 14
Wohnort: Saarland
das ist schon klar, aber wie kann ich wenn ich auf den knopf drücke ein neues Rechteck über dem alten Zeichnen.

Ich weiß einfach nicht wie ich zur Laufzeit weitere Rechtecke erzeugen und per rotate, scale etc. verändern kann.

Hoffe das Problem ist jetzt etwas verständlicher.

MfG

Jack Falworth

_________________
Warum soll ich über eine Mauer klettern wenn ich auch durch das Tor reingehen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 23, 2002 02:14 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
Also das "darüber" zeichnen, könnt man mit deaktivieren des Tiefenbuffers sehr simple erreichen:

Code:
  1. glDisable(GL_DEPTH_TEST);

Beim rest verstehe ich das eigentliche problem nicht. Die Daten könnte man in einem Array speichern, dass zeichnen z.B. mit einer Funktion, die dann nur noch die Parameter erwartet.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 23, 2002 11:21 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 14, 2002 14:00
Beiträge: 14
Wohnort: Saarland
hmm ich muss es etwas anders ausdrücken.
Nehmen wir an ich habe eine Zeichenfläche auf der ich Rechtecke zeichnen möchte.
Bei jedem click auf einen Button entsteht an einer zufällig bestimmten Stelle auf der Zeichenfläche ein neues Rechteck. Das neue Rechteck soll man aber unabhängig von den (schon vorhandenen) Rechtecken drehen, scalieren etc. können.

Mein Problem ist nicht das Speichern der Punktkoordinaten sondern wie bekomme ich es hin zur Laufzeit neue Rechtecke zu erstellen.

Ich schaffe im Moment nur ein Rechteck zu zeichnen und wenn ich auf den Button clicke, wird kein weiteres Rechteck gezeichnet, sondern dass das schon da ist lediglich an eine andere Stelle gesetzt.

MfG

Jack Falworth

_________________
Warum soll ich über eine Mauer klettern wenn ich auch durch das Tor reingehen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 23, 2002 12:13 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
Ja und wo ist das Problem dabei ne Array zu verwenden?

Code:
  1.  
  2.  
  3. TYPE TTMyQuad = RECORD
  4.  
  5.    ecke : ARRAY[0..2] OF SINGLE;
  6.  
  7.    tu : ARRAY[0..1] OF SINGLE;
  8.  
  9. end;
  10.  
  11.  
  12.  
  13. var mrect : ARRAY[0..100] OF TMyQuad;
  14.  
  15.       rects:INTEGER;
  16.  
  17.  


Nun erhöhst Du beim klick auf dem Button einfach nur rects und schreibst an der neuen Stelle im Array zufällig irgendwelche Daten. Beim rendern gehst Du dann durch eine FOR-Schleife bis zur rects und renderst das Objekt mit den Daten. Dann ist es auch nicht mehr schwer einzelne Objekt rotieren zu lassen. Du könntest z.B. auch nun in der Struktur noch zusätzliche Informationen speichern, wie z.b. die Winkel um die es gedreht wurde.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 25, 2002 19:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 14, 2002 14:00
Beiträge: 14
Wohnort: Saarland
Das war nicht das Problem, trotzdem danke.
Ich glaub mein Problem war, dass ich in meiner Rechteck Zeichen Procedure die Anweisung glclear stehen hatte. Das hat mir immer alle Rechtecke bis auf das aktuelle gelöscht. Deshalb hab ich immer nur eins gesehen :roll:.
Jetzt hab ich glclear in die FormPaint Procedure geschrieben und es funktioniert.

MfG

Jack Falworth

_________________
Warum soll ich über eine Mauer klettern wenn ich auch durch das Tor reingehen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 26, 2002 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 14, 2002 14:00
Beiträge: 14
Wohnort: Saarland
Code:
  1.  
  2.  
  3. procedure Draw_Rechteck (glRechteck: TRec);
  4.  
  5. begin
  6.  
  7. glPolygonMode (gl_front_and_back, gl_line);
  8.  
  9. glTranslatef(0.01,0,0);
  10.  
  11. glbegin(gl_Quads);
  12.  
  13. glcolor3f (1,0,0);
  14.  
  15. glvertex2f (glrechteck[counter].lo.x,glrechteck[counter].lo.y);
  16.  
  17. glvertex2f (glrechteck[counter].lu.x,glrechteck[counter].lu.y);
  18.  
  19. glvertex2f (glrechteck[counter].ru.x,glrechteck[counter].ru.y);
  20.  
  21. glvertex2f (glrechteck[counter].ro.x,glrechteck[counter].ro.y);
  22.  
  23. glend();
  24.  
  25. glFlush();
  26.  
  27. SwapBuffers(dc);
  28.  
  29. end;
  30.  
  31.  
  32.  
  33. procedure Init_Recs;
  34.  
  35. begin
  36.  
  37. glrechteck[0].lo.x:= -0.5;
  38.  
  39. glrechteck[0].lo.y:= 0.2;
  40.  
  41. glrechteck[0].lu.x:= -0.5;
  42.  
  43. glrechteck[0].lu.y:= 0.0;
  44.  
  45. glrechteck[0].ru.x:= -0.3;
  46.  
  47. glrechteck[0].ru.y:= 0.0;
  48.  
  49. glrechteck[0].ro.x:= -0.3;
  50.  
  51. glrechteck[0].ro.y:= 0.2;
  52.  
  53. ...
  54.  
  55.  
  56.  
  57. procedure TForm1.Timer1Timer(Sender: TObject);
  58.  
  59. begin
  60.  
  61. glclear (gl_color_buffer_Bit or gl_depth_buffer_bit);
  62.  
  63.  for i:= 0 to counter do
  64.  
  65.  Draw_Rechteck(glrechteck);
  66.  
  67. end;
  68.  
  69.  


So ich hab mir jetzt einen code zusammengebastelt. Wenn ich den Timer einschalte, bewegen sich die Rechteck in die positive x-Achse.
Jetzt meine Frage:
Ich habe pfd_doublebuffer aktiv aber nur das erste Rechteck flackert nicht beim verschieben. Alle anderen Rechtecke flackern. Wie kommt das?

MfG

Jack Falworth

_________________
Warum soll ich über eine Mauer klettern wenn ich auch durch das Tor reingehen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 26, 2002 19:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Was mir direkt aufgefallen ist : Du wechselst nach jedem gezeichneten Rechteck die Puffer mittels SwapBuffers() und nutzt auch glFlush() nach jedem Rechteck.Daher könnte das Flackern kommen.
Das ist nicht nötig.Die Puffer müssen erst getauscht werden, wenn deine Szene komplett gezeichnet wurde, und glFlush() wird im Normalfall gar nicht benötigt (was glFlush() macht, steht ja im RedBook).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 26, 2002 23:28 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 14, 2002 14:00
Beiträge: 14
Wohnort: Saarland
ok das dürfte jetzt behoben sein. doch es ist ein neuer Fehler entstanden:
Wenn ich das programme ausführe kommt kein fehler, aber wenn ich das prog dann beende und wieder starte kommt ein delphi und kernel fehler.
ich weiß nicht, muss ich vielleicht irgendeinen speicher wieder freigeben oder so was ähnliches? hier ist mal der quellcode (so kurz wie möglich):

Code:
  1.  
  2.  
  3. procedure InitGL (handle: hdc);
  4.  
  5. var pfd: TPixelformatdescriptor; pf: integer;
  6.  
  7. begin
  8.  
  9. fillchar (pfd, sizeof(pfd), 0);
  10.  
  11. pfd.nSize:= sizeof(pfd);
  12.  
  13. pfd.nVersion:= 1;
  14.  
  15. pfd.dwFlags:= pfd_draw_to_window or pfd_support_opengl or pfd_doublebuffer;
  16.  
  17. pfd.iPixelType:= pfd_type_rgba;
  18.  
  19. pfd.cColorBits:= 24;
  20.  
  21. pfd.cDepthBits:= 32;
  22.  
  23. pfd.iLayerType:= pfd_main_plane;
  24.  
  25.  
  26.  
  27. pf:= choosepixelformat (handle, @pfd);
  28.  
  29. setpixelformat (handle, pf, @pfd);
  30.  
  31. hrc:= wglcreatecontext (handle);
  32.  
  33. end;
  34.  
  35.  
  36.  
  37.  
  38.  
  39. procedure TForm1.FormCreate(Sender: TObject);
  40.  
  41. begin
  42.  
  43. dc:= getdc (panel1.handle);
  44.  
  45. initGL (dc);
  46.  
  47. wglMakecurrent (dc, hrc);
  48.  
  49. end;
  50.  
  51.  
  52.  
  53. procedure TForm1.FormDestroy(Sender: TObject);
  54.  
  55. begin
  56.  
  57. wgldeletecontext (hrc);
  58.  
  59. wglmakecurrent (0,0);
  60.  
  61. end;
  62.  
  63.  
  64.  
  65. procedure Draw_Rechteck (glRechteck: TRec);
  66.  
  67. var i: integer;
  68.  
  69. begin
  70.  
  71. for i:= 0 to 2 do
  72.  
  73. begin
  74.  
  75. counter:= i;
  76.  
  77. glPolygonMode (gl_front_and_back, gl_line);
  78.  
  79. glTranslatef(0.01,0,0);
  80.  
  81. glbegin(gl_Quads);
  82.  
  83. glcolor3f (1,0,0);
  84.  
  85. glvertex2f (glrechteck[counter].lo.x,glrechteck[counter].lo.y);
  86.  
  87. glvertex2f (glrechteck[counter].lu.x,glrechteck[counter].lu.y);
  88.  
  89. glvertex2f (glrechteck[counter].ru.x,glrechteck[counter].ru.y);
  90.  
  91. glvertex2f (glrechteck[counter].ro.x,glrechteck[counter].ro.y);
  92.  
  93. glend();
  94.  
  95. end;
  96.  
  97. SwapBuffers(dc);
  98.  
  99. end;
  100.  
  101.  
  102.  
  103. procedure TForm1.Button2Click(Sender: TObject);
  104.  
  105. begin
  106.  
  107. glrechteck[0].lo.x:= -0.1;
  108.  
  109. glrechteck[0].lo.y:= 0.2;
  110.  
  111. glrechteck[0].lu.x:= -0.1;
  112.  
  113. glrechteck[0].lu.y:= 0.0;
  114.  
  115. glrechteck[0].ru.x:= 0.1;
  116.  
  117. glrechteck[0].ru.y:= 0.0;
  118.  
  119. glrechteck[0].ro.x:= 0.1;
  120.  
  121. glrechteck[0].ro.y:= 0.2;
  122.  
  123.  
  124.  
  125. [...]
  126.  
  127. end;
  128.  
  129.  
  130.  
  131. procedure TForm1.Timer1Timer(Sender: TObject);
  132.  
  133. begin
  134.  
  135. glclear (gl_color_buffer_Bit or gl_depth_buffer_bit);
  136.  
  137. Draw_Rechteck(glrechteck);
  138.  
  139. end;
  140.  
  141.  

_________________
Warum soll ich über eine Mauer klettern wenn ich auch durch das Tor reingehen kann?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 38 Gäste


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.064s | 17 Queries | GZIP : On ]