Flugbahn von Gegnern vorgeben

Anfängerfragen zum Programmieren mit PureBasic.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Das ist etwas dass ich bis jetzt ebenfalls nicht begriffen habe.
Ich habe diverse Beispiele inklusive deinem, wo immer mit IncludeBinary
gearbeitet wird. Dies gilt sowohl für Data's wie Bilder usw.
Ich hatte es jetzt einfach mit IncludeFile gelöst, läuft einwandfrei. Ich verstehe den Unterschied nicht.
Bzw. wo liegen die Unterschiede bei IncludeBinary und IncludeFile ?
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

http://www.purebasic.com/german/documen ... ludes.html
IncludeFile fügt die genannte Programmdatei (Datei mit PureBasic-Sourcecode) an der aktuellen Stelle in den Programmcode ein. XIncludeFile macht genau dasselbe, außer dass es vermeidet, dieselbe Datei mehrfach einzufügen.
IncludeBinary fügt die genannte Datei an der aktuellen Stelle in das Programm ein. Das Einfügen sollte dabei innerhalb eines Data-Blocks erfolgen.
//EDIT: IncludeBinary ist also dazu gedacht, alles, was nicht Quellcode ist, zum Programm dazuzulinken, z.B. Sounds, Grafiken, etc...
IncludeFile dagegen ist AUSSCHLIESSLICH für PB-Quellcodes gedacht.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Danke für die Erklärung. :)
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Gern geschehn <)
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Ich wollte mal einen Flugbahnversuch mit einer Sinuskurve starten.
Ich hab dazu die Formel von @Laurin angeschaut und dies mal in ein Beispiel eingefügt. Das Problem ist,
wenn ich die Y Achse vergrössere, damit Sprite ein wenig schneller nach unten fährt. Hüpft das Sprite nur
noch umher. Wenn ich Y sehr klein lasse wie im Beispiel hab ich einen schönen Sinus. Was kann ich tun,
damit Sprite schneller und dennoch sauber nach unten läuft?

Beispiel:

Code: Alles auswählen

InitSprite() : InitKeyboard() 

OpenScreen(800,600,32,"")

Define.f m=200, n=300, y=10

eck = CreateSprite(#PB_Any,40,40)
StartDrawing(SpriteOutput(eck))
Box(0,0,40,40,RGB(255,255,255))
StopDrawing()


Repeat
    ClearScreen(0)
    ExamineKeyboard()
    
    x = m*Sin(y)+n
 
    DisplaySprite(eck,x,y)
       
    y+0.04
    ;y+2
 
    Delay(1)
    FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Beim DisplaySprite den Sträkungsfaktor einbauen

Code: Alles auswählen

InitSprite() : InitKeyboard() 

OpenScreen(800,600,32,"") 

Define.f m=200, n=300, y=10 

eck = CreateSprite(#PB_Any,40,40) 
StartDrawing(SpriteOutput(eck)) 
Box(0,0,40,40,RGB(255,255,255)) 
StopDrawing() 


Repeat 
    ClearScreen(0) 
    ExamineKeyboard() 
    
    x = m*Sin(y)+n 
  
    DisplaySprite(eck,x,y*20)  ; DAA !
        
    y+0.04 
    ;y+2 << NICHT HIER 
  
    Delay(1) 
    FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Hammer!!

Danke für die prompte Antwort. :D
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du musst dir klarmachen, welcher faktor wo was tut.

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenScreen(1024,768,32,"SinDemo")

ClearScreen($201010)

StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)

For x=0 To 1023     ; das x zum Plotten

; ich mach die berechnungen mal getrennt, zur besseren Lesbarkeit

xf.f = x  ; in ne float überführen, damit die teilung sicher funktioniert

  y1 =  20 * Sin( xf )
  y2 =  20 * Sin( xf / 5 )
  y3 =  20 * Sin( xf / 25 )
  y4 =  50 * Sin( xf / 25 )
  y5 = 100 * Sin( xf / 25 )

  Plot( x, y1 +  60, $FF8080 )
  Plot( x, y2 + 170, $FF8080 )
  Plot( x, y3 + 280, $FF8080 )
  Plot( x, y4 + 410, $FF8080 )
  Plot( x, y5 + 620, $FF8080 )

Next

  DrawText( 10,  10, "y1 =  20 * Sin( xf )", $C06060 )
  DrawText( 10, 120, "y2 =  20 * Sin( xf / 5 )", $C06060 )
  DrawText( 10, 230, "y3 =  20 * Sin( xf / 25 )", $C06060 )
  DrawText( 10, 340, "y4 =  50 * Sin( xf / 25 )", $C06060 )
  DrawText( 10, 500, "y5 = 100 * Sin( xf / 25 )", $C06060 )

StopDrawing()

FlipBuffers()

Repeat
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
das Argument für Sin() ist der Winkel in Radiant.
eine Phase des Sinus (also, ein berg ein tal, bis er wieder von vorne anfängt)
dauert immer von 0 bis 2*PI.

wenn du die x-koordinate direkt eingibst, dann wechselt das so schnell, dass nur son muster rauskommt.
alle 6 pixel fängt es von vorne an, so kann man keine zusammenhängende kurve plotten.

wenn du x durch 5 teilst, lässt du ihm sozusagen 5x so lange zeit.
es dauert jetzt 31 pixel, bis es von vorne anfängt, da kann man schon ne kurve erkennen.

bei /25 dauert eine phase ganze 157 pixel, das ist schon ne schön sanfte kurve.

das andere, der faktor davor, ist die Amplitude, also die Höhe der Kurve.
in den ersten drei fällen ist das 20, die kurve geht also von -20 bis +20 um ihre achse.
beim 4ten ist das 50, beim 5ten 100, der effekt ist ja klar zu erkennen.

dann gibt es noch die verschiebung, das ist das +sowieso, was ich direkt beim Plot reingeschrieben hab.
das bestimmt, wohin die Achse der Kurve verschoben wird.

Cos ergibt übrigens ein ähnliches bild, die gleiche kurve nur um 1/4 (90°) Phasenverschoben.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Danke für dein Beispiel und die super Beschreibung dazu. :D
Antworten