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

Aktuelle Zeit: Do Jul 17, 2025 15:27

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Dez 04, 2005 21:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Huhu... :?

Ich will ein Kartenspiel schreiben.
Da wäre es doch "toll", wenn man da ein wenig rumklicken könnte. Karten würden z.b. ein hübsches Ziel abgeben! :lol:

Machen wir es kurz. Ich zeige euch einfach mal den Code. Ihr seid da schlauer als ich. (ein paar Proceduren versteh ich garnicht...)
Sicherheitshalber auch die glinit!

Achja, malen tut er gut.
Nur das mit dem anzeigen funzt nicht.
xs und ys werden mit von sdl gegeben! (xrel und yrel bei mousemotion-event)


Code:
  1. procedure drawkarte(x,y,z : real;karte : byte);
  2. begin
  3.    glpushmatrix;
  4.    gltranslatef(x,y,z);
  5.    dec(karte);
  6.    glbegin(gl_quads);
  7.    glTexCoord2f((karte mod 8+1)/10.6666,(karte div 8+1)/8);glvertex3f(0.75,-1,0);
  8.    glTexCoord2f((karte mod 8+1)/10.6666,(karte div <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->/8);glvertex3f(0.75,1,0);
  9.    glTexCoord2f((karte mod <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->/10.6666,(karte div <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->/8);glvertex3f(-0.75,1,0);
  10.    glTexCoord2f((karte mod <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->/10.6666,(karte div 8+1)/8);glvertex3f(-0.75,-1,0);
  11.    glend;
  12.    glpopmatrix;
  13. end;
  14.  
  15. var xs,ys : integer;
  16.  
  17. procedure render;
  18. begin
  19.   glMatrixMode(GL_MODELVIEW);                //In den Projektionsmodus
  20.   glRenderMode(GL_RENDER);
  21.   glLoadIdentity;
  22.    glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
  23.  
  24.   glinitnames;
  25.   glpushname(0);
  26.      
  27.    glcolor3f(1,0.5,0.25);
  28.    gltranslatef(0,0,-1);
  29.    glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  30.    gltranslatef(-5,-10,-30);
  31.    glnormal3f(0,0,1);
  32.    glenable(gl_texture_2d);
  33.    glbindtexture(gl_texture_2d,kartentex);
  34.    for a:=0 to 7 do
  35.    for b:=0 to 7 do
  36.    if a+b*8>0 then
  37.    if a+b*8<54 then
  38.    begin
  39.    glloadname(a+b*8);  
  40.    drawkarte(a*2,b*3,0,a+b*8);
  41.    end;
  42.  
  43. end;
  44.  
  45. var Getroffen    : GLUInt;
  46.  
  47. procedure gldraw;
  48. var a,b : integer;
  49. var
  50.   Puffer       : array[0..256] of GLUInt;
  51.   Viewport     : TVector4i;
  52.   Treffer,i    : Integer;
  53.   Z_Wert       : GLUInt;
  54. begin
  55.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  56.   glSelectBuffer(256, @Puffer);               //Den Puffer zuordnen
  57.  
  58.   glMatrixMode(GL_PROJECTION);                //In den Projektionsmodus
  59.   glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  60.   glPushMatrix;                               //Um unsere Matrix zu sichern
  61.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  62.  
  63.   gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  64.   gluPerspective(60.0, Viewport[2]/Viewport[3], 1, 256);{}
  65. //  glpopmatrix;
  66.  
  67.   render;
  68.  
  69.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  70.   glPopMatrix;                                //und unsere alte Matrix wiederherzustellen
  71.  
  72.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  73.  
  74.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  75.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  76.   for i := 0 to Treffer-1 do
  77.     if Puffer[(i*4)+1] < Z_Wert then
  78.     begin
  79.       getroffen       := Puffer[(i*4)+3];
  80.       Z_Wert := Puffer[(i*4)+1];
  81.     end;
  82.  
  83.   if getroffen=High(GLUInt)
  84.     then getroffen := -1;
  85. //    else Result := getroffen;
  86.  
  87.  
  88.    render;
  89. end;
  90.  
  91. procedure glInit(all : boolean);
  92. begin
  93.  
  94.   glShadeModel(GL_SMOOTH);         // Aktiviert weiches Shading
  95.   glEnable(GL_LIGHTING);
  96.   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  97.   gllinewidth(3);
  98.  
  99.   glClearColor(0.0, 0.0, 0.0, 0.5);    // Bildschirm löschen (schwarz)
  100.   glClearDepth(1.0);               // Depth Buffer Setup
  101.   glEnable(GL_DEPTH_TEST);         // Aktiviert Depth Testing
  102.   glDepthFunc(GL_LEQUAL);          // Bestimmt den Typ des Depth Testing
  103.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  104.                                          // Qualitativ bessere Koordinaten Interpolation
  105.   glColorMaterial(GL_FRONT,GL_AMBIENT or GL_DIFFUSE or GL_SPECULAR);
  106.   glLightfv(GL_LIGHT0, GL_AMBIENT,  @light_ambient[0]);
  107.   glLightfv(GL_LIGHT0, GL_DIFFUSE,  @light_diffuse[0]);
  108.   glEnable(GL_LIGHT0);
  109.   glEnable(GL_COLOR_MATERIAL);
  110.   glEnable(GL_CULL_FACE);
  111.   glCullFace(GL_BACK);
  112.  
  113.   if all then
  114.   loadtexture('karten.jpg',kartentex,false);
  115. end;
  116.  

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 04, 2005 23:33 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hat zwar nichts mit der Selektion zu tun, aber
Code:
  1. procedure drawkarte(x,y,z : real;karte : byte);
  2. begin
  3.   glPushMatrix;
  4.   glTranslatef(x,y,z);
  5.   dec(karte);
  6.   [...]


Du weißt, dass deine Änderung an "karte" niemand außerhalb der procedur mitgriegt oder?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 05, 2005 06:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Ka, natürlich!

Wie du siehst, arbeite ich aber mit "karte" weiter und es gäbe 2 Möglichkeiten.
Die Proeceude übernimmt das subtrahieren oder ich übergebene einen subtrahierten wert.
Ich habe mich für das erstes entschieden... :lol:

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 05, 2005 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich muss gestehen dein Code ist ziemlich Wirr.

Ich würde dir an deiner Stelle raten deinen Code ein wenig umzubauen so lange du noch die Zeit hast. Als erstes würde ich nicht bei jedem Zeichnen vorher auch eine Selektion machen. Sondern nur dann, wenn sie auch tatsächlich nötig wäre. Noch als kleiner Tipp am Rande. Einrückungen und sinnvolle Variablennamen (Also kein a oder b verweden) helfen sowohl dir als auch uns. Vor allem wäre es auch wichtig, dass die Variablen halbwegs da deklariert sind wo sie verwendet werden. Ich persönlich versuche immer so wenig wie möglich globale Variablen zu benutzen, da globale Variablen den riesen Nachteil haben global zu sein.

In deiner Renderprocedure steht ein glRenderMode(GL_RENDER);. Das muss weg. Somit verlässt du deinen Selektionmodus wieder bevor du auch nur ansatzweise etwas gezeichnet hast.

Außerdem solltest du wenn du einen Namen Pushst diesen auch wieder Popen. Also am Ende der Procedur ein glPopName.

Das PushMatrix und PopMatrix für die Projecton in der Procedure glDraw (irreführender Name) kannst du eigentlich auch weglassen. Würde Matritzen sowieso recht sparsam pushen und popen, da das mit unter auch gut Zeit fressen kann. Vor allem wenn man es vermeiden könnte. Wie zum Beispiel bei dein einzelnen Karten könnte man das evtl auch noch vermeiden. Wobei ich dir da eh anraten würde deine Koordinaten 1 Mal fest zu berechnen und in Strukturen abzulegen. Ändert sich ja eigentlich nicht. Muss also nicht jedes mal neu berechnet werden, oder?

Das war eigentlich alles was ich so auf Anhieb gefunden habe.

Falls du einen vollständigen Code sehen möchtest schau mal in den Selektion Artikel im Wiki.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 05, 2005 19:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
JENER Code wurde größtenteils kopiert!
Ich schau mir deine Tipps mal an und die zur Selektion und Performance werde ich beherzigen.
Den Rest wohl eher nicht. Ich kann nämlich die Hetz gegen globale Variablen nicht verstehen. Shcon garnicht, wenn sie, wie in diesem Falle, so praktisch sind! :roll:

Edit: Fehler gefunden ich habe!
Ich habe einerseits deine Tipps beherrzigt.
Keine Reaktion
Dann habe ich den Winkel von 60 auf 45 Grad gestellt
Keine Reaktion
Dann habe ich bei SDL die Daten auf x und nicht aus xrel ausgelesen.
Es funzt!
Tja, OpenGL hat mich nicht im Stich gelassen, sondern SDL! ^^
Na egal, es funzt, danke für die Mühe! :D

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 05, 2005 20:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du das ist alles andere als eine Hetze. Nenn es mal Erfahrungswerte. Wärend ich beruflicher als Softwareentwickler tätig bin habe ich schon häufiger gesehen, dass globale Variablen immer wieder zu Problemen führen. Es ist sicherlich das Einfachste globale Variablen zu verwenden. Aber in der Objektorientieren Zeit sehe ich einfach keine Notwendigkeit irgendwelche globalen Variablen zu verwenden.

Im Endeffekt ist es reine Gewöhnung diese Variablen in die Formklasse mit zu integrieren. Versuch mal mit deinem Code eine zweite Form1 aufzumachen. Das kannste vergessen. Die Klassen würden beide auf die selben Variablen zugreifen und sich selber alles zerschießen. Wenn sie aber Bestandteil der Methoden und Klassen sind, dann kannst du Problemlos 20 Forms aufmachen ohne, dass sich da auch nur ansatzweise erwas in die Quere kommt. Dazu kommt, dass bei richtig großen Projekten keine Sau mehr irgendetwas finden würde, wenn die Variablen überall im Code stehen würden.

Spätestens dann du auch mal anfängst richtig Objekt Orientiert zu Entwickeln wirst du mich verstehen. Das ist wirklich nicht böse gemeint. Aber einen sauberen und sicheren Programmierstil muss man sich erst einmal angewöhnen. Und das muss man erlernen. Bzw wenn einem niemand sagt, dass es etwas im argen ist, dann wird sich daran auch nichts ändern. Aber genau deswegen hab ich es ja gesagt. Wenn du die Vorschläge und Anmerkungen von erfahreren Entwicklern in den Wind schlägst und auf stur stellst, dann ist das deine Sache. Von mir war es nur gut gemeint.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 05, 2005 20:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Es sei folgende Situation:
Ich programmiere mein Spiel nicht Objectorientiert und ohne Forms.
Und es gibt DURCHAUS Variablen, die das GANZE Programm brauch. :shock:

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 06, 2005 08:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das streitet ja niemand ab. Ich verwende ab und zu auch globale Variablen. Dabei handelt es sich aber meist nur um irgendwelche Klassen die Dinge verwalten und managen. Dabei hat man dann keine andere Wahl als diese global zur Verfügung zu stellen. Aber im Endeffekt war es von mir ein Vorschlag und es ist dein gutes Recht diesen nicht zu beachten. Es ist ja schließlich dein Programm. Aber eines sollte dir dennoch bewusst sein. Ich sage so etwas nicht einfach nur weil ich dich ärgern will oder so. Es hat schon seinen Grund. Irgendwann wirst du da auch noch hinter kommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 06, 2005 16:04 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Lossy eX hat geschrieben:
Das streitet ja niemand ab. Ich verwende ab und zu auch globale Variablen. Dabei handelt es sich aber meist nur um irgendwelche Klassen die Dinge verwalten und managen. Dabei hat man dann keine andere Wahl als diese global zur Verfügung zu stellen. Aber im Endeffekt war es von mir ein Vorschlag und es ist dein gutes Recht diesen nicht zu beachten. Es ist ja schließlich dein Programm. Aber eines sollte dir dennoch bewusst sein. Ich sage so etwas nicht einfach nur weil ich dich ärgern will oder so. Es hat schon seinen Grund. Irgendwann wirst du da auch noch hinter kommen.

fullack. Kann das definitiv bestätigen. Selbst wenn man nicht beruflich programmiert, erweist es sich als extremst praktisch, so wenig' Variablen global zu definieren, wie möglich ist. Man findet sich nämlich tatsächlich auch in seinem eigenen Code besser zurecht, wenn die Variablen dort stehen, wo sie gebraucht werden. Und der Aufwand, diese Variablen in eine Klasse zu stecken, sei es deine Form oder sonstwas, ist minimal.
Es ist nicht mehr und nicht weniger als ein Ratschlag und du wirst früher oder später die gleiche Erfahrung machen... ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 06, 2005 16:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Naja, wie man es nimmt.
Wahrscheinlich HABT ihr recht, aber im Moment ist diese Wissen ohne Belang. Denn es bringt mir keine Vorteile. Später bei großen Projekten sicherlich.
Jetzt nicht.

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 06, 2005 17:31 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Cyberpuer hat geschrieben:
Naja, wie man es nimmt.
Wahrscheinlich HABT ihr recht, aber im Moment ist diese Wissen ohne Belang. Denn es bringt mir keine Vorteile. Später bei großen Projekten sicherlich.
Jetzt nicht.

Dann probier' mal, bei Perniciei Effector einen Mehrspieler-Modus über Netzwerk einzubauen
oder einfach mal ein zweites Fenster mit dem gleichen Inhalt wie im ersten darzustellen :twisted: :twisted: :twisted:
:wink:

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 06, 2005 18:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja gut. Ich glaube er hats verstanden. ;-)

Ist schließlich jedem seine Entscheidung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 06, 2005 18:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Frase hat geschrieben:
Cyberpuer hat geschrieben:
Naja, wie man es nimmt.
Wahrscheinlich HABT ihr recht, aber im Moment ist diese Wissen ohne Belang. Denn es bringt mir keine Vorteile. Später bei großen Projekten sicherlich.
Jetzt nicht.

Dann probier' mal, bei Perniciei Effector einen Mehrspieler-Modus über Netzwerk einzubauen
oder einfach mal ein zweites Fenster mit dem gleichen Inhalt wie im ersten darzustellen :twisted: :twisted: :twisted:
:wink:

Weißt du, ich setze mir Ziele vorher...
Und beides war und wird nie Ziel sein! ^^

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 14 Queries | GZIP : On ]