Funktionen erklären

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

aave13

Betreff: Funktionen erklären

BeitragDi, Jul 18, 2006 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,
ich habe das mit den funktionen noch nicht verstanden. könnte mir da jemand vielleicht etwas auf die sprünge helfen und mir erklären, wie eine funktion "funktioniert" und für was sie da ist. wäre echt nett

mfg aave13
 

Matthias

BeitragDi, Jul 18, 2006 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo aave13!

Also Eine Function ist ein unterprogrammteil in dem du alle Variablen die nicht Global sind noch einmal Benutzen kannst. Du kannste mehrere Parameter übergeben
 

aave13

BeitragDi, Jul 18, 2006 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
danke! Smile

und was bringen die in spielen (da in den hauptschleifen)?
wie z.b bei stranded:

Code: [AUSKLAPPEN]
;-----Functions

;Intro
Function intro()
   Local unso, unso2
   Local timer
   Local alpha#
   Local ms
   Local sound
   Local light
   HideEntity earth
   HideEntity water
   HideEntity sky
   HideEntity gui_kompass
   HideEntity gui_kompass_z
   For i = 0 To 5
      HideEntity lens_flare(i)
   Next
   sound=LoadSound("sfx/unrealsoftware.mp3")
   unso=LoadSprite("gfx/unrealsoftware.bmp", 4)
   ScaleSprite unso,300,30
   EntityAlpha unso,0
   PositionEntity unso,0,0,opt_sx/2
   alpha#=0
   timer=0
   ms=MilliSecs()
   FlushKeys
   FlushMouse
   CameraRange camera, 1, (opt_sx/2)+1000
   CameraFogMode camera, 0
   PlaySound sound
   While timer<450
      If MilliSecs()-ms>=10
         ms=MilliSecs()
         timer=timer+1
         If timer>50 And timer<150 Then
            alpha#=alpha#+0.01
            EntityAlpha unso, alpha#
         EndIf
         If timer>220 And timer<320 Then
            alpha#=alpha#-0.01
            EntityAlpha unso, alpha#
         EndIf
      EndIf
      Cls
      RenderWorld
      Flip
      If GetKey()>0 Then timer=450
      If GetMouse()>0 Then timer=450
   Wend
   FreeEntity unso
   FreeSound sound
   CameraFogMode camera, 1
   ShowEntity earth
   ShowEntity water
   ShowEntity sky
End Function

;Beenden
Function quit(quick=0)
   FlushKeys
   FlushMouse
   If quick=1 Then End
   Local cachesfx, cachegfx, ms
   cachesfx=LoadSound("sfx/quit.wav")
   cachegfx=LoadImage("gfx/b3dlogo.jpg")
   MidHandle cachegfx
   StopChannel sfx_chan
   PlaySound cachesfx
   ms=MilliSecs()
   While MilliSecs()-ms<3000
      Cls
      SetFont font_menu
      Color 255,255,255
      Text opt_sx/2,opt_sy/2-82, "Stranded wurde programmiert in",1,1
      DrawImage cachegfx, opt_sx/2,opt_sy/2
      Text opt_sx/2,opt_sy/2+82, "THX 4 Playing!",1,1
      If GetKey()>0 Then ms=0
      If MouseHit(1) Or MouseHit(2) Then ms=0
      Flip
   Wend
   End
End Function


da ist in einer funktion eine schleife und in der anderen auch...

skey-z

BeitragDi, Jul 18, 2006 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

;kleines additionsbeispiel

local a% = 10
local b% =20

local c% = 0

c% = add(a,b)

print "a + b=" + c%

waitkey()

end

;Additionsfunktion
function add(a%, b%)

     local c%

     c% = a% + b%

     return c%
end function


Hier: im Hauptprogramm definieren wir 3 variablen a, b und c, wobei c das ergebnis von a + b seien soll, a und b übergeben wir an die funktion ADD, wo diese addiert werden a, b und c sind in der Funktion local, d.h. sie haben keine auswirkung auf die vorher definierten variablen, genauso gut hätte ich auch x, y und z nehmen können es wäre das gleiche.

