Funktionen speichern

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Ana

Betreff: Funktionen speichern

BeitragSa, Mai 02, 2009 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,
ich möchte wälder zufällig generieren, dass klappt auch so weit ganz ordentlich, jedoch hab ich ein problem und eine frage dazu, bei denen mir hoffendlich jemand weiter helfen kann. Zum einen hat jeder einzelne Baum Werte wie Blätter und Äste die man von ihm sammeln kann. Nun weiß ich nicht wie ich die einzelnen Bäume ansprechen kann. Sie sind als Type gemacht (sinnvoll?) und dann müsste man die mit before und after ansteuern oder so? und zum anderen zeichnet mein programm das komplette Bilde kontinuierlich neu (sinnvoll?^^) nun wird aber auch jedes mal ein neuer Wald generiert, sprich in ihrem Rahmen rasen wild bäume auf und ab und verändern dabei noch ihre Form. Das sieht zwar auf seine Art ganz nett aus, allerdings wäre es mir lieber wenn ich den Wald speichern könnte, dass immer der selbe da ist.

So weit mein ansatz des "Generators" (vielleicht etwas hochgestochen das Wort Wink )
Code: [AUSKLAPPEN]

Function createbaum (x,y)
   v.baum = New baum
   v.baum\x = x
   v.baum\y = y
   v.baum\benutzbar= 1
   v.baum\ast       = Rand(0,5)
   v.baum\Blatt   = Rand(0,5)
   v.baum\Liane   = Rand(0,2)
   v.baum\Rinde   = Rand(0,2)
   v.baum\Stamm   = 1
   v.Baum\Wurzeln  = 1
   v.baum\Insekten = Rand(0,1) * Rand(0,1)
   image = Rand (1,2)
   If image = 1 Then v.baum\image   = LoadImage("\Bilder\baum1.bmp")
   If image = 2 Then v.baum\image   = LoadImage("\Bilder\baum2.bmp")
   MaskImage v.baum\image,255,0,255
   DrawImage v.baum\image, v.baum\x,v.baum\y   
End Function


SeedRnd MilliSecs()
Function createwald (Anfangx,anfangy,endex,endey)
startx = anfangx
baumanzahl = (((endex - anfangx)/100) * ((endey - anfangy)/100)) - 1
For i = 1 To baumanzahl
createbaum (anfangx,anfangy)
anfangx = anfangx + 100 + Rand (-25,25)
anfangy = anfangy + Rand (-20,20)
If anfangx >= endex Then
anfangy = anfangy + 100 + Rand (-20,20)
anfangx = startx
EndIf
Next
End Function
 

da_poller

BeitragSa, Mai 02, 2009 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
erstelle die bäume nur 1 mal und prüfe sie immer dann mit einer for each schleife..

BlitzBasic: [AUSKLAPPEN]
For b.baum =Each baum
;hier deine bäume malen und auf veränderung prüfen
Next

Ana

BeitragSa, Mai 02, 2009 10:19
Antworten mit Zitat
Benutzer-Profile anzeigen
danke erstmal, allerdings versteh ich zwar was du meinst (zumindest grob), aber wie ich das umsetze nicht Sad
 

TerrorMachine

BeitragSa, Mai 02, 2009 10:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem Ansprechen ist ganz einfach. Du vergibst in deinem Type noch ein Feld mit einer fortlaufenden Nr.
Dann kannst du mit

For b.baum = each baum
if gesuchter_baum = nr then ;Für gesuchter_baum eine Nummer oder eigene Variable einsetzten
;Mach irgendwas mit diesem Baum
endif
next

einen Baum anhand einer Nummer suchen. Wenn du das mit 3D machen würdest, dann könntest du die ID speichern und dann Picken und vergleichen.

Den Wald würde ich nicht neu zeichnen. Wenn sich was verändert, dann machst du das ja bewusst (z.B. einen Baum löschen oder verschieben). Dann brauchst du ja bloß wieder über die Nummer auf den Baum zugreifen. Musst dann aber daran denken, dass sich die Nummern dahinter nicht verändern.

So z.B.:
Vorher: 1 2 3 4 5 6
Jetzt löscht du Baum Nr. 4:
Jetzt: 1 2 3 5 6

Du kannst dann natürlich die Nummern mit einem Zähler und einer For b.baum = each baum Schleife neu vergeben.

Ich hoffe ich hab das so verstanden, wie du das willst.

Ana

