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

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

01.03.2012, 21:12

Blinklicht erstellen

Ich wollte ein Blinklicht erstellen (nach Kapitel Direct3D - Beleuchtung).
Dazu habe ich die Streu-,Hintergrund- und Glanzfarbe auf blau geändert.
Nun wollte ich mit einer statischen Variable in der move-Methode nach jedem 80.ten Aufruf das Licht aktivieren (bzw. deaktivieren).

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define DEV g_pD3DDevice
...
static int count = 0;
count++;


if(count == 80)
{
count = 0;
BOOL bLight;
DEV->GetLightEnable(0,&bLight);
if(bLight)
g_pD3DDevice->LightEnable(0,FALSE);
else
DEV->LightEnable(0,TRUE);
}


Nun, das Licht bleibt. Bei einer Rate von 30-60 FPS dürft des zwischen 1-3s wechseln.

Ich hoffe jmd kann mir helfen

Danke im Voraus

2

01.03.2012, 21:57

Kleine Frage nebenbei: Warum das define?
Warum die Nutzung nur beim else und vor der inneren If-Bedingung?
Die If-Bedingung sollte man sogar weglassen können.

C-/C++-Quelltext

1
2
3
4
5
g_pD3DDevice->LightEnable(0, !bLight);
//Gehen wir die If-Bedingung kurz durch: Wenn bLight==true, dann g_pD3DDevice->LightEnable(0,FALSE), also der Gegenwert
//von bLight im Falle von true. Wenn bLight nun aber gleich false, dann g_pD3DDevice->LightEnable(0,TRUE), also auch der 
//Gegenwert von bLight, da es ja false ist, wodurch TRUE übergeben wird. Also reicht diese Zeile, dass aber nur zur 
//kleinen aber feinen "Optimierung". Ich hoffe mein Gedankengang war auch richtig. x]

Schon mal am Debuggen gewesen?
Ich nehme mal an, dass SetLight vorher aufgerufen wird. Ich sag es nur, kann ja auch die Fehlerquelle sein.

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (03.03.2012, 01:50)


FSA

Community-Fossil

  • Private Nachricht senden

3

02.03.2012, 11:45

Warum static?

Zitat

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

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

4

03.03.2012, 00:37

@CheckMateing Stimmt, das ergibt sich ja draus

Static, weil die Variable nach 80 Durchläufen die Bedingung erfüllt und wenn sie nicht static wäre, dann würde sie bei jedem Aufruf 0 sein, aber so wird ihr Wert "global" gespeichert.

5

03.03.2012, 01:49

Wieso nach jedem Aufruf 0?
Der Code ist 1:1 aus einem Programm? Freilich ergibst dann Sinn, aber dann hast du das nicht unbedingt elegant gelöst. Faustregel ist doch, jedenfalls meinte man mal zu mir: Static und Global bestmöglich vermeiden.
Warum nun aber das define?

MfG
Check

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

6

03.03.2012, 13:38

also static, weil bei jedem Aufruf die Variable von neu deklariert wird. Und von neu initialisiert. Die Variable löscht sich ja beim Verlassen der Funktion, wegen dem Gültigkeitsbereich.
Und nein, der Code ist nicht 1:1 aus einem Programm, es ist das Programm mit den Kugeln, allerdings wollte ich mal ein Blaulicht simulieren.

define, weil ich nicht Lust hab jedes mal g_pD3DDevice zu schreiben, mit DEV geht das doch viel schneller.

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

7

03.03.2012, 13:48

Ja static zum Testen sollte an dieser stelle erlaubt sein. :)
Ansonsten sollte man es vermeiden.

Der Code sieht mal von der Funktion her korrekt aus....

- Kannst du denn das Licht ausschalten? (beim initialisieren)
- Gibt die Funktion GetLightEnable gültige Werte zurück?
Da die Rückgabe über nen Pointer geschieht vermute ich das der Return Wert ein Fehlercode ist -> diesen checken.
(zB. LichtID existiert nicht oder andere Fehler -> bLight = false -> return FehlerCode)

Mfg Rushh0ur

FSA

Community-Fossil

  • Private Nachricht senden

8

03.03.2012, 13:54

Zitat

also static, weil bei jedem Aufruf die Variable von neu deklariert wird.

Ich dachte sie wäre global :whistling:

Zitat

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

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

9

03.03.2012, 16:04

mit FAILED(hResult = ...) und TB_ERROR_DIRECTX(); veränderd sich nichts (also kein Fehler), ich habs jetzt als globale Variable und ich hab sogar die Bedingung g_icount == 80 weggelassen und es blinkt nicht(selbst ohne die Bedingung müsste es ein Flimmern geben).

FSA

Community-Fossil

  • Private Nachricht senden

10

03.03.2012, 17:34

Guck mal ob du das Licht überhaupt an und ausschlaten kannst ;) Wenn nicht dann wird es wohl Fehler werfen.

Zitat

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

Werbeanzeige