Funktionen werden dazu benutzt um wiederkehrende Programmteile auszulagen, dies erhöht die übersichtlichkeit und der Code lässt sich leichter pflegen.


[Edit]
in deinem geposteten Beispiel erfüllt es eine etwas andere Funktion, wir haben eine hauptschleife, die eine Funktion ausführt, welche durch eine Variable bestimmt wird, um einen kreislauf zu haben, je nachdem welcher Programmteil ausgeführt werden soll.

In diesen jeweiligen Funktionen sind wieder schleifne untergebracht, so zb. das Menü oder das Spiel an sich, wenn man sich also im Hauptmenü befindet und auf starten klikt, springt man aus der Funktion Menü raus und die Hauptschleife leitet den Spieler ins eigentliche Spiel.

so kann man einfach neue Programmteile anfügen, ohne die übersichtlichkeit des bestehenden Codes zu verschlechtern, natürlich könnte man das alles in eine Hauptschleife packen, aber dann hast du bei der Fehlersuche ein kleines Problem, weil du viel mehr Zeit opfern musst, um den Fehler zu finden, und das führt zu unmotiviertheit und zur Aufgabe des Projektes
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
  • Zuletzt bearbeitet von skey-z am Di, Jul 18, 2006 19:19, insgesamt einmal bearbeitet

PSY

BeitragDi, Jul 18, 2006 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

Funktionen sind Unterprogramme. Sie werden z.B. gerne benutzt, wenn man an verschiedenen Stellen im Programm gleiche Berechnungen durchführen will. Funktionen kannst Du - im Gegensatz zu Gosubs - Werte übergeben, und Funktionen können ebenso Werte zurückliefern.


Beispiel:
Du brauchst an verschiedenen Stellen das Volumen eines Quaders. Anstatt das jedesmal getrennt auszurechnen, erstellst Du Dir einfach eine Funktion und übergibst ihr an den verschiedenen Stellen im Programm einfach Länge, Breite und Tiefe, und die Funktion liefert Dir das Volumen zurück.

Code: [AUSKLAPPEN]
Print volumen(2,4,3)
WaitKey
Print volumen (3,3,3)
WaitKey
end


Function volumen(l,b,t)

   Local vol
   vol=l*b*t
   Return vol

End function



Variablen, die Du aus dem Hauptprogramm benutzen willst, musst Du global deklarieren, damit die Funktion diese auch benutzen kann, ansonsten werden alle in Funktionen benutzen Variablen lokal (nur in dieser Funktion) behandelt. Dabei musst Du lokale Variablen, die Du in Deiner Funktion benutzt, nicht unbedingt mit local deklarieren. Das dient nur der Übersichtlichkeit und hilft später beim Fehlerfinden.

Obige Funktion würde also auch folgendermassen funktionieren:

Code: [AUSKLAPPEN]
Function volumen(l,b,t)

   Return l*b*t

End function



Funktionen kannst Du übrigens auch ein eine Datei auslagern und mit dem include-Befehl darauf zugreifen. Bei grossen Projekten kann das die Übersichtlichkeit enorm erhöhen!
Du kopierst einfach Deine Funktionen in eine Datei, die Du z.B. "meine_funktionen.bb" nennst.
In Deinem Hauptprogramm rufst Du Diese "Library" dann folgendermassen auf:

Include("meine_funktionen.bb")
Sämtliche in dieser Datei enthaltenen Funktionen kannst Du dann ganz normal in Deinem Programm nutzen Wink


L8er,
PSY

(EDIT) Bäh. Kaum schreibt man nen Beitrag und guckt gleichzeitig nen Film, haben auch schon 3 Dutzend Leute vor dir gepostet Twisted Evil
 

aave13

BeitragDo, Jul 20, 2006 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
sehr herzlichen dank an alle! Smile

