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

1

25.02.2009, 19:26

[Erledigt] Kollisions Berechnung auf Canvas bei einem Spiel

Weiß nicht wie ich den Titel genauer schreiben konnte :?

Aber hier erklär ich euch genauer mein Problem:

Ich bin gerade dabei mein erstes 2D Shooter Spiel zu programmieren. Da ich keine Erfahrung habe mit OpenGL, Andorra und co. benutze ich die ganzen Standard-Elemente von Delpi. Also Paintbox und co.

Man sieht alles von oben, ich , ein weißer Kreis, gegen Zombies, rote Kreise. Schiessen kann ich mit der Maustaste, dabei wird dann für eine halbe Sekunden eine weiße Linine (Schusslinie) sichtbar. Wenn jetzt die weißen Linie durch eine Bot geht, so soll dieser gelöscht werden. Da ich nur die mittelpunkte der Bots kenne, berechne ich zuerst die Entfernung von allen Bots zu der Stelle wo die weiße Linie einen roten Pixel berührt. Mit dem Sortierverfahren bubblesort, ist dann pyt1[1], die kürsete Strecke. Dann schaue ich welchem Bot diese Strecke gehört und lösch in anschliessend. Er wird übermalt und von der Botliste entfernt. Leider klappt bei mir das alles nicht. Es werden immer ganz andere Bots gelöscht und sehr selten derjenige, der angeschossen wurde.

Hier ist der Code im dem ich Prüfe ob ein Bot getroffen wurde und welcher es sein sollte:

Quellcode

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
for I2 := msx1 to x1 do begin    // msx1 = anfang der weißen linie   x1 = ende der weißen linie/schusslinie
    posy:=steigung*I2+c;   // y-wert der weißen linie an position I2, also die funktion der linie ;)



      if image1.Canvas.Pixels[round(I2+1),round(posy-1)] = clred then begin   //wenn ein roter kreis überschnitten wurde
        {bottimer.Enabled := false;}       // unwichtig
        image1.Canvas.Pen.Color := cl3DDkShadow;
        image1.Canvas.brush.Color := cl3DDkShadow;
           //puyt1[I] gleich strecke von bot zu punkt
        for I := 1 to bots do begin          // bots = anzahl aller bots
          pyt1[I] := sqrt(((I2-botkx[I])*( I2-botkx[I])) + (posy -botky[I])*(posy-botky[I]));   //mit satz des pytagoras berechne ich die strekcne zwischen botmittelpunkt und weißer linie wo der rote pixel entdeckt wurde. botkx = x-wert des bots, botky = y-wert des bots
        end;

            //strecken zwischen speichern
        for I := 1 to bots do begin

          pyt2[I] := pyt1[I];    //bevor alle strecken sortiert werden, kurz zwischen speichern

        end;
              // pyt[1] gleich kleinste strecke
        repeat                 //sortiert wird mit bubblesort
          getauscht := false;
          for I :=1 to bots - 1 do begin
            if pyt1[I] > pyt1[I+1] then begin
              pyt4 := pyt1[I];
              pyt1[I] := pyt1[I+1];
              pyt1[I+1] := pyt4;
              getauscht := true;
            end;
          end;
        until getauscht = true;

        for I := 1 to bots do begin

        if pyt1[1] = pyt2[I] then begin                  // hier schaue ich welcher bot die kürzeste strecke hat und übermal ihn dann.


        image1.Canvas.ellipse(botkx[I]-10,botky[I]-10,botkx[I]+10,botky[I]+10);
        soundtimer.Enabled := true;
        zw1 := botky[I];
        zw :=  botkx[I];
        botkx[I] := botkx[bots];         // da der bot nicht mehr gezeichnet werden soll, wird er ans ende der bot liste geschoben,
        botky[I] := botky[bots];        
        botky[bots] := zw1;
        botkx[bots] := zw;
        bots := bots-1; // und die liste um 1 verkleinert, so wird der 'tote' bot nicht mehr neu gezeichnet
        exit;        // da der bot aus mehreren roten pixeln besteht und die for schleife nicht jedes mal ihn eliminieren soll,
// soll hier die schleife beendet werden
        end;
        end;


      end;

    end;


Hoffe ihr habt mein Problem verstanden und könnt mir helfen :?


Edit: lol standar t ist zensiert xD anscheinend ein sehr sehr häufiger fehler :P

2

25.02.2009, 20:05

bubblesort is natürlich speed pur :D:D

Hm kannst doch eigtl. ganz einfach über Funktionen berechnen ... einmal die Linienfunktion (x, y) und einmal die Kreisfunktion (die abhängig vom Radius und x u. y von M ist).

So damit lässt sich super einfach http://www.flipcode.com/archives/Theory_Practice-Issue_01_Collision_Detection.shtml durchlesen und gut is :P
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

3

25.02.2009, 20:46

die seite sieht sehr gut aus größten dank ;)

Ja bubblesort ist nicht so das beste :P habe ich aber benutzt weil es schnell hingeschrieben ist. wollte zuerst mal alles im groben zum laufen bringen und erst danach ans optimieren gehen...

Werbeanzeige