Kleines Problem bei 2D Sandbox System

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Schrolli

Betreff: Kleines Problem bei 2D Sandbox System

BeitragSa, Jun 12, 2010 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Forum,

ich versuche mich derzeit an einer kleinen 2D Sandbox.

Zum verständniss:
von oben fallen Sandkörner herunter und sollen dann unten liegen bleiben und sich auftürmen.
Wenn daneben der Pixel noch frei ist, rutschen sie auseinander, sodass der Haufen an sich immer größer wird.

Ich hoffe man versteht wie ich es meine.

Im moment prüfe ich so, ob unter dem momentanen Plot der Pixel frei ist, und das Sandkorn somit weiter fallen DARF:
BlitzBasic: [AUSKLAPPEN]

Function move_sand()
For s.sand = Each sand
If ReadPixel(s\x,s\y+1) = -16777216 Then
s\y = s\y + 1
EndIf
Next
End Function


Wenn die Sandkörner auf ein Rect fallen bleiben sie da auch liegen, türmen sich aber nicht auf.
Sie liegen quasi oben auf dem Rect und überlagern sich selbst. Macht ja auch Sinn, da ich ja erst nach einem neuzeichnen die schon liegenden Pixel prüfen kann.
Ich habe im moment keine Ahnung wie ich das nun am besten lösen könnte und würde mich über Hilfe oder Denk anstöße, sowie evtl Befehls-Verweise freuen

Grüß Basti Wink

Xeres

Moderator

BeitragSa, Jun 12, 2010 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm zumindest ein Array!
Code: [AUSKLAPPEN]
Dim Feld.TSand()

Damit musst du nichz 100 Mio. Sandkörner gegeneinander prüfen sondern nur die Nachbarn. Und verzichte auf das Farben lesen.
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)
 

Schrolli

BeitragSa, Jun 12, 2010 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh nicht ganz wie das mit dem Array gemeint ist.
Woher weis ich denn was die Nachbar Körner sin? Immerhin ist das ja durch das auseinander rutschen alles durcheinander?

Sorry aba kann der Taktik nicht ganz folgen

Xeres

Moderator

BeitragSa, Jun 12, 2010 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Feld unter einem Sandkorn ist Feld(s\x, s\y+1). Felder in denen kein Sandkorn ist, sind NULL. Wenn sich ein Sandkorn bewegt, trägst du es aus dem Feld aus (= Null) und trägst es in einem anderen ein.
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)

M0rgenstern

BeitragSa, Jun 12, 2010 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Xeres: Glaubst du wirklich, es ist gut den Bildschirm in ein Array aufzuteilen bei sowas?
So wie ich ihn verstanden hab will er Physik simulieren.
Obs da so ratsam ist das mit nem Array zu machen weiß ich ehrlich gesagt nicht.

Das müsste doch mit ner Physik Engine gehen, oder du schreinst dir sowas selvst.

Lg, M0rgenstern

Goodjee

BeitragSa, Jun 12, 2010 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
ein array macht sinn, du hast ihn falsch verstanden
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

Schrolli

BeitragSa, Jun 12, 2010 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahhhh jetzt macht das ganze Sinn Smile
Oke das Prinzip an sich hab ich denk ich mla verstanden, aber wie ich das genau umsetzten soll weis ich noch net. Möchtest du mir evtl ein kleines Codebeispiel posten? Das zumindest ähnlich funktioniert.

Grüße

Goodjee

BeitragSa, Jun 12, 2010 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Graphics 320,240
SetBuffer BackBuffer()
Dim mat(319,239)

Function update()
For x=0 To 319
For y=239 To 0 Step -1
If(mat(x,y)=1)
If(y<239)
If(mat(x,y+1)=0)
mat(x,y)=0
mat(x,y+1)=1
ElseIf(mat(x,y+1)=1)
If(x>0 And y<239 And mat(x-1,y)=0 And mat(x-1,y+1)=0)
mat(x,y)=0
mat(x-1,y+1)=1
ElseIf(x<319 And y<239 And mat(x+1,y)=0 And mat(x+1,y+1)=0)
mat(x,y)=0
mat(x+1,y+1)=1
EndIf
EndIf
EndIf
EndIf
Next
Next
End Function

Function draw()
For x=0 To 319
For y=0 To 239
If(mat(x,y)=1) Color 255,255,255:Rect(x,y,1,1)
Next
Next
End Function


Repeat
Cls
mat(160,0)=1
update()
draw()
Flip
Until KeyDown(1)


edit: das ist völlig verbuggt, aber du siehst was ein array ist Very Happy
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

Schrolli

BeitragSa, Jun 12, 2010 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
funktioniert super, nur wird das ganze ab ner bestimmten größe schon extrem langsam.
gibts da schnellere möglichkeiten die ebenfalls einfach umzusetzen wären, oda wirds daran scheitern?

Gruß basti

das wurgel

BeitragSa, Jun 12, 2010 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function draw()
   LockBuffer()
   For x=0 To 319
      For y=0 To 239
         If mat(x,y)=1 Then WritePixelFast x, y, $FFFFFF
      Next
   Next
   UnlockBuffer()
End Function


So müsste es wesentlich schneller gehen.
1 ist ungefähr 3

Goodjee

BeitragSa, Jun 12, 2010 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst statt dem array auch gleich ein image als speicher benuzten, das kannst du dann mit drawimage malen, verschiedene farben stehen dann für verschiedene materialien
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

ToeB

BeitragSa, Jun 12, 2010 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das versteh ich aber nicht xD

Er soll es nicht mit ReadPixelFast machen, dafür mit einem Array, aber dann doch mit einem Bild, aus dem man dann auch mit ReadPixelFast lesen muss ?

Einfach in dem Array eine andere Zahl für andere Materialien geben
Code: [AUSKLAPPEN]
0 = Leer
1 = Sand
2 = Wasser
3 = Öl


Oder was dir sonst noch einfällt. Dann musst du nur noch sagen, das wenn ein Sand auf ein Wasser Trifft, es durch das wasser geht, öl aber oben drauf bleibt...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Xeres

Moderator

BeitragSa, Jun 12, 2010 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
M0rgenstern hat Folgendes geschrieben:
Glaubst du wirklich, es ist gut den Bildschirm in ein Array aufzuteilen bei sowas?
Es ist schon mal besser, als alle Pixeldaten Linear hintereinander durch zu gehen, besonders wenn max. 8 Nachbarn gesucht werden. Weitere Optimierung wäre natürlich noch besser, darum "zumindest". Ob das in BB echtzeitfähig um zu setzen ist, bezweifle ich ein bisschen.

M0rgenstern hat Folgendes geschrieben:
Das müsste doch mit ner Physik Engine gehen, oder du schreinst dir sowas selvst.
Er schreibt ja gerade sowas selbst...
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)

Goodjee

BeitragSa, Jun 12, 2010 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
toeb: er soll es entweder mit nem array oder mit nem image machen, nicht aber mit einer mischung aus types und image.
ich weiß nicht ob das readpixelfast und drawimage nicht vllt schneller ist als in einem array schreiben und writepixelfast, hab ich nie ausprobiert
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group