Kreise sollen Insel nicht verlassen (Denkhürde)

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Nexhmije

Betreff: Kreise sollen Insel nicht verlassen (Denkhürde)

BeitragFr, Mai 16, 2008 9:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Also, ich arbeite gerade an der Umsetzung einer kleinen Spielidee und habe schon sinniges vollbracht. Jetzt stehe ich aber vor folgender Denkhürde:

Ich habe einen Haufen Smileys. Diese Smileys werden auf eine Insel gesetzt. Diese Insel ist nicht rund und nicht quadratisch, sondern wie eine richtige Insel mit Buchten, Ecken, Klippen (also jetzt form-mäßig ^^). Es gibt nur festen Boden und das Meer (jeweils durch eine Farbe dargestellt). Beim Starten des Programms werden viele (1500+) Smileys auf diese Insel gesetzt. Damit sie nicht gleich am Anfang im Wasser landen, überprüfe ich beim Erstellen ob der jeweilige Smiley mit dem Meer-Bild kollidiert, wenn ja, wird randomly eine neue Position gesucht.

Ich weiß, dass ImagesCollide und der ganze Kram ziemlich langsam ist, aber 15 Sekunden Ladezeit kann ich verkraften.
Das Problem: Es ist unverzichtbar, dass die Smiley sich frei bewegen können (so wie es Smiley eben tun! Very Happy ). Nur weiss ich nicht, wie ich sie auf der Insel behalten kann. Ich habe es mit ImagesCollide versucht, aber bei 2000 Smileys ruckelt das ziemlich heftig.

Und sonst habe ich keine Idee, und die Lösungen bzw. Techniken für eine Lösung rall ich beim besten Willen nicht.

Ich hoffe irgendjemand kann mir weiterhelfen, bin für jedes bisschen dankbar Confused
 

battlegorge

BeitragFr, Mai 16, 2008 10:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du schon einen 2-dimensionalen array als tilemap?
Wenn sich die Smileys kästchenweise bewegen sollen, musst du nur die 8 tiles um den Smiley überprüfen.
Wenn sie sich frei bewegen sollen, reicht auch eine Rechteckskollisionsabfrage, is sicher schneller als image_collide.

So z.b.:
b1 oder b2 steht für hitbox/2, weil die Kollision vom Mittelpunkt aus gerechnet wird.

'collision detection
Function f_collision(x1,y1,b1,x2,y2,b2)
If y1+b1<y2-b2 Return
If y1-b1>y2+b2 Return
If x1+b1<x2-b2 Return
If x1-b1>x2+b2 Return
Return 1
End Function

BlitzMoritz

BeitragFr, Mai 16, 2008 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Zahlen, die du nennst, sind kaum glaubhaft. Question
15 Sekunden Ladezeit?! Das kann man wohl nicht mehr "Ruckeln" nennen.
2000 Smileys?! Selbst wenn dein Smiley nur 20 mal 20 Pixel groß wäre, würden 2000 von ihnen nebeneinander 800000 Pixel bedecken, was einer Fläche von 1000 mal 800 Pixeln entspricht, also im Grunde fast einem kompletten Bildschirm und so groß wird deine Insel ja nicht sein. Ich denke, dass da eine Vielzahl von Smileys aufeinanderkleben, ohne dass du es siehst bzw. ohne dass das viel Sinn hätte.
Bezüglich der Randprobleme hier eine Idee:
Man könnte eventuell für deine Insel eine Art approximierte "Schablone" entwerfen, etwa so:
______XXX___XX______
___XXXXXXXXXXXX___
_XXXXXXXXXXXXXXXX
XXXXXXXXXXXX______
____XXXXXXXXXX____
_______XXXXXX______
Wobei X für eine (je nach Feinheit der Buchten etc.) feste Flächengröße steht. Zu vergleichen wären dann lediglich, ob die Position eines Smileys mit einem X-Eintrag dieser zweidimensionalen Matrix übereinstimmt.
Nicht schlecht wäre es auch, zwecks Abwechslung die Inselform beim Programmstart variabel zu halten, d.h. nicht von einem festen Bild auszugehen, sondern umgekehrt die Insel aus einer zufälligen Schablone heraus durch kleine Einzelbilder zusammenzubauen. Nur so als Anregung...

Nexhmije

BeitragFr, Mai 16, 2008 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Die Zahlen, die du nennst, sind kaum glaubhaft.

Sagt der der weder Spiel noch Code bisher gesehen hast. Sorry. ^^

Zitat:
15 Sekunden Ladezeit?! Das kann man wohl nicht mehr "Ruckeln" nennen.

Was ist das Problem mit 15 Sekunden Ladezeit? Du hast sicher schon mehrere Spiele gespielt, in denen man länger warten musste, bevor man spielen konnte Wink Wenn alles geladen ist, läuft es ja auch flüssig.

Zitat:
2000 Smileys?! Selbst wenn dein Smiley nur 20 mal 20 Pixel groß wäre, würden 2000 von ihnen nebeneinander 800000 Pixel bedecken, was einer Fläche von 1000 mal 800 Pixeln entspricht, also im Grunde fast einem kompletten Bildschirm und so groß wird deine Insel ja nicht sein.

Die Insel(n) sind zusammen wesentlich grösser als ein gesamter Bildschirm. Man kann ja immerhin umherscrollen <:

Zitat:
Ich denke, dass da eine Vielzahl von Smileys aufeinanderkleben, ohne dass du es siehst bzw. ohne dass das viel Sinn hätte.

Dass Smileys sich mal pixelgenau überschneiden kommt nicht permanent, aber auch nicht selten vor. Trotzdem ist diese Situation wesentlich für die Spielidee.

Eure Anregungen sind sehr nützlich. Ich werd' jetzt mal versuchen, eine Kombination aus euren beiden Ideen zu realisieren, ich hoffe es klappt Confused Danke schonmal
 

Dreamora

BeitragFr, Mai 16, 2008 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
das einfachste ist garnet alle smileys zu bewegen sondern nur die die man sieht und potentiell demnächst sieht. vom rest bekommt man eh nix mit also braucht man es auch net zu ändern. Das kostet nur unsinnig performance


kollision mit dem wasser zu checken wird relativ unmöglich sein vor allem mit deinem ansatz.
Da musst du dir schon ein TileSystem schreiben damit du nur die umliegenden tiles prüfen musst, sonst is da nix zu holen. (egal ob sich deine figuren frei oder nur in tiles bewegen können)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

F

BeitragFr, Mai 16, 2008 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde den Mittelpunkt der Insel herausfinden. Danach schau ich bei welchem Winkel welche Entfenung zum Inselrand besteht. Man Muss dann nur abfragen ob beim jeweiligen Winkel die Entfernung nicht überschritten wird. Die Insel muss dafür aber keine Seitlichen einbuchtungen vorweisen.

Es währe natürlich auch möglich die Umrisse der Insel per Linien festzulegen und dann abzufragen ob der Kreis (Smileys sind Rund) mit den Linien Kollidiert. Wink
Signatur? Noch nie Gehört...

Goodjee

BeitragFr, Mai 16, 2008 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würde ein array erstellen mit der größe (inselx/50,insely/50) und da ein true reinpacken wenn der abschnitt nur land enthält oder ein false wenn auch wasser da ist. nur wenn false ist musst du dann imagecollide machen
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

F

BeitragFr, Mai 16, 2008 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder gleich 3 States : Nur Wasser,Wasser und Land, Nur Land Wink
Signatur? Noch nie Gehört...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group