Hydrano
Lieutenant
- Registriert
- März 2008
- Beiträge
- 937
Guten Abend,
ich habe gestern angefangen mit dem Monogame Framework für C# ein 2D Roulette zu programmieren.
Das Roulette Rad ist bei mir einfach eine Aneinanderreihung von 3 Texturen (Schwarz, Rot und Grün).
Diese sollen nun wenn ich die Leertaste drücke sich schnell nach rechts bewegen und dann langsam zum stehen kommen. Soweit kein Problem, sollte man jedenfalls denken
Dieser "Scrollvorgang", so nenne ich das laufen des Rads, ist ganz simple implementiert und sollte von meinem Verständnis her auch funktionieren, leider tut es das nicht so ganz.
Während es läuft verschieben sich die Texturen nach und nach. Insbesondere wenn das Rad gestartet wird und wenn sich die Scroll-Geschwindigkeit dann ändert (z.B. langsamer wird). Die Texturen fangen an sich zu überlappen oder es entstehen Lücken.
Es folgen die relevanten Code Schnipsel, die Klasse Sprite ist eine typische Sprite Klasse mit Textur, Position, Rotation etc.
Davon erstelle ich ein Array über so viele Fragmente wie ich benötige (15 in dem Fall)
Und um das ganze Problem zu visualisieren habe ich ein kleines Video davon erstellt welches das Problem zeigt.
Wenn ich das ganze mit einem Scrollspeed von 5 starte, dann scheint es relativ normal zu bleiben. Sobald ich das aber ändere oder schneller mache geht das Chaos los. Als ich zum zweiten mal in das Roulette ging habe ich eine Simulation laufen lassen wie es endgültig auch sein sollte. Also mit kurzer Zeit Scrollspeed um die 25f und dann langsam abbremsen. Und dabei entstehen eben die wildesten Lücken.
https://puu.sh/vx58V/5790aeb1e9.mp4 (Das Video ist knapp 15 MB groß. Manche Browser puffern es erst vollständig, nicht wundern falls nicht direkt was zu sehen ist. Wollte dafür jetzt nicht YouTube missbrauchen)
Ich hoffe irgendjemand hat dafür eine Lösung parat
ich habe gestern angefangen mit dem Monogame Framework für C# ein 2D Roulette zu programmieren.
Das Roulette Rad ist bei mir einfach eine Aneinanderreihung von 3 Texturen (Schwarz, Rot und Grün).
Diese sollen nun wenn ich die Leertaste drücke sich schnell nach rechts bewegen und dann langsam zum stehen kommen. Soweit kein Problem, sollte man jedenfalls denken
Dieser "Scrollvorgang", so nenne ich das laufen des Rads, ist ganz simple implementiert und sollte von meinem Verständnis her auch funktionieren, leider tut es das nicht so ganz.
Während es läuft verschieben sich die Texturen nach und nach. Insbesondere wenn das Rad gestartet wird und wenn sich die Scroll-Geschwindigkeit dann ändert (z.B. langsamer wird). Die Texturen fangen an sich zu überlappen oder es entstehen Lücken.
Es folgen die relevanten Code Schnipsel, die Klasse Sprite ist eine typische Sprite Klasse mit Textur, Position, Rotation etc.
Davon erstelle ich ein Array über so viele Fragmente wie ich benötige (15 in dem Fall)
Code:
// Relevante variablen
Sprite[] fieldList = new Sprite[15]; // Stellt das Rad dar.
Rectangle scrollArea; // Der Bereich indem das Rad scrollt, da ich nicht warten will bis die Objekte aus dem Bildschirm laufen
float scrollSpeed = 0.0f; // Die Geschwindigkeit mit der das Rad sich bewegt
// Hier setze ich die Startposition der Objekte im Rad (Diese Methode wird nur 1x aufgerufen)
private void AdditionalInit()
{
for (int i = 0; i < fieldList.Length; i++)
{
fieldList[i].Position = new Vector2(i * fieldList[i].Texture.Width + 140, Statics.GAME_WINDOW_HEIGHT / 2 - fieldList[i].Texture.Height / 2);
}
// Festlegen des maximalen scroll Bereichs
scrollArea = new Rectangle((int)fieldList[0].Position.X, (int)fieldList[0].Position.Y, fieldList[0].Texture.Height * fieldList.Length + 30, fieldList[0].Texture.Height);
}
// Diese Methode wird in Update() aufgerufen und ich denke hier liegt auch der Fehler
private void ScrollRoulette()
{
for (int i = 0; i < fieldList.Length; i++)
{
fieldList[i].position.X += scrollSpeed; // scrollSpeed kann ich über Tasten einstellen, bzw. mit Leertaste einen Durchlauf mit abbremsen simulieren
if (fieldList[i].Position.X >= scrollArea.Width + fieldList[i].Texture.Width)
{
// Sobald das Objekt die Breite der Scrollarea überschreitet wird es an den Anfang davon gesetzt. (Rechts raus und links wieder rein)
fieldList[i].position.X = scrollArea.X - fieldList[i].Texture.Width;
}
}
}
// Zur Vollständigkeit noch die Draw Methode, aber daran kann man nichts falsch machen.
public override void Draw(GameTime gameTime)
{
Statics.SPRITEBATCH.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
for (int i = 0; i < fieldList.Length; i++)
{
fieldList[i].Draw(Statics.SPRITEBATCH);
}
Statics.SPRITEBATCH.End();
}
Und um das ganze Problem zu visualisieren habe ich ein kleines Video davon erstellt welches das Problem zeigt.
Wenn ich das ganze mit einem Scrollspeed von 5 starte, dann scheint es relativ normal zu bleiben. Sobald ich das aber ändere oder schneller mache geht das Chaos los. Als ich zum zweiten mal in das Roulette ging habe ich eine Simulation laufen lassen wie es endgültig auch sein sollte. Also mit kurzer Zeit Scrollspeed um die 25f und dann langsam abbremsen. Und dabei entstehen eben die wildesten Lücken.
https://puu.sh/vx58V/5790aeb1e9.mp4 (Das Video ist knapp 15 MB groß. Manche Browser puffern es erst vollständig, nicht wundern falls nicht direkt was zu sehen ist. Wollte dafür jetzt nicht YouTube missbrauchen)
Ich hoffe irgendjemand hat dafür eine Lösung parat