Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

11

24.10.2016, 13:57

Was genau willst du denn mit den Rechtecken erreichen?

Wäre das hier

(Link)

nicht ein guter Ausgangspunkt? (http://www.gamasutra.com/blogs/AAdonaac/…n_Algorithm.php)

Goldwing Studios

Treue Seele

  • »Goldwing Studios« ist der Autor dieses Themas

Beiträge: 359

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

12

24.10.2016, 14:20

uiiii, sowas kommt verdammt nahe dran.

Setze ich mir direkt mal auch meinen imaginären Notizblock!

Aber trotzdem werde ich an dem von TGGC beschriebenen Problem hängen bleiben und werde wohl oder übel ausprobieren müssen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

24.10.2016, 14:52

Ich habe das Problem immer noch nicht genau verstanden.

Was genau ist gegeben?
Was genau ist gesucht?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

14

24.10.2016, 16:07

Mach doch mal ein paar kleine Skizzen. Das muss ja nicht aufwendig sein. Einfach dass man versteht was du von einem willst. Und soll das ganze nun in so fern dynamisch sein als dass bei selben Eingabeparametern unterschiedliche Ergebnisse kommen, oder ist es ok wenn die Ergebnisse immer gleich aussehen? Sollte es egal sein wurde die Lösung schon genannt. Du halbierst so lange die Fläche bis du die Anzahl der Rechtecke erreicht hast.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

15

24.10.2016, 21:28

Sollte es egal sein wurde die Lösung schon genannt. Du halbierst so lange die Fläche bis du die Anzahl der Rechtecke erreicht hast.

Sollte es nicht egal sein, könntest du auch mit einer Zufallszahl arbeiten z.B.
  • Vertikal oder Horizontal halbieren
  • Verschieben der halbierenden Gerade auf der entsprechenden Achse
  • Zufääliges Rechteck welches halbiert wird

Das Ergebnis dürfte dann zumindest varieren.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Goldwing Studios

Treue Seele

  • »Goldwing Studios« ist der Autor dieses Themas

Beiträge: 359

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

16

25.10.2016, 09:31

okay, das sind ein paar coole Ideen.

Am besten gefällt mir aber die Lösung von Sylence und diese werde ich auch zuerst angehen.

Ich weiß aber auch nocht nicht, ob dies das Non-Plus-Ultra ist. Muss ich erstmal ausprobieren.

Danke an alle, hat sich damit aber erstmal erledigt :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

25.10.2016, 09:45

Am besten gefällt mir aber die Lösung von Sylence und diese werde ich auch zuerst angehen.

Ich weiß aber auch nocht nicht, ob dies das Non-Plus-Ultra ist. Muss ich erstmal ausprobieren.

Die löst vor allem nicht unbedingt dein Problem. Wenn du dir den Link mal ansiehst siehst du dass es darum geht Rechtecke voneinander zu trennen, bzw an sich noch um mehr da das ganze ja ein Dungeon generieren soll. Bei dir ist ja wichtig dass am Ende alles in einem Rechteck platz findet. Und hier hast du zusätzlich Lücken zwischen den Rechtecken. Davon war vorher zumindest nicht die Sprache. Wenn so etwas gewünscht ist kannst du auch einen der anderen Ansätze nehmen und deine eigentlichen Rechtecke mit zufälliger Größe in den zuerst berechneten Rechtecken platzieren. Aber an sich ist hier keinen wirklich klar was du vor hast und deshalb tappen wir hier alle mehr oder weniger im Dunkeln. Auf jeden Fall viel Erfolg.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Goldwing Studios

Treue Seele

  • »Goldwing Studios« ist der Autor dieses Themas

Beiträge: 359

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

18

15.11.2016, 09:08

So, hab mich jetzt mit dieser Frage etwas in XNA verkrochen und habe dort aber eine gute idee gefunden. Ist recht simpel auf JS umzumünzen.

Ich wollte nur mal meinen Ansatz hier mit euch teilen ;) (Bitte erwartet keinen optimierten Code, dafür war ich zu faul :S ):

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Texture2D grass = new Texture2D(GraphicsDevice, 1, 1);
            grass = textureList["grass"];

            Color[] dataPainted = new Color[textureList["grass"].Width * textureList["grass"].Height];
            textureList["grass"].GetData(dataPainted);

            _g = dataPainted.GetHashCode();

            double texHeight = grass.Height, texWidth = grass.Width;

            double numberOfTilesVertical = (double)GraphicsDevice.Viewport.Height / (double)texHeight;
            double numberOfTilesHorizontal = (double)GraphicsDevice.Viewport.Width / (double)texWidth;

            double digitsAfterDotVert = Math.Round(numberOfTilesVertical - Math.Round(numberOfTilesVertical, 0), 3), digitsAfterDotHori = Math.Round(numberOfTilesHorizontal - Math.Round(numberOfTilesHorizontal, 0), 3);

            numberOfTilesVertical = numberOfTilesVertical - digitsAfterDotVert;
            numberOfTilesHorizontal = numberOfTilesHorizontal - digitsAfterDotHori;

            texHeight = (double)GraphicsDevice.Viewport.Height / numberOfTilesVertical;
            texWidth = (double)GraphicsDevice.Viewport.Width / numberOfTilesHorizontal;
            Vector2 proportions = new Vector2(((float)texWidth / (float)grass.Width), ((float)texHeight / (float)grass.Height));

            for (int i = 0; i < numberOfTilesHorizontal; i++)
            {
                for (int j = 0; j < numberOfTilesVertical; j++)
                {
                    float posX = (float)texWidth * i;
                    float posY = (float)texHeight * j;
                    Tile _tile = new Tile();
                    _tile.Position = new Vector2(posX, posY);
                    _tile.Proportions = proportions;
                    _tile.Texture = grass;
                    _tile.Texture.Name = "grass";
                    battlefieldList.Add(_tile);
                }
            }


Im Draw wird dann ganz normal mittels:

C#-Quelltext

1
2
3
4
for (int i = 0; i < battlefieldList.Count; i++)
            {
                generalSpriteBatch.Draw(battlefieldList[i].Texture, battlefieldList[i].Position, null, Color.White, 0f, battlefieldList[i].Proportions / 2, battlefieldList[i].Proportions, SpriteEffects.None, battlefieldList[i].drawIndex);
            }


der Sprite gemalt, die Objekt-Eigenschaft "Proportions" ist in diesem Fall der Scale-Wert, also Textur mit normaler Größe aber dann je nach Wert skaliert.

Trotzdem danke für eure Ideen hierzu!

Danke auch noch mal an Sylence für den Vorschlag mit der Raumgenerierung.

Werbeanzeige