[Monkey] Diverse nützliche Funktionen

Übersicht Andere Programmiersprachen Codearchiv & Module

Neue Antwort erstellen

 

DukeS87

Betreff: Diverse nützliche Funktionen

BeitragMi, Feb 18, 2015 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin moin, ich dachte mir, ich stelle mal ein paar nützliche Code-Funktionen für die Allgemeinheit zur Verfügung.

ELLIPSE ZEICHNEN
Paramter: posx,posy << Mittelpunkt der Ellipse, angabe in absoluten Pixelen vom oberen linken Bildschirmrand.
width,height << maximale Ausdehnung (Breite/Hoehe) , Angabe in absoluten Pixel
Code: [AUSKLAPPEN]
Function Drw_Ellipsis( posx:Float, posy:Float, width:Float, height:Float)
      Local x:Float
      Local y:Float
      Local rx:Float = width / 2
      Local ry:Float = height / 2
      Local r:Int = Abs(rx) + Abs(ry)
      x = 0
      y = r
      Local d:Int
      Local ddf_x:Int
      Local ddf_y:Int
   
      d = 1 - r
      ddf_x = 3
   ddf_y = -2 * r + 5
   
      While y >= x And r
       DrawPoint( posx + x * rx/r, posy + y * ry/r )
       DrawPoint( posx + y * rx/r, posy + x * ry/r )
       DrawPoint( posx + y * rx/r, posy - x * ry/r )
       DrawPoint( posx + x * rx/r, posy - y * ry/r )
       DrawPoint( posx - x * rx/r, posy - y * ry/r )
       DrawPoint( posx - y * rx/r, posy - x * ry/r )
       DrawPoint( posx - y * rx/r, posy + x * ry/r )
       DrawPoint( posx - x * rx/r, posy + y * ry/r )
          
       If d < 0
          d= d + ddf_x
          ddf_x= ddf_x+ 2
          ddf_y=ddf_y+ 2
          x=x + 1
       Else
          d= d+ ddf_y
          ddf_x=ddf_x+ 2
          ddf_y=ddf_y+ 4
          x=x+ 1
          y=y- 1 
       EndIf
   Wend
End Function


BLITZE ZEICHNEN
Parameter: sx,sy ; Position des Ursprung des Blitzes in Pixel
fx,fy: Endpunkt des Blitzes (bis hierhin wird er gezeichnet)
depth: gibt die "stärke" der Rekursion an; Wert sollte größer 0 seind, aber nicht zu Groß, da sonst sehr rechenintensiv ; 4 ist ein ganz guter Ausgangswert.
Code: [AUSKLAPPEN]
Function Drw_Lightning(sx#,sy#,fx#,fy#,depth=4)
   
   'Local dx#,dy#,dist#,ox#,oy#,x#,y#,udx#,udy#
   Local i
   
   'play around with these numbers to see the effects
   Local shakiness#=-2.5 ;
   Local branchchance=6;
   Local wr1 = 16
   Local wr2 = 16
   Local hr1 = 4
   Local hr2 = 24


   If(depth<=0) Then Return ';;as said - don't want to go too deep in the stack...

   Local dx#=fx-sx
   Local dy#=fy-sy
   Local dist#=Sqrt(dx*dx+dy*dy)
   
   If(dist=0) Then Return ' ;no need To do any lightning If our start And ending points are on top of each other...And also avoid nasty division by zeroes...

   Local udx#=dx/dist'   ;unit vectors in direction of lightning...
   Local udy#=dy/dist


   Local x#=sx
   Local y#=sy
   Local ox#=x
   Local oy#=y

   For i=1 To dist
      x=x+udx+Rnd(-shakiness,shakiness)
      y=y+udy+Rnd(-shakiness,shakiness)
      
      ll_ColorCentre()
      DrawLine x,y,ox,oy
      
      ll_ColorInnerEdge()
      DrawLine x-udy,y+udx, ox-udy,oy+udx
      DrawLine x+udy,y-udx,ox+udy,oy-udx
      
      ll_ColorOuterEdge()
      DrawLine x-udy*2.0,y+udx*2.0, ox-udy*2.0,oy+udx*2.0
      DrawLine x+udy*2.0,y-udx*2.0,ox+udy*2.0,oy-udx*2.0
      
      ox=x
      oy=y
      
      If(Rnd(1,100)<branchchance) Then
         Drw_Lightning(ox,oy,ox+Rnd(-wr1,wr2),oy+Rnd(-hr1,hr2),depth-1)
      EndIf
   
   Next
End Function

Function ll_ColorCentre()
   SetColor 255,255,255
End Function

Function ll_ColorInnerEdge()
   SetColor 0,128,255
End Function

Function ll_ColorOuterEdge()
   SetColor 0,32,128
End Function


MouseCursor innerhalb...
Code: [AUSKLAPPEN]
Function MOBox:Bool(_X:Float, _Y:Float, _Width:Float, _Height:float)
#rem
An dieser stelle wird nach 4 Bedingungen geprueft. Da diese alle 'gleichzeitig' erfuellt werden muessen, habe ich sie via UND verknuepft.Denn der mauscursor ist nur innerhalb eines Rechtecks, wenn er a) rechts vom linken rand ( _X < MouseX() ), links vom rechten Rand ( _X + _Width > MouseX() ) und analog zwischon oberer und unterer Kante ist.
#end
    If _X < MouseX() And _X + _Width > MouseX() And _Y < MouseY() And _Y + _Height > MouseY()
      Return True 'wenn Cursor nun innerhalb, gebe True zurueck
   Else
      Return False
   Endif