also habe ich das richtig verstanden, das functionen keine "pflicht" in dem sinne ist, dass man sie unbedingt braucht für manche sachen? eher jetzt zur übersichtlichkeit gedacht oder?! Wink

mfg aave13

ChaosCoder

BeitragDo, Jul 20, 2006 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, so ungefähr könnte man das sagen, übersichtlicher und kompakter wird dein Code dadurch, jedenfalls wenn du Functionen richtig benutzt Very Happy
Pflicht ist es nicht aber auf jedenfall zu empfehlen!
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

5k41

BeitragDo, Jul 20, 2006 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
nicht nur für die übersicht! einmal kannst du so die allzeit beliebte rekursion benutzten ( das sind funktionen die sich immer wieder selbst aufrufen, bis etwas bestimmtest passiert ist sehr nützlich) und zweitens kannst du dir damit einiges einfacher machen! Stell dir vor du musst 10 mal in deiner haupt schleife eine zahl durch 2 teilen +5 rechnen und dann mal 4 nehmen dann ists doch viel kürzer zu schreiben:
Code: [AUSKLAPPEN]

while 1
 neu=mathe(zahl)
 neu2=mathe(zahl2)
 ;usw.
wend
function mathe(zahl)
 return (zahl/2+5)*4
end function

als
Code: [AUSKLAPPEN]

while 1
 neu=(zahl/2+5)*4
 neu2=(zahl2/2+5)*4
 ;usw.
wend

mh... verdammt ist das beispiel schlecht... hioffe du weisst trozdem was ich meine!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Lunatix

BeitragDo, Jul 20, 2006 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Matthias hat Folgendes geschrieben:
Hallo aave13!

Also Eine Function ist ein unterprogrammteil in dem du alle Variablen die nicht Global sind noch einmal Benutzen kannst. Du kannste mehrere Parameter übergeben


nich ganz - wenn man

Code: [AUSKLAPPEN]

Global XYZ = 5

Function Blubb()

Local XYZ = 0

end function


macht, kann man diese variable XYZ nochmal benutzen.
(korrigiert mich wenns falsch is, aber bei mir ging das immer)
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

Christoph

BeitragDo, Jul 20, 2006 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst aber die Funktion aufrufen sonst klappt es nicht

Code: [AUSKLAPPEN]
Global XYZ = 5
Blubb
Function Blubb()

Local XYZ = 0

end function

BladeRunner

Moderator

BeitragDo, Jul 20, 2006 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Prinzip sind Functions nichts anderes als eine Erweiterung des Befehlssatzes nach eigenem Bedarf.

Wenn Du z.B. mit drawimage name,x,y ein Bild auf den Bildschirm zeichnest, macht das nichts anderes als eine "Bordfunktion" von Blitz aufzurufen.

Funktionen halten den Code übersichtlich und auch viel spreicherplatzsparender, da man nicht immer wieder die selben Codezeilen neu eingeben muss.

Funktionen sind somit ein sehr mächtiges Mittel und ich kann Dir nur empfehlen Dich audführlich mit ihnen zu befassen, da sie Dir das Leben sehr erleichtern können.

Stell Dir vor Du hast einen 200 Zeilen langen Block Code den Du 20 mal in Deinem Programm stehen hast, wie aufgebläht der Code dann wird. Wenn dann noch beim Eintippen eines dieser minimal angepassten Codeblöcke ein Fehler auftritt: Mahlzeit.
Packst Du das Zeug allerdings in eine Funktion reicht eine Zeile für den Gleichen Effekt.
Du sparst dir also 3980 Zeilen Code und verringerst die Gefahr von Fehlern die sich einschleichen...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

aave13

BeitragFr, Jul 21, 2006 9:10
Antworten mit Zitat
Benutzer-Profile anzeigen
super danke@all, ich denke ich sollte das verstanden haben. sollte diesbezüglich doch noch mal eine frage bestehen, werde ich mich an euch wenden. Smile

mfg aave13

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group