Sinus, Cosinus ?_?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Sinus, Cosinus ?_?

Beitrag von Leo »

Ich will die Raumschiffe in meinem Spiel so eine Sinus Welle auf und ab fliegen lassen, nur hab ich keine Ahnung wie :D

Wie soll ich das machen? Also wie soll ich die X,Y Werte bei jedem Schleifendurchlauf verändern?
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Der Y-Wert wird ja durch den X-Wert bestimmt, da Y = F(x) = sin(x) ist. Also brachst du nur den X-Wert angeben und per Sinusfunktion den Y-Wert errechnen. Dazu addierst du noch die abolute Position, etwa 512, 384, damit dein Raumschiff etwa in der Mitte des Bildschirmes ist (bei 1024 x 768 px.)
Allerdings musst du in PureBasic den Winkel im Bogenmaß angeben, solltest du bedenken. ;)

Ein Beispiel wäre etwa:

Code: Alles auswählen


  repeat ;Hauptschleife

    x = x + 1
  
    clearscreen(0,0,0)

    DisplaySprite(0, x + 512, (10* Sin(x/10)) + 384)

    flipbuffers()

  until quit = #true ; ende der Hauptschleife
Dabei würde jetzt das Raumschiff bei 500, 384 Pixeln starten und sinusförmig sich fortbewegen. Denn jeder Schleifendurchlauf wird die X-Stelle geändert, daraus die Y-Stelle berechnet und dort das Sprite angezeigt.
Wenn sich jetzt die X-Position nicht ändern soll, die des Raumschiffes, es also nur hoch und runter schwingt, dann musst du beim Anzeigen des Sprites einfach nur bei der X-Position die Variable x rauslassen. Dann bleibgt das Raumschiff immer konstant bei 512 Pixeln.
(Der Code oben ist provisorisch, da musst du natürlich noch einides hinzufügen. Das soll nur zeigen wie man es machen könnte)

//EDIT: Um die Amplitude (die Höhe um welche das Raumschiff ausgelenkt wird) zu ändern, musst du nur den Faktor "10" vor dem sin(x/10) ändern. Etwa auf 100. Um das Raumschiff langsamer zu machen, die "10" des "x/10" auf 100 setzen, schon ist es deutlich langsamer. Da musst du jetzt ein paar Werte ausprobieren, was dir da so am besten gefällt.

//Edit2: So sieht das dann als Programm aus:

Code: Alles auswählen

InitSprite() : InitKeyboard()

OpenScreen(1024, 768, 32, "Sinus-Test")

CreateSprite(0, 10, 10)

Repeat

  ClearScreen(100,122,130)
 
  x = x + 1
  DisplaySprite(0, 512, (100* Sin(x/100)) + 384)

  FlipBuffers(0)
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)
    quit = #True
  EndIf
Until quit = #True
Kannst du direkt kompilieren und ansehen was passiert. ;)

//Edit3: Wichtig ist, dass du den X-Wert nach Ablauf einer Schwingung wieder auf 0 setzt, sonst wird der irgendwann im Laufe des programms so riesig dass er den Rahmen der Long sprengt und es zu Fehlern kommen kann. ;)
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Ja danke, funtz. ;)

Nur ein Problem: Mit den Raumschiffen geht kein SpriteCollision mehr ?_?

EDIT: Hab jetz deine EDITS gesehen ^^ Aber das hatte ich alles schon raus xD

Danke nochmal
Antworten