Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

EcaFaYn!

Frischling

  • »EcaFaYn!« ist der Autor dieses Themas

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

1

06.05.2009, 21:18

OpenGL-Koordinaten und Pixel

Hi,
komme mal wieder nicht weiter ^^ aber ich bin schon froh genug darüber, überhaupt mal wieder was zu programmieren.
Ich erstelle so eine Art Mehrspieler-Snake, bei dem es allerdings nicht nur 4 Richtungen (links, rechts, oben, unten) gibt, sondern in dem man 2 Tasten bedient, die die jeweilige "Schlange" kurvenförmig entweder nach links oder rechts steuern, so dass die "Schlange" einen Kreis bildet, wenn man lang genug die gleiche Taste drückt (dürfte nun verständlich sein :) ).
Meine Frage ist nun: wie programmiere ich die Kollision? Pixelgenau wäre schon nicht schlecht, aber ich finde irgendwie keine Verbindung vom Koordinatensystem von OpenGL (das ja mit Floats arbeitet) und den Pixeln, die ich dann in einem 2-dimensionalen Array als HINDERNIS oder ähnliches einspeichern würde. Wie soll ich die Werte (floats) den Pixeln zuordnen?
Oder habt ihr einen anderen Vorschlag? Vielleicht gibt es einen ganz einfachen Weg, ich bin allerdings ratlos - kann mir aber gut vorstellen, dass hier irgendwer auf eine einfache Lösung kommt, der sich schon mal mit Kollision beschäftigt hat.

Und wünscht mir bitte viel Erfolg für die Geschichts-LK-Klausur morgen :D Weimarer Republik ftw ...
On the grind - Supersci

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

2

07.05.2009, 16:54

Ich denke die meisten Hindernisse dürften sich mit Rechtecken beschreiben lassen? Reche doch einfach mit solchen, statt aufwendige, pixelgenaue Kollision durchzuführen.

Und wie lief Geschichte? ^^

EcaFaYn!

Frischling

  • »EcaFaYn!« ist der Autor dieses Themas

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

3

07.05.2009, 20:48

Zitat

Ich denke die meisten Hindernisse dürften sich mit Rechtecken beschreiben lassen?

Nein, die entscheidensten Hindernisse sind andere "Schlangen" oder die eigene ... also leider nicht so einfach wie mit Rechtecken :p

Die Arbeit ist ganz gut gelaufen xD aber der Lehrer will mir einfach nichts besseres als eine 3 geben, bisher hatte ich in allen Arbeiten diese Note ... was soll man machen ^^

Hat ansonsten keiner eine Idee?
On the grind - Supersci

4

07.05.2009, 21:56

Zitat von »"EcaFaYn!"«

Zitat

Ich denke die meisten Hindernisse dürften sich mit Rechtecken beschreiben lassen?

Nein, die entscheidensten Hindernisse sind andere "Schlangen" oder die eigene ... also leider nicht so einfach wie mit Rechtecken :p


Wümpftlbrümpftl hat schon recht, du teilst die schlange in viele kleine rechtecke auf die du dann recht leicht auf kollision unter einander prüfen kannst....

EcaFaYn!

Frischling

  • »EcaFaYn!« ist der Autor dieses Themas

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

5

07.05.2009, 23:19

Das entscheidende ist, dass ich dies nicht nur einmal prüfen muss. Da die "Schlangen" immer länger werden - das Ende bewegt sich ja nicht mit - muss ich die Punkte irgendwie brauchbar speichern, für spätere Kollisionen; und wie ich das machen kann, war letztlich meine Frage.
Wie komme ich von den Punkten im Koordinatensystem auf die entsprechenden Pixel?
On the grind - Supersci

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

6

08.05.2009, 00:48

Waer mal interessant zu wissen wie du die gekruemmten Schlangen speicherst und darstellst.
Aller Wahrscheinlichkeit setzen sich die Schlangen wohl aus vielen kleinen geraden Stuecken zusammen. In dem Fall ist eine Schlange eine Liste von Punkten, und eine Kollision ist nichts anderes als der Schnitt mit einer Linie zwischen zwei dieser Punkte.
"Have you tried turning it off and on again?"

EcaFaYn!

Frischling

  • »EcaFaYn!« ist der Autor dieses Themas

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

7

08.05.2009, 15:19

Die "Schlangen" werden noch gar nicht gespeichert - das war ja schließlich meine Frage.
Berechnet und dargestellt werden sie punktweise - müssen sie ja auch, denn sie könnten ja jederzeit mit jedem neuen Punkt gegen ein Hindernis stoßen.
Damit die "Schlange" besser erkennbar ist, verwende ich Pointsize 5.

hier der entscheidende Code (habe mich erstmal um das grundsätzliche Funktionieren gekümmert, Struktur bringe ich später rein :p ):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
    //main message loop

    while (!done)
    {
          PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE);
          
          if (msg.message == WM_QUIT)   //do you receive a WM_QUIT message?

          {
          done = true;                  //if so, time to quit the application

          }
          else
          {                             //do rendering here

          //clear screen and depth buffer

          if (Cleared == false) //temporary prevention of clearing the screen

          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
          Cleared = true;
          
          glLoadIdentity();           //reset modelview matrix

          //-------------------------------------------------------------------

          
          glPointSize(5);
          
          glTranslatef(0.0f, 0.0f, -10.0f);
          
          glColor3f(1.0f, 0.0f, 0.0f);        //set color to red

          
          //Input:-------------------------------------------------------------

          
          if (GetAsyncKeyState(0x31))        // "1" pressed?

          {
             if (act_timer == 0)
             {
             act_timer = DELAY_TIME;
             angle += 0.05;
             }
          }
          
          if (GetAsyncKeyState(0x51))        // "Q" pressed?

          {
             if (act_timer == 0)
             {
             act_timer = DELAY_TIME;
             angle -= 0.05;
             }
          }
          
          //------------------------------------------------------------------- 

          
          if (angle >= 360.0f || angle <= -360.0f)        //reset angle counter

          angle = 0.0f;
          
          if (std_timer == DELAY_TIME)
          {
          std_timer = 0;
          x += (cos(angle)) * 0.05; //get new x value using angle functions

          y += (sin(angle)) * 0.05; //get new y value using angle functions

          }
          
          glBegin(GL_POINTS);              //draw the "head" of the snake

              glVertex3f(x, y, 0);
          glEnd();
          
          if (act_timer > 0)
          act_timer--;
          
          std_timer++;
          Sleep(1);
          
          //-------------------------------------------------------------------

          
          SwapBuffers(g_HDC);                 //bring back buffer to foreground

          
          TranslateMessage(&msg);           //translate/dispatch to event queue

          DispatchMessage(&msg);      
          }
    }
On the grind - Supersci

Werbeanzeige