einfacher schnee?



  • nehmen wir an ich habe einen haufen pixel die zufällig gesetz werden...jetzt gehe ich den bildschirm durch und bei jedem pixel frage ich ab ob er weiter nach unten rücken kann:
    xpos ist die x position
    ypos ist y...

    mach ich n random und wenns <0.5 ist
    dann frage ich ab ob x-1, y+1 (also links unten) frei ist
    sonst ob x+1,y+1 (sprich rechts unten) frei ist.
    wenn frei dann bewege ich den pixel da hin

    nun ist aber das problem, dass ich das ganze von z.B. links nach rechts durchgehe, dh. die bewegung eines pixels hat auswirkungen auf die des nächsten usw, so das das ganze tendenziel eher nach recht geht als nach links(links = gegenrichtung zur abfrage...)

    habt ihr ne idee wie man die bewegung so berechnen kann, dass jeder pixel die gleiche "chance" hat sich nach links oder rechts zu bewegen?

    das ganze isn bisschen schwer zu erklähren ich weiss ^^

    fragt nach wenn was unklar ist



  • ok ich füge mal die funktion an:

    void moveSnow()
    {
    	for(int i = SHEIGHT-1; i>0; i--)
    	{
    		for(int j = 0; j<SWIDTH; j++)
    		{
    			if(snowArray[j][i] != 0)
    			{
    				if(snowArray[j][i+1] == 0x000000)
    				{
    					createPixel(snowArray,j,i+1,snowArray[j][i]);
    					createPixel(snowArray,j,i,0x000000);
    
    				}
    				else
    				{
    					int r = 0;
    					int l = 0;
    					if(snowArray[j+1][i+1] == 0x000000) { r = 1; } else { r = 0; }
    					if(snowArray[j-1][i+1] == 0x000000) { l = 1; } else { l = 0; }
    					if(l && r)
    					{
    						if(rand()%100<50)
    						{
    							createPixel(snowArray,j+1,i+1,snowArray[j][i]);
    							createPixel(snowArray,j,i,0x000000);
    						}
    						else
    						{
    							createPixel(snowArray,j-1,i+1,snowArray[j][i]);
    							createPixel(snowArray,j,i,0x000000);
    
    						}
    					}
    					else if(l)
    					{
    						createPixel(snowArray,j-1,i+1,snowArray[j][i]);
    						createPixel(snowArray,j,i,0x000000);
    
    					}
    					else if(r)
    					{
    						createPixel(snowArray,j+1,i+1,snowArray[j][i]);
    						createPixel(snowArray,j,i,0x000000);
    
    					}
    				}
    			}
    		}
    	}
    }
    

    um das ganze zu veranschaulichen, hier das programm:

    http://www.pixartist.de/snow.zip

    das sieht man deutlich, dass es schneller nach rechts abrutscht als nach links



  • 1. keine ahnung was du machen willst
    2. ohne msvc nicht zu starten(dll fehlt)



  • otze schrieb:

    1. keine ahnung was du machen willst
    2. ohne msvc nicht zu starten(dll fehlt)

    echt? welche dll?



  • MSVCRTD.dll



  • Hab mir jetzt nicht den Quelltext angesehen, aber aus deinem Text geht ja hervor, das du immer erst links und dann rechts testest. Mach das doch mal zufällig....



  • ok habs jetzt einigermaßen gut hinbekommen

    void moveSnow()
    {
    //jetz von aussen von links nach rechts und innen von unten nach oben
    	for(int j = 0; j<SWIDTH; j++)
    	{
    		for(int i = SHEIGHT-1; i>0; i--)
    		{
    			if(snowArray[j][i] != 0)
    			{
    				if(snowArray[j][i+1] == 0x000000)
    				{
    					int k = 0;
    // so hier wird jetzt sozusagen ne ganze "stange" sprich spalte runtergesetzt
    					while(snowArray[j][i-k] != 0x000000 && i-k > 0)
    					{	
    						createPixel(snowArray,j,i+1-k,snowArray[j][i-k]);
    						createPixel(snowArray,j,i-k,0x000000);
    						k++;
    					}
    
    				}
    				else
    				{
    					int r = 0;
    					int l = 0;
    					if(snowArray[j+1][i+1] == 0x000000) { r = 1; } else { r = 0; }
    					if(snowArray[j-1][i+1] == 0x000000) { l = 1; } else { l = 0; }
    					if(l && r)
    					{
    						if(rand()%100<50)
    						{
    							createPixel(snowArray,j+1,i+1,snowArray[j][i]);
    							createPixel(snowArray,j,i,0x000000);
    						}
    						else
    						{
    							createPixel(snowArray,j-1,i+1,snowArray[j][i]);
    							createPixel(snowArray,j,i,0x000000);
    
    						}
    					}
    					else if(l)
    					{
    						createPixel(snowArray,j-1,i+1,snowArray[j][i]);
    						createPixel(snowArray,j,i,0x000000);
    
    					}
    					else if(r)
    					{
    						createPixel(snowArray,j+1,i+1,snowArray[j][i]);
    						createPixel(snowArray,j,i,0x000000);
    
    					}
    				}
    			}
    		}
    	}
    }
    


  • hm aber wirklich optimal ist es auch nicht


  • Mod

    pixartist schrieb:

    hm aber wirklich optimal ist es auch nicht

    dann passt es ja zu deinem topic, einfacher schnee 🤡

    rapso->greets();



  • rapso schrieb:

    pixartist schrieb:

    hm aber wirklich optimal ist es auch nicht

    dann passt es ja zu deinem topic, einfacher schnee 🤡

    rapso->greets();

    jo 😉
    hast du vielleicht nen links mit nem sourcecode zu relativ gutem schnee/sand in sdl ? würde gerne sehen wie die profis das machen 😉



  • Man verwendet üblicherweise Partikelsysteme. D.h, man definiert jede Menge "Partikel" die dann anhand irgendwelcher Bewegungsmuster "rumfliegen". Damit kann man so ziemlich alles machen, von Schnee über Sand bis zu Feuer. Duch mal im Internet, das sieht oft ziemlich gut aus 👍
    geloescht


Anmelden zum Antworten