Hallo,
ich programmiere gerade aus Übungszwecken ein kleines 2D Spiel.
Nun war ich gerade dabei, Regen in das Spiel zu implementieren, welcher in Abhängigkeit der Schwerkraft und dem Wind zu Boden fällt.
Das funktioniert auch einwandfrei.
Für die Regentropfen habe ich eine eigene Klasse geschrieben, die das Bild erstellt und gezeichnet wird.
Nun habe ich aber schnell über 10000 Tropfen Objekte und es werden ja immer mehr.
Gibt es einen besseren Weg, Regen zu erstellen?
Das Wasser landet anschließend auf einem eingezeichneten Boden. Mit einer Kollisionserkennung wird ermittelt, welcher Teil des Hintergrundes Transparent ist und welcher nicht. Nicht-transparente Teile gelten als solide und lösen eine Kollision aus.
Will ich nun allerdings, dass sich das Wasser am Boden anstaut, müsste ich für jeden Tropfen mit jedem anderen Tropfen eine Kollisionserkennung machen, was bei dieser Anzahl der Objekte einfach nicht effektiv ist und das Spiel unspielbar macht.
Wie muss ich an das Problem rangehen, dass sich das Wasser wie Wasser verhalten kann und trotzdem den Ressourcenverbrauch nicht sprengt?
Bringt JOGL oder ähnliches Besserung?
Die Hilfsklasse zur jetzigen einfachen Kollisionserkennung, welche die Map übergeben bekommt:
Gruß, Letavino
ich programmiere gerade aus Übungszwecken ein kleines 2D Spiel.
Nun war ich gerade dabei, Regen in das Spiel zu implementieren, welcher in Abhängigkeit der Schwerkraft und dem Wind zu Boden fällt.
Das funktioniert auch einwandfrei.
Für die Regentropfen habe ich eine eigene Klasse geschrieben, die das Bild erstellt und gezeichnet wird.
Nun habe ich aber schnell über 10000 Tropfen Objekte und es werden ja immer mehr.
Gibt es einen besseren Weg, Regen zu erstellen?
Das Wasser landet anschließend auf einem eingezeichneten Boden. Mit einer Kollisionserkennung wird ermittelt, welcher Teil des Hintergrundes Transparent ist und welcher nicht. Nicht-transparente Teile gelten als solide und lösen eine Kollision aus.
Will ich nun allerdings, dass sich das Wasser am Boden anstaut, müsste ich für jeden Tropfen mit jedem anderen Tropfen eine Kollisionserkennung machen, was bei dieser Anzahl der Objekte einfach nicht effektiv ist und das Spiel unspielbar macht.
Wie muss ich an das Problem rangehen, dass sich das Wasser wie Wasser verhalten kann und trotzdem den Ressourcenverbrauch nicht sprengt?
Bringt JOGL oder ähnliches Besserung?
Die Hilfsklasse zur jetzigen einfachen Kollisionserkennung, welche die Map übergeben bekommt:
Java:
// Koordinaten und Bild des Source Objects und des Referenz Objektes
public static boolean[] collision(float srcX, float srcY, BufferedImage srcImg, int refX, int refY, BufferedImage refImg)
{
int xs = 0;
int ys = 0;
int xr = 0;
int yr = 0;
boolean[] b = {false,false,false,false}; //Kollision oben, rechts, unten, links
// Kollision beim Rand der Karte
if(srcX == 0)
b[3] = true;
else if(srcX+srcImg.getWidth() == Main.bg.getWidth())
b[1] = true;
if(srcY+srcImg.getHeight() == Main.bg.getHeight())
b[2] = true;
Rectangle srcRect = new Rectangle((int)srcX,(int)srcY,srcImg.getWidth(),srcImg.getHeight());
Rectangle refRect = new Rectangle((int)refX,(int)refY,refImg.getWidth(),refImg.getHeight());
Rectangle intRect = new Rectangle();
// Überschneidungen feststellen
if(!srcRect.intersects(refRect))
return b;
intRect = srcRect.intersection(refRect);
xs = (int) (Math.max(intRect.getX(), srcRect.getX()) - Math.min(intRect.getX(), srcRect.getX()));
ys = (int) (Math.max(intRect.getY(), srcRect.getY()) - Math.min(intRect.getY(), srcRect.getY()));
xr = (int) (Math.max(intRect.getX(), refRect.getX()) - Math.min(intRect.getX(), refRect.getX()));
yr = (int) (Math.max(intRect.getY(), refRect.getY()) - Math.min(intRect.getY(), refRect.getY()));
BufferedImage srcSub = srcImg.getSubimage(xs, ys, (int)intRect.getWidth(), (int)intRect.getHeight());
BufferedImage refSub = refImg.getSubimage(xr, yr, (int)intRect.getWidth(), (int)intRect.getHeight());
for(int i=0;i<intRect.getWidth();i++)
for(int j=0;j<intRect.getHeight();j++)
{
if(i<intRect.getWidth()-1)
if(!isTransparent(i,j,srcSub)&&!isTransparent(i+1,j,refSub))
b[1] = true;
if(j<intRect.getHeight()-1)
if(!isTransparent(i,j,srcSub)&&!isTransparent(i,j+1,refSub))
b[2] = true;
if(i>0)
if(!isTransparent(i,j,srcSub)&&!isTransparent(i-1,j,refSub))
b[3] = true;
if(j>0)
if(!isTransparent(i,j,srcSub)&&!isTransparent(i,j-1,refSub))
b[0] = true;
}
return b;
}
Gruß, Letavino
Zuletzt bearbeitet: