[gelöst] Sowas wie ein Lithium-Atom coden...

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

[SPÅM]
wus? noch koi neues posting? ...faule bande.... ;)
[/SPÅM]
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag 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 ;)
PureBasic 4.40 (Windows - x86)
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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:
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag 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 ;)
PureBasic 4.40 (Windows - x86)
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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...
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
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
Antworten