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

08.08.2009, 16:20

[gelöst] Kollisionskontrolle Kreis-->Kreis 2D

Hallo,

ich bastel gerade an einem Spiel in WinAPI und habe ein Problem mit der Kollisionskontrolle. Habe ein dazu ein Skrip von D.Scherfgen gefunden.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
// Berechnung der Kollision zweier Kreise
bool CircleHitsCircle(const Vector2D& CenterA, // Mittelpunkt Kreis A
                      const float RadiusA,     // Radius Kreis A
                      const Vector2D& CenterB, // Mittelpunkt Kreis B
                      const float RadiusB)     // Radius von Kreis B
{
    // Wenn die Entfernung der beiden Mittelpunkte kleiner oder gleich
    // der Summe der beiden Radien ist, liegt eine Kollision vor.
    return (CenterA - CenterB).LengthSq() <=
           (RadiusA + RadiusB) * (RadiusA + RadiusB);
}


Meine Bewegung sieht wie folgt aus:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
BOOL ball_zeichnen (HWND hwnd)
{
    // Vorbereitung
    //
    HDC hdc ;
    PAINTSTRUCT ps ;

    int farbmischung;       //Farbe des Kreises
    HBRUSH pinsel;      //Pinseltyp von MS vorgegeben

    double x, y;
    //int v0;       //Anfangsgeschwindigkeit

    double winkel;
    //double hilfswinkel;
    int g=20;

    //Zufällige Zahlen ausrechnen wenn nicht fest definiert
    if (v0 == 0)
        {
            srand(time(NULL));
            v0 = rand () % 10+1;
            hilfswinkel = rand () % 89+1;

            //Zur Kontrolle in Konsole
            printf("\nZufallszahl: v0 ist %i", v0);
            printf("\nZufallszahl: hilfswinkel ist %f", hilfswinkel);
        }


    //Abschusswinkel ausrechnen
    hilfswinkel; // in Grad
    winkel=-((hilfswinkel*PI)/180); //Umrechnung in rad
    printf("\nmeine_Unterprogramme.c:Winkel hat den Wert %f", winkel); //Ausgabe Konsole

    //zeitabhängige Variable t hochzählen
    t=t+1;
    printf("\nmeine_Unterprogramme.c:Variable t hat den Wert %i", t); //Ausgabe Konsole

    //Definition der Bewegung
    x=0.5*v0*cos(winkel)*t;
    y=0.5*v0*sin(winkel)*t;

    //Definition der Abbruchbedingen
    abbruchzaehler = v0*t;

    if (abbruchzaehler >= 1500)
        {
            KillTimer(hwnd,TIMER_1);
            t = 0;
            v0 = 0;
            hilfswinkel = 0;
            pro_v0 = 0;
            pro_hilfswinkel = 0;
            MessageBox (hwnd,"Du warst zu langsam!\nNochmal!","Meldung",MB_OK | MB_ICONEXCLAMATION);


        }


    InvalidateRect (hwnd, NULL, TRUE) ;
    hdc = BeginPaint (hwnd, &ps);

    //Zeichenbefehle
    //
    farbmischung = RGB(255, 0, 0);      // Hier kann die Farbe des Kreises verändert werden
    pinsel = CreateSolidBrush (farbmischung);
    SelectBrush(hdc, pinsel);

    SetViewportOrgEx(hdc, 5, 410, NULL);        // Hier kann der Mittelpunkt der ~Kreisbewegung verändert werden

    Ellipse(hdc, (int) x-20, (int) y-20, (int)x+20, (int) y+20);        //Hier kann der Kreisdurchmesser verändert werden

    DeleteObject(pinsel);

    //Nachbearbeitung
    //
    EndPaint (hwnd, &ps) ;
    UpdateWindow(hwnd);
    return 0;
}


Jetzt die Frage zum Kollisionsskript. Ich steh voll auf dem Schlauch.
Mit "const Vector2D& CenterA" soll ich den Mittelpunkt eines Kreises übergeben. Aber dieser muss sich doch aus zwei Punkten (X und Y) zusammensetzten und ich habe nur eine Variable?

EDIT: Das ganze soll in C realisiert werden

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

08.08.2009, 16:30

Vector2D ist sowas wie:

C-/C++-Quelltext

1
2
3
4
5
struct Vector2D
{
    float x;
    float y;
};

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

3

08.08.2009, 16:31

Vector2D ist ein 2D-Vektor (siehe Wikipedia), der enthält eine x- und eine y-Komponente.

Zwischenfrage: Es gibt sicher einfachere Wege 2D-Spiele zu entwickeln als die Winapi, Stichwort SFML.

Cheers,
Marius

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

4

08.08.2009, 17:06

Zitat

Vector2D ist sowas wie:

C-/C++-Quelltext

1
2
3
4
5
struct Vector2D
{
    float x;
    float y;
};

+
operator-() und LengthSq() da diese beiden Funktionen benutzt werden

btw:

Zitat

ich bastel gerade an einem Spiel in WinAPI

... Wenn ich das schon lese...
Die GDI ist völlig ungeeignet um ein Spiel zu programmieren. Sie ist für statische Anzeige von Grafiken optimiert und es ist Schwachsinn damit ein Spiel programmieren zu wollen. Außerdem ist es auch viel zu umständlich.
Signaturen werden überbewertet

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

08.08.2009, 17:31

Ich habe mal ein aktion-Spiel gesehn was auf der Winapi basierte.... und obwohl nur ein strichmändchen und 4 wände zu sehen war, konnte man das repainten sehen... :D
So ziemlich alles andere ist besser für ein Spiel geeignet ( naja nicht alles ;) )

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

6

08.08.2009, 18:23

Zitat von »"K-Bal"«

Stichwort SFML.


Bekommst du von Laurent eigentlich Geld für die ganze Werbung? Angebracht wäre es zumindest ^^

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

7

08.08.2009, 18:57

Zitat von »"n0_0ne"«

Zitat von »"K-Bal"«

Stichwort SFML.


Bekommst du von Laurent eigentlich Geld für die ganze Werbung? Angebracht wäre es zumindest ^^

Zufriedene Kunden sind die beste Werbung :lol:

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

8

08.08.2009, 20:17

Zitat von »"n0_0ne"«

Zitat von »"K-Bal"«

Stichwort SFML.


Bekommst du von Laurent eigentlich Geld für die ganze Werbung? Angebracht wäre es zumindest ^^


Ich sollte ihn mal darauf ansprechen :D

9

10.08.2009, 19:27

Hallo zusammen,

danke für die Hilfe. Ich war seither leider verhindert und melde mich deshalb erst jetzt.

Zitat von »"GR-PA"«


... Wenn ich das schon lese...
Die GDI ist völlig ungeeignet um ein Spiel zu programmieren. Sie ist für statische Anzeige von Grafiken optimiert und es ist Schwachsinn damit ein Spiel programmieren zu wollen. Außerdem ist es auch viel zu umständlich.

Ich weiß und dass es kompliziert ist habe ich inzwischen auch gemerkt
:) Ist ein Projekt für das Studium und Vorgabe ist eben WinAPI... Funktioniert aber soweit alles bis auf die Kollisionskontrolle.

Ich habe dennoch eine weitere Frage: const Vector2D& CenterA
const Vector2D ist nun geklärt aber was ist mit & CenterA? Ich kenn das & in C nur von fscanf.

Danke
Dani

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

10

10.08.2009, 19:32

C-/C++-Quelltext

1
2
3
4
bool CircleHitsCircle(const Vector2D& CenterA, // Mittelpunkt Kreis A

                      const float RadiusA,     // Radius Kreis A

                      const Vector2D& CenterB, // Mittelpunkt Kreis B

                      const float RadiusB)     // Radius von Kreis B


Es handelt sich hier um einen Call by Reference Aufruf. D.h du übergibst keine Kopie des Parameters sondern das Orginal. [/cpp]


Beispiel :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
int main()
{
  int iValue = 5;
  Inc(iValue);
  std::cout << iValue;  //Hier wird iValue 6 sein!

}

void Inc(int &iValue)
{
   iValue++;
}


Ein Projekt fürs Studium? Ist das für das Softwarepraktikum^^? Der Kollisions-Algorithmus den du hier nutzt nennt sich übrigends Bounding Circle.. Was studierst du wenn man fragen darf?

Werbeanzeige