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

01.06.2013, 13:22

Schöner Farbübergang

Hio!
Wie bekomme ich es am ehesten hin, einen schönen Farbübergang zu haben?
So was da ist jedenfalls Käse: (gleicht mehr einem Test für Epileptiker)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    if(m_colorClock.getElapsedTime().asMilliseconds()>=51)
    {
        m_spotlightColorR=static_cast<sf::Uint8>(2*std::sinf(m_colorClock2.getElapsedTime().asMilliseconds()));
        //m_spotlightColorG+=static_cast<sf::Uint8>(3*std::sinf(m_colorClock2.getElapsedTime().asMilliseconds()));
        //m_spotlightColorB+=static_cast<sf::Uint8>(7*std::sinf(m_colorClock2.getElapsedTime().asMilliseconds()));
    
    m_spotlightSprite.setColor(sf::Color(m_spotlightColorR, m_spotlightColorG, m_spotlightColorB, 175));
    
    m_colorClock.restart();
    }

Das plötzliche neu anfangen dürfte ja wohl an einem Überlauf liegen, aber "wie kann ich den verhinden, sodass trotzdem alles smooth bleibt"?
Meiner Meinung nach, ist meine Hauptproblematik das ganze auf 3 Werte zu übertragen, ich hätte eben auch gerne noch Variation und so drin...

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (01.06.2013, 17:05)


wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

2

01.06.2013, 13:39

Versuchs mal mit Sinus und Kosinus und einem (ab-)steigenden Winkel.
Das Resultat setzt du dann in die RGB-Werte ein.
Vielleicht musst du dann noch mit einem Faktor (z.B die Zeit) multiplizieren, damit der Farbübergang schneller bzw. langsamer vonstatten geht.
Wenn du das mit der Zeit machst, dann ist das Ganze auch noch von den verschiedenen Rechenleistungen der PCs unabhängig.

3

01.06.2013, 17:00

Guck mal auf meinen Code. :rolleyes:

MfG
Check

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

01.06.2013, 19:03

Bei dem gezeigten Code gibt es so einige Probleme.

1. Die Schritte, die du im Sinus machst sind viel zu groß für die Periode des Sinus. Du springt da praktisch wahlos auf Stellen in der Sinuskurve hin und her. Überleg dir mal, wie du mit Hilfe der Zeit z.B. einen Periodendurchlauf die Sekunde machst.
2. Der Sinus nimmt Werte zwischen -1 und 1 an. Die Multiplikation mit 2 ergibt Werte zwischen -2 und 2. Der Cast auf Uint eliminiert nun alle Zwischenwerte und es bleiben faktisch 5 Werte übrig. Smooth wird das so sicherlich nicht. Überleg mal wie du den Sinus mit -1 bis 1 auf deine 255 Farbwerte abgebildet kriegst.

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

5

01.06.2013, 19:13

@ Checkmateing
Sorry, habe den Code nur überflogen, da ist das Sinus wohl untergegangen :whistling:

6

01.06.2013, 20:18

Keine Ahnung, ich stehe total auf dem Schlauch und sehe den Wald wohl vor lauter Bäumen nicht...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
if(m_colorClock.getElapsedTime().asMilliseconds()>=1000/180)
{
    m_spotlightColorR=static_cast<int>((std::sinf(++m_sin)+1)*255/180);
        
    if(m_sin>=180)
        m_sin=0;

m_spotlightSprite.setColor(sf::Color(m_spotlightColorR, m_spotlightColorG, m_spotlightColorB, 175));
    
m_colorClock.restart();
}

Jedes 180stel einer Sekunde solls aufgerufen werden, dann soll der Wert m_sin inkrementiert werden und nun habe ich einen Wert aus der Periode von -1 bis 1 +1, also einen Wert zwischen 0-2, wodurch ich mit multiplizieren von 255 und folgendem dividieren durch 180 einen Wert aus 0-255 habe. Das weise ich dann meinem Farbwert zu und lege dann die Farbe fest.
Das Ergebnis ist... Naja, ein Sprite ohne Veränderung. Alles bleibt gleich. Die Werte sind wohl zu klein.
Wie ich das Ganze auf die anderen Farbwerte übertragen kann um so Abwechslung reinzubringen, da habe ich schon eine Idee, die beim näherem Durchdenken aber wohl eher zu was ganz hässlichem führen würde. Ich nehme 'ne Pseudozufallszahl zwischen 1 und 3 und durchlaufe meinen oberen Prozess, wenn er dann korrigiert wurde, auf den jeweiligen, zugehörigen Farbwert.

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (01.06.2013, 20:35)


7

01.06.2013, 20:55

1. Wieso teilst du außerhalb des Sinus durch 180, 2 wäre sinnvoller?
2. Bogenmaß
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

01.06.2013, 21:53

Was du da rechnest ist mir absolut unverständlich, aber probiere mal das:

C-/C++-Quelltext

1
2
3
const double Radians = m_colorClock.getElapsedTime().asSeconds() * (M_PI * 2.0); //Eine volle Umdrehung (2*Pi) auf eine Sekunde abbilden 
const double PositiveSinus = (std::sin(Radians) + 1.0) * 0.5; //Sinuskurve im Wertebereich 0 bis 1
m_spotlightColorR = static_cast<int>(PositiveSinus * 255.999999999); //Wertebereich auf 0 bis fast 256 vergrößeren.

9

01.06.2013, 22:14

Hach ich Dödel, vergesse ich glatt, dass sinf Bogenmaß will.
@Spiele Programmierer: Ich steh' eig. nicht so auf Vorgefertigtes. Meine Version geht nun und damit bin ich happy.

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (02.06.2013, 00:06)


Werbeanzeige