Seite 2 von 3

Verfasst: 19.03.2008 03:04
von Kaeru Gaman
@SG

die find ich nett, die muss ich mir mal vornehmen.
mein ziel war es von anfang an, einzelpunkte zurückgeben zu können,
damit die rechner-proc auch für frames von animationen geeignet ist.
deshalb kommen bei mir auch punkte raus, keine linien.

@tobe
gute arbeit. durch das macro kannst du gut vereinfachen
und brauchst keine komplexeren werterückgaben wie ich.
aber sehr spezifisch. eine variable drehung wäre schöner. ;)

@scholly
> sieht arg schwierig aus...
das komplizierte ist die werterückgabe.
ich hab ne structureunion verwendet, damit ich zwei koordinaten als normale Long zurückgeben kann.
zu was anderem dienen die backslashes nicht.

Verfasst: 19.03.2008 09:57
von Kaeru Gaman
[SPÅM]
wus? noch koi neues posting? ...faule bande.... ;)
[/SPÅM]

Verfasst: 19.03.2008 14:34
von scholly
tobe hat geschrieben:edit: hatte beim sin&cos das *#pi/180 vergessen ;)
Auch wenn ich mein Verständnisunvermögen oute: Wozu sind die beiden Macros gut ?
Kaeru Gaman hat geschrieben:[SPÅM]
wus? noch koi neues posting? ...faule bande.... Wink
[/SPÅM]
Es soll Leute geben, die ab und an mal poofen müssen und die morgens nicht als erstes an die Kiste rennen können, sondern sich zur Maloche auf die Socken machen müssen.

Ansonsten wiedermal ein herzliches "Schankedön" an alle hier, meine ersten Bastelversuche (vorm Bubumachen heut Nacht :lol: ) waren schon recht erfolgreich.

Verfasst: 19.03.2008 15:02
von Kaeru Gaman
die beiden Macros sind zur umrechnung des winkels von grad in bogenmaß.

in grad beträgt der kriesumfang 360°,
im bogenmaß 2pi, was dem Umfang eines Kreises mit Radius 1 entspricht.
die internen winkelfunktionen erwarten - wie bei den meisten programmiersprachen - argumente im bogenmaß, nicht in grad.

Verfasst: 19.03.2008 16:57
von tobe
Kaeru hat das mit dem bogenmaß wunderbar erklärt ;)
freut mich das euch mein beispiel gefallen hat,
ich hab den code nochmal etwas nachbearbeitet:

Code: Alles auswählen

EnableExplicit
;/
Procedure.f gSin(Winkel.f)
  ProcedureReturn Sin(Winkel*0.01745329)
EndProcedure
;/
Procedure.f gCos(Winkel.f) 
  ProcedureReturn Cos(Winkel*0.01745329)
EndProcedure
;/
Define Window, Width, Height, Flag, Event, Quit, n, b
Width = 800
Height = 600
Flag = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered
If InitSprite()
  If OpenWindowedScreen(WindowID(OpenWindow(#PB_Any, 0, 0, Width, Height, "atom", Flag)), 0, 0, Width, Height, 1, 0, 0)
    ;LoadSprite(0, "Stylised_Lithium_Atom.bmp")
    CreateSprite(1, 32, 32)
    StartDrawing(SpriteOutput(1))
      For n = 1 To 10
        Circle(16,16,15-n, RGB(n * 20, n * 20, n * 20))
      Next n
    StopDrawing()
    CreateSprite(2, 300, 300)
    StartDrawing(SpriteOutput(2))
      b = 4
      For n = 0 To 359
        Box(150 + gSin(n)*45, 150 + gCos(n)*145, b, b, $FF0000)
        Box(150 + gSin(n)*70 + gCos(n)*100, 150 + gCos(n)*80, b, b, $FF)
        Box(150 + gSin(n)*125, 150 + gCos(n)*50 - gSin(n)*65, b, b, $FF00)
      Next
    StopDrawing()
    Repeat
      Event = WindowEvent()
      While Event
        If Event = #PB_Event_CloseWindow
          Quit = 1
        EndIf
        Event = WindowEvent()
      Wend
      ClearScreen($0)
      If n >= 359
        n = 0
      Else
        n + 1 ; speed der kugelsprites
      EndIf
      ;DisplaySprite(0, 285, 164)
      DisplayTransparentSprite(2, 265, 165)
      DisplayTransparentSprite(1, 400 + gSin(n+55)*45, 300 + gCos(n+55)*145)
      DisplayTransparentSprite(1, 400 + gSin(n+250)*70 + gCos(n+250)*100, 300 + gCos(n+250)*80)
      DisplayTransparentSprite(1, 400 + gSin(n+150)*125, 300 + gCos(n+150)*50 - gSin(n+150)*65)
      Delay(1)
      FlipBuffers()
    Until Quit
  EndIf
EndIf
bei dem versuch die berechnung in eine procedur zu packen bin ich jetzt aber auch erstmal gescheitert, aber ich werd es evtl. später nochmal probieren ;)

Verfasst: 19.03.2008 17:36
von scholly
tobe hat geschrieben:Kaeru hat das mit dem bogenmaß wunderbar erklärt ;)
Ich hab trotzdem nicht verstanden, WARUM.
Der erste Code Funktioniert doch genausogut wie der 2. :o
tobe hat geschrieben:freut mich das euch mein beispiel gefallen hat
:allright: Ähre, wem Ähre gebührt :D
tobe hat geschrieben:ich hab den code nochmal etwas achbearbeitet
Ich hab meinem Spieltrieb auch mal freien Lauf gelassen:

Code: Alles auswählen

EnableExplicit
Define Window, win_Width, win_Height, scr_width, scr_height,Flag, Event, Quit, n,PB_icon_img_id, DC
Define f1.f, f2.f, f3.f 
Define offset_x.c, offset_y.c

win_Width = 800
win_Height = 600
scr_width = 290
scr_height = 330
Flag = #PB_Window_SystemMenu  | #PB_Window_ScreenCentered
Window = OpenWindow(#PB_Any, 0, 0, win_Width, win_Height, "Pure-Atom", Flag)
If Window And InitSprite() And InitSound()
  If OpenWindowedScreen(WindowID(Window), 20, 20, scr_Width, scr_Height, 0, 0, 0)
    
    ;LoadSprite(1, "Stylised_Electron.bmp")
    ;hier im Beispiel nur einfache, ausgefüllte Kreise 
    CreateSprite(1, 32, 32)
    StartDrawing(SpriteOutput(1))
      Circle(16,16,16, #Red)
      Box( 8,14,16,4,RGB(200,200,200)) ;waagerecht
      Box(14, 8,4,16,RGB(200,200,200)) ;senkrecht
    StopDrawing()
    
    CreateSprite(2, 32, 32)
    StartDrawing(SpriteOutput(2))
      Circle(16,16,16, #Blue)
      Box( 8,14,16,4,RGB(244,244,244)) ;waagerecht
      Box(14, 8,4,16,RGB(244,244,244)) ;senkrecht
    StopDrawing()
    
    CreateSprite(3, 32, 32)
    StartDrawing(SpriteOutput(3))
      Circle(16,16,16, #Green)
      Box( 8,14,16,4,RGB(2,2,2)) ;waagerecht
      Box(14, 8,4,16,RGB(2,2,2)) ;senkrecht
    StopDrawing()
    
    ;LoadSprite(1, "Stylised_Atomkern.bmp")
    PB_icon_img_id = ExtractIcon_(0,#PB_Compiler_Home+"PureBasic.exe",0)
    CreateImage(4,32,32)
    CreateImage(5,48,48)
    CreateSprite(6,48,48)
    DC=StartDrawing(ImageOutput(4))
      DrawIcon_(DC,0,0,PB_icon_img_id)
      CopyImage(4,5)
      ResizeImage(4,48,48,#PB_Image_Smooth)
    StopDrawing()
    StartDrawing(ScreenOutput())
      DrawImage(ImageID(5),0,0,48,48)
    StopDrawing()
    GrabSprite(6,0,0,48,48)
    
    ;etwas Musik kann nicht schaden
    LoadSound(1, #PB_Compiler_Home+"Examples\Sources - Advanced\Waponez II\Data\Explosion.wav")
    LoadSound(2, #PB_Compiler_Home+"Examples\Sources - Advanced\Waponez II\Data\Lazer.wav")
    
    offset_x = 128
    offset_y = 148
    
    Repeat
      Event = WindowEvent()
      While Event
        If Event = #PB_Event_CloseWindow
          Quit = 1
        EndIf
        Event = WindowEvent()
      Wend
      ClearScreen(#Black)
      
      ;Bewegung des roten Elektrons
      If f1 >= 359
        f1 = 0
      Else
        f1 + 0.01 ;je größer desto schnelles Elektron
      EndIf
      
      ;Bewegung des blauen Elektrons
      If f2 >= 359
        f2 = 0
      Else
        f2 + 0.02 ;je größer desto schnelles Elektron
      EndIf
      
      ;Bewegung des grünen Elektrons
      If f3 >= 359
        f3 = 0
      Else
        f3 + 0.03 ;je größer desto schnelles Elektron
      EndIf
      
      ;Elektronenbahnen zeichnen
      StartDrawing(ScreenOutput())     
        For n = 0 To 359
          Box(offset_x+16 + Sin(n)*45, offset_y+16 + Cos(n)*145,4,4, #Red)
          Box(offset_x+16 + Sin(n)*70 + Cos(n)*100, offset_y+16 + Cos(n)*80,4,4, #Blue)
          Box(offset_x+16 + Sin(n)*125, offset_y+16 + Cos(n)*50 - Sin(n)*70,4,4, #Green)
        Next
      StopDrawing()
            
      ;Electronen laufen lassen
      DisplayTransparentSprite(1,offset_x + Sin(f1)*45, offset_y + Cos(f1)*145)
      DisplayTransparentSprite(2,offset_x + Sin(f2)*70 + Cos(f2)*100, offset_y + Cos(f2)*80)
      DisplayTransparentSprite(3,offset_x + Sin(f3)*125, offset_y + Cos(f3)*50 - Sin(f3)*70)
      DisplayTransparentSprite(6,offset_x -12,offset_y-6)
      
      ;etwas Stimmung in die Bude....
      ;kollidiert 1 mit 2?
      If SpriteCollision(1, offset_x + Sin(f1)*45, offset_y + Cos(f1)*145, 2, offset_x + Sin(f2)*70 + Cos(f2)*100, offset_y + Cos(f2)*80)
        PlaySound(1)
      EndIf
      ;kollidiert 2 mit 3?
      If SpriteCollision(2,offset_x + Sin(f2)*70 + Cos(f2)*100, offset_y + Cos(f2)*80, 3,offset_x + Sin(f3)*125, offset_y + Cos(f3)*50 - Sin(f3)*70)
        PlaySound(2)
      EndIf
          
      Delay(1)
      FlipBuffers()
    Until Quit
  EndIf
EndIf
tobe hat geschrieben: bei dem versuch die berechnung in eine procedur zu packen bin ich jetzt aber auch erstmal gescheitert, aber ich werd es evtl. später nochmal probieren ;)
mir hats so gereicht, wie es ist :lol:

Verfasst: 19.03.2008 18:02
von tobe
den effekt vom bogenmaß erkennt man wenn du beim zeichnen der Elektronenbahnen nur eine halbe Ellipse zeichnen willst, zb:

Code: Alles auswählen

        For n = 0 To 179
          Box(offset_x+16 + Sin(n)*45, offset_y+16 + Cos(n)*145,4,4, #Red)
          Box(offset_x+16 + Sin(n)*70 + Cos(n)*100, offset_y+16 + Cos(n)*80,4,4, #Blue)
          Box(offset_x+16 + Sin(n)*125, offset_y+16 + Cos(n)*50 - Sin(n)*70,4,4, #Green)
        Next
da wird bei deiner version die Ellipsenbahn mehrfach durchlaufen,
bei meiner version wird nur der halbe kreis gezeichnet
richtig logisch erkären kann ich den mist leider auch nicht,
das hab ich damals (20 jahre ist das her) auch nie ganz verstanden, bzw verstehen wollen ;)

Verfasst: 19.03.2008 18:22
von scholly
tobe hat geschrieben:das hab ich damals (20 jahre ist das her) auch nie ganz verstanden, bzw verstehen wollen ;)
Bei mir sinds >35. :lol:
Is aber auch egal, da ich in jedem Code auch solche Bemerkungen abspeicher - hilft bestimmt irgendwannmal...

Verfasst: 19.03.2008 19:11
von Kaeru Gaman
das Bogenmaß ist das Maß (also die Länge) eines Bogens zum Winkel.
wenn du nen 180 winkel hast, ist der Bogen, den er beschreibt,
genau pi*Radius, also pi für Radius 1. bei nem 90 winkel sind es pi/2*Radius.

deswegen heißt das Bogenmaß, weil es den Bogen misst.

...bei mir sinds auch gut 20 Jahre her, aber verstanden hab ichs erst,
als ich es beim spiele- und demo-proggen angewendet hab....
die schule erschafft kein verhältnis zu solchen informationen,
dort bekommt man se nur vor den Latz geknallt,
ohne den geringsten hinweis wozu es nützlich sein könnte.

Verfasst: 19.03.2008 19:36
von STARGÅTE
sry das ich jetzt dazwischen frage :

Wo genau seit ihr jetzt ^^ ?

Ihr wollt eine Procedure die zu einer Ellipse welche gedreht sein kann, den punkt für jede mögliche Position ausgegeben haben , richtig ?

Oder ist das jetzt schon alles geklärt ?

Sonst würde ich meine Procedure noch um 2 Parameter erweitern (Positionswinkel und Punkt-Pointer) sodass man dann bei einer belibigen Ellipse einen winkel angeben kann, von dem man die Position haben möchte