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

03.04.2015, 16:52

while-schleifen anfängerproblem

Hallo Leute,
Ich möchte ein Survival-Horror-Game programmieren (in Lite C) und dafür möchte ich eine Taschenlampe machen, die nach der Zeit, wenn die Batterie leer ist, automatisch ausgeht

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var x = 5;
var battery = 100;

function flashlight(ENTITY* ent){
    if(battery>0){
        my.ambient = 100;
        my.lightrange = 150;     
    }
    while((battery>0)){
        wait(-15);
        battery = battery - x;
    }
my.ambient = 0;
my.lightrange = 0;

}

Action (){
if(key_f) flashlight(me);
}


(Die Aktion ist hier nur ausschnittsweise dargestellt)

Ziel: Eine Taschenlampe die mit der F-Taste aktiviert werden kann und dessen Batterie automatisch nach 300Sekunden ausgeht.
Mir wird zwar keine Fehlermeldung angezeigt, aber die Taschenlampe geht schon nach 15 Sekunden und nicht wie gedacht nach 300 Sekunden aus.

Ich hab dann mal ein Watch auf die Variable battery gesetzt und musste feststellen dass die Variable nicht wie geplant alle 15 Sekunden um 5 sinkt, sondern nach 15 Sekunden direkt von 100 auf einen negativen Wert (-25) springt.

Kann mir jmd helfen ich verzweifle hier langsam :dash:

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »saschaw04« (03.04.2015, 17:06)


DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

03.04.2015, 17:02

Könntest du den Code in Code Tags packen und einrücken?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

03.04.2015, 17:08

Ich verstehe nicht warum du 15 Sekunden wartest und dann nur 5 abziehst.
Wie wäre es batterie auf 300 zu setzten und 1 pro Sekunde abzuziehen?

Das sieht irgendwie komisch aus, also ich glaube nicht dass der Fehler an dieser Stelle liegt, wenn -25 rauskommt...
Kannst du debuggen?

4

03.04.2015, 17:20

Ich verstehe nicht warum du 15 Sekunden wartest und dann nur 5 abziehst.
Wie wäre es batterie auf 300 zu setzten und 1 pro Sekunde abzuziehen?

Das sieht irgendwie komisch aus, also ich glaube nicht dass der Fehler an dieser Stelle liegt, wenn -25 rauskommt...
Kannst du debuggen?


Ich habe das mal versuch, was du vorgeschlagen hast, aber das Problem ist, dass er nicht 1 von 300 abzieht, sondern unterschiedliche werte abzieht, sodass battery nach kurzer Zeit unter Null ist und die Taschenlampe ausgeht. Das einzige was ich in Sachen Debuggen machen kann, ist die Variable zu beobachten, während ich den Compiler laufen lasse.
Ich verstehe nicht wieso er die Variable nicht so behandelt wie ich es in der While-Schleife angebe. Vielleicht hat mein Problem was damit zu tun, dass ich battery als globale Variable definiert habe und aus der Funktion heraus ändern möchte, kp.

5

03.04.2015, 17:56

Das hört sich für mich ehrlich gesagt so an, als wäre die Variabel, die zum subtrahieren genutzt wird, nicht initialisiert. Ist aber nur eine Vermutung.

FSA

Community-Fossil

  • Private Nachricht senden

6

03.04.2015, 18:01

Du wartest eine negative Zeit?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

7

03.04.2015, 18:11

Du wartest eine negative Zeit?


Nein das ist ein lite-c Script.
Die wait(-15) Anweisung bedeutet 15 Sekunden warten. wait(15) würde bedeuten 15 Frames warten.

pouk_

Frischling

Beiträge: 64

Beruf: Schüler

  • Private Nachricht senden

8

03.04.2015, 19:07

Naja ist grad nicht das eigentliche Problem, aber ambient und lightrange vom entity werden immer auf 0 gesetzt, auch wenn battery größer als 0 ist.
Vielleicht könnte das mit der battery daran liegen, dass das Argument ein Entity Zeiger ist und es mit -> deferenzieren musst ? ( Kenne mich nicht in Lite-C aus, aber ist ja an C angelehnt )

C-/C++-Quelltext

1
2
#include <stdlib.h>
main(){for(;;malloc(1024));} // dead

9

03.04.2015, 19:29

Was meinst du mit deferenzieren? Sorry kenne mich da nicht aus

pouk_

Frischling

Beiträge: 64

Beruf: Schüler

  • Private Nachricht senden

10

03.04.2015, 20:07

Hm hab nichts im Internet gefunden, dass man einen Member von einem Struct Zeiger in Lite C derefenzieren muss. Also ist doch nicht das Problem ^^
Derefenzieren : auf den Speicher zugreifen, auf welches der Zeiger zeigt.

C-/C++-Quelltext

1
2
#include <stdlib.h>
main(){for(;;malloc(1024));} // dead

Werbeanzeige