Funktionen speichern
Übersicht

![]() |
AnaBetreff: Funktionen speichern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
erstelle die bäume nur 1 mal und prüfe sie immer dann mit einer for![]() ![]() BlitzBasic: [AUSKLAPPEN] For b.baum =Each baum |
||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke erstmal, allerdings versteh ich zwar was du meinst (zumindest grob), aber wie ich das umsetze nicht ![]() |
||
TerrorMachine |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() wenn man jetzt das Millisecs ![]() praktisch gesagt brauchst du bloß eine zahl speichern und die nach seedrnd ![]() lg kriD |
||
Wenn ich du wäre, wäre ich lieber ich! |
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
da_poller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 for ![]() ![]() ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group