BeitragSa, Mai 02, 2009 12:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ich glaub, das ist was ich brauche und ich habs auch soweit verstanden vielen dank, bis auf das nicht neu zeichnen.
Wenn ich ein bewegtes objekt habe muss ich das bild doch löschen oder? Gibt es da eine andere alternative als Cls? Weil dann muss ich ja wohl oder übel alles neu zeichnen?Macht man dann mit viewport eine extra fläche um die figur?
 

bruce85

BeitragSa, Mai 02, 2009 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich hab mal ein beispiel geschrieben:

Code: [AUSKLAPPEN]
Graphics 640,480
SetBuffer BackBuffer()

;Type für den Baum
Type Baum
   Field Nr% ;Wichtig, da wir bestimmte BaumNr ansprechen wollen
   Field PosX%
   Field PosY%
End Type

;10 Bäume untereinander erstellen
For i=1 To 10
   B.Baum = New Baum
   B\PosY = i*20
   B\Nr = i
Next

;Welcher Baum Nr soll bewegt werden?
Global Nr% = 2

While Not KeyHit(1)
   Cls
   
   ;Alle Bäume abfragen
   For B.Baum = Each Baum
      ;BaumNr zeichnen
      Text B\PosX,B\PosY,"Baum Nr: "+B\Nr
      ;hier die BaumNr vergleichen und dieser Baum, welche die gleiche Nr hat wie oben angegeben, dann dieser Baum nach rechts bewegen
      If B\Nr = Nr Then
         B\PosX = B\PosX + 2
      EndIf
   Next
   
   Flip
Wend
End


Vielleicht verstehst du das jetzt, wie Du einzelne Type einträge prüfen und weiter bearbeiten kannst.

Ich hoffe, dass dir das Weiterhilft.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

kriD

BeitragSa, Mai 02, 2009 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
zum speichern des waldes:
da deinen wald ja per random generierst und EIGENTLICH immer einen anderen wald haben möchtest, steht bestimmt am anfang deines codes irgendwo Code: [AUSKLAPPEN]
Seedrnd Millisecs ()
. falls nicht, so wirst du dich gewundert haben, das der wald immer gleich aussieht Wink

wenn man jetzt das Millisecs durch eine zahl ersetzt, so bekommt man für jede zahl verschiedene, aber für eine zahl immer dieselben zufallswerte.

praktisch gesagt brauchst du bloß eine zahl speichern und die nach seedrnd einsetzen und hast so den ganzen wald wieder so wie vorher.

lg kriD
Wenn ich du wäre, wäre ich lieber ich!

Ana

BeitragSo, Mai 03, 2009 9:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja danke allerdings hatte ich bis auf das es nicht umbedingt nötig wäre den wald alls fps neu zu zeichnen die sache so weit verstanden, aber zum vertiefen kann ja ein anderer erklärungsansatz nie schaden. und Seedrnd ist schon im code und steht vor function createwald, allerdings ist das mit dem zahlen statt millisecs ne gute idee, wird vermutlich noch seine anwendung finden aber erstmal sind mir zufällig wälder lieber damit ich auch ein paar sonderfälle sehe und eventuell nach bessern kann.

Auch möcht ich eigentlich nicht baum nr so und so ansprechen sondern den gerade angeklickten egal welche nummer der hat, ich hab das wie folgt gemacht

Code: [AUSKLAPPEN]

Function baumcheck()
While MouseHit(1) And men = 0 ; men bestimmt ob ein menü geöffnet ist damit nicht der baum untersucht ;wird wenn er vielleicht unter einem menü button ist
For v.baum = Each baum
If MouseX() > v.baum\x And MouseX() < v.baum\x + 150 And MouseY() > v.baum\y And MouseY() < v.baum\y + 150 Then
untersuchen(1) ; untersuchen ist die folgende function die dann weitere aktionen mit dem baum ermöglicht
EndIf
Next
Wend
End Function


allerdings ist das noch nicht optimal weil sich manche bäume schneiden und so wird immer der am frühsten in der reihe stehende genommen auch wenn man den eventuell gar nicht sieht ... aber immerhin der wald steht also nochmal danke an alle die mir geholfen haben Smile
 

da_poller

BeitragSo, Mai 03, 2009 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
v.baum ist eine liste...

das ist der nachteil an types..
der vorteil ist man kann hinzufügen verschieben(innerhalb der liste) und entfernen wie man will

gehe mit einer foreach schleife alle bäume durch und schau ob eine kollision w#rend des mausklicks vorliegt(maus punkt innerhalb des baum rechteckes z.b.) und fals ja ist der baum ausgewählt(v\ausgewaehlt=1) und dann beim zeichnen halt (if v\ausgewählt=1 then bla bla)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group