End Function
'Aufruf bsp: if MOBox(10,10,100,100) then drawtext "hitting box",10,10


#Rem monkeydoc
   This Functions Checks if the MouseCursor is within this circle dimensions.
        Use:  MOCircle(100,100,20) <<
#End
Function MOCircle:Bool(ix:Int,iy:Int,ir:Int)

       'Zunaechst wird die distanz zwischen der Mauscursorposition und einem Punkt (ix,iy) nach pythagoras errechnet.
   Local dx:Float = ix - MouseX()
   Local dy:Float = iy - MouseY()               
   Local distance:float = Sqrt( dx*dx + dy*dy )      'berechne den Abstand
                  
   'Wenn Abstand geringer als Radius  (ir) >> Kollision, da er sich ja dann innerhalb des Kreises befindet.
   If distance < ir
      Return True
   Else
      Return False
   Endif
End Function


#rem monkeydoc
   Checks, if the Mousecursor is inbetween an Triangle (x1,y1,y2,y2,y3,y3)
#end
Function MOTriangle:Bool(x1:Float,y1:Float,x2:Float,y2:Float,x3:Float,y3:Float)

   local b0:float =  (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)
   Local b1:Float = ((x2 - MouseX()) * (y3 - MouseY()) - (x3 - MouseX()) * (y2 - MouseY())) / b0
   If b1 <= 0 Then Return False
   
   Local b2:Float = ((x3 - MouseX()) * (y1 - MouseY()) - (x1 - MouseX()) * (y3 - MouseY())) / b0
   If b2 <= 0 Then Return False

   Local b3:float = ((x1 - MouseX()) * (y2 - MouseY()) - (x2 - MouseX()) * (y1 - MouseY())) / b0
   If b3 <= 0 Then Return False
   
   Return True

End Function


So das wars erstmal. Ich hoffe vorallem die Neulinge können damit was anfangen.

Edit: So, ich füge immer wieder mal was hinzu. hab leider nicht immer allzuviel zeit hier was zu schreiben. ich hoffe bis Ende nächster Woche hab ich das hier ganz aufgearbeitet.
Danke an dieser Stelle für eure Kommentare.
mfG Stephan
  • Zuletzt bearbeitet von DukeS87 am Do, Feb 19, 2015 19:02, insgesamt 4-mal bearbeitet

Holzchopf

Meisterpacker

BeitragMi, Feb 18, 2015 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Schön gemacht, aber könntest du etwas weniger zurückhaltend mit Kommentaren sein? Wink Gerade Neulingen würde es sehr entgegenkommen, wenn zu jeder Funktion nicht nur steht was sie tut, sondern auch, wie sie das tut. Am liebsten natürlich jede Formel / Berechnung erklären Smile Ich spreche da besonders die MOTriangle-Funktion an. Und bei MOCircle hat sich m.E. ein Fehler eingeschlichen, beim Kommentar "Wenn Abstand geringer als 2*Radius >> Kollision".

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

DukeS87

BeitragMi, Feb 18, 2015 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Au danke fuer die anmerkung. werde ich direkt verbessern. Hast natuerlich recht, gerade als anfaenger weiss man immer nicht so gut wie man eine funktion aufzurufen hat. Das hab ich vllt etwas aus den Augen verloren.

Mfg Stephan

DAK

BeitragDo, Feb 19, 2015 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit den Kommentaren ist es immer ganz gut, wenn man sich an JavaDoc hält. Das heißt im Grunde sollte Folgendes über jedem Funktionsheader stehen:

-) Beschreibung jedes einzelnen Parameters (Was macht er, ggf. welche Werte sind erlaubt)
-) Beschreibung der Funktion (Was macht sie, eventuell, wie macht sie das, was für Vor- und Nachbedingungen hat sie)
-) Exceptions, die geworfen werden können (nehme an, Monkey kann Exceptions, hab Monkey nicht verwendet)
-) Wenn man will: Author und Versionsnummer
Gewinner der 6. und der 68. BlitzCodeCompo

Xeres

Moderator

BeitragDo, Feb 19, 2015 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde noch darum bitten, das Thema etwas aussagekräftiger (und Suchmaschinenfreundlicher) zu benennen. "Diverse nützliche Funktionen" ist ein bisschen zu weit gefächert.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group