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

07.08.2009, 08:03

[gelöst] Kollisionskontrolle und Unterprogramm

Hallo,

ich hätte da mal gern 2 Probleme:

FRAGE 1:
Ich habe in der *.rc-Datei meine Menüleiste konfiguriert. Bis jetzt sah das immer folgendermaßen aus:

Quellcode

1
2
3
4
5
POPUP "&Datei"
   BEGIN
      MENUITEM "&Exit",IDM_EXIT
      MENUITEM "Bewegung starten", TIMER_STARTEN
      MENUITEM "Zufallszahl", ???


Jetzt möchte ich (in einem Unterprogramm ??) zwei Zahlen per Zufallszahl definieren. Das wollte ich mit ZZ = rand () % 10+1 machen. Wie kann ich ein eigenes Unterprogramm aufrufen? Wie kann dieses Unterprogramm aussehen? Gibt es vielleicht einen eleganteren Weg?

FRAGE2:
In meinem Minispiel fliegt eine Tontaube (Kreis) herum. Gibt es eine Funktion die erkennt wenn der Kreis das Clintfenster verlassen hat? Hatte mir schon überlegt mit der Geschwindigkeit zu rechnen und dann nach x sek abzubrechen.

Danke
Dani

2

07.08.2009, 08:36

Als Unterprogramm meinst du doch bestimmt eine Funktion.

also da du zwei Werte gleichzeitig übergeben willst muss man das mit Referenzen machen.

C-/C++-Quelltext

1
2
3
4
5
void Funktionsname (int& Zahl1, int& Zahl2)
{
      Zahl1= rand () % 10+1;
      Zahl2= rand () % 10+1;
}


diese Funktion musst du nur noch aufrufen

im zb. Hauptprogramm:

C-/C++-Quelltext

1
2
3
4
5
...
int Zahl1;
int Zahl2;
Funktionsname (Zahl1, Zahl2);
...


wenn du aber wirklich nur die Zahlen mit einen Zufallswert füllen willst würde ich das direkt machen und nicht durch eine Funktion...
Rechtschreibefehler sind gewollt und sollen euer Unterbewusstsein beeinflussen ;-)

"Irren ist menschlich, aber wenn man richtigen Mist bauen will, braucht man einen Computer."

Erschaffen statt vernichten, dass ist die wahre Kunst

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

07.08.2009, 08:40

Seh ich das richtig dass du versuchst in einem Ressourcen-Skript Unterprogramme aufzurufen!?
Wenn ja hast du wohl irgendwie was nicht ganz verstanden: Mit einem Ressource Script beschreibst du lediglich was für Daten zusätzlich in deine exe reinkommen (z.B. Text, Bilder, Dialog Vorlagen, usw.). Das sind aber rein statische Daten da wird nix zur Laufzeit ausgeführt oder sonstwas und es gibt daher weder irgendwelche Ausdrücke noch Funktionen wie rand() und erst recht keine Unterprogramme...

Zu Frage2: So eine Funktion musst du dir wohl selber schreiben...

4

07.08.2009, 08:49

Ich hab das ganze jetzt nochmal durchgalesen und durchdacht du willst also vom Menü aus eine Funtion sarten die zwei Zahlen definiert. Meines erachtens müssten die dann gloabl definiert sein da ich mich nicht so mit den Ressurcen und Meüs auskenne geb ich dir mal keine Garntie das es richtig was ich jetzt schreibe.

void ??? ()
{
Zahl1= rand () % 10+1;
Zahl2= rand () % 10+1;
}

bei Frage zwei stimm ich dot zu ^^
Rechtschreibefehler sind gewollt und sollen euer Unterbewusstsein beeinflussen ;-)

"Irren ist menschlich, aber wenn man richtigen Mist bauen will, braucht man einen Computer."

Erschaffen statt vernichten, dass ist die wahre Kunst

5

07.08.2009, 09:27

Danke für die Antworten, ich habe es wohl wieder nicht vollständig erklärt:

Ich habe meine eigentliche Spieldatei (spiel.c). Dann habe ich eine Datei, in der ich meine Unterprogramme habe (unterporgramme.c). Ich habe das wegen der Übersichtlichkeit getrennt.

In der Menüleiste habe ich unter anderem die Optionen Fest und Zufall. Wähle ich Fest, geht ein Fenster auf in dem ich die Zahl1 und Zahl2 festlegen und speichern kann. Dann schließe ich das Fenster und kann mein Spiel mit den zuvor festgelegten Parametern (Zahl1 + Zahl2) starten. Soweit steht es.
Jetzt will ich im Menü Zufall wählen. Dann sollen die Parameter (Zahl1 + Zahl2) definiert werden. Danach kann ich das Spiel starten


Zitat

Wenn ja hast du wohl irgendwie was nicht ganz verstanden

Das kann leider sein. Ist bei mir eine Studienarbeit. Es ist so dass ich das kleine Spiel in Kürze abgeben muss, dann habe ich Zeit mich auf die mündliche Prüfung vorzubereiten. Ich muss jetzt zielorientiert arbeiten und es dann danach lernen. Soweit das halt möglich ist. Normalerweise ist die Arbeit auch während der Vorlesungszeit angesetzt, so dass man den Prof. in der Sprechstunde fragen kann. Das kann ich jetzt halt nicht, aber dafür hab ich ja euch
:D

6

07.08.2009, 10:22

Hallo, also ich habe das Problem jetzt umschifft :)

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
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;


    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, 100, 300, 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;
}


Mach es jetzt über eine if-Abfrage. Wenn die Parameter nicht definiert sind (also gleich null) dann packe ich Zufallszahlen rein.

Grüße

7

07.08.2009, 11:41

Re: Kollisionskontrolle und Unterprogramm

Zitat von »"dani k."«



FRAGE2:
In meinem Minispiel fliegt eine Tontaube (Kreis) herum. Gibt es eine Funktion die erkennt wenn der Kreis das Clintfenster verlassen hat? Hatte mir schon überlegt mit der Geschwindigkeit zu rechnen und dann nach x sek abzubrechen.


Hallo,

ich hab eine Frage bzgl. meiner FRAGE2. Ich habe anhand der Geschw. und des Timerwerts eine Abbruchbedingung ausgerechnet. Jetzt hab ich ein Syntax-Problem. Mein Code:

Quellcode

1
2
3
4
5
6
7
8
//Definition der Abbruchbedingen
    abbruchzaehler = v0*t;

    if (abbruchzaehler >= 1500)
        {
            killTimer(hwnd,TIMER_1);
            t = 0;
                }

Mein Fehler: 75 undefined reference to_killTimer

Muss ich den Befehl anderst aufrufen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

07.08.2009, 11:49

Re: Kollisionskontrolle und Unterprogramm

Zitat von »"dani k."«

Muss ich den Befehl anderst aufrufen?


Ja die Funktion heißt KillTimer und nicht killTimer ;)

9

07.08.2009, 12:47

Re: Kollisionskontrolle und Unterprogramm

Zitat von »"dot"«

Zitat von »"dani k."«

Muss ich den Befehl anderst aufrufen?


Ja die Funktion heißt KillTimer und nicht killTimer ;)


Manchmal sind es halt doch die einfachen Dinge. Und ich such und such ... :)

Danke

Werbeanzeige