Tower Defense Problem

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Ananas

Betreff: Tower Defense Problem

BeitragMo, Dez 21, 2009 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Abend

Bin grad am testen für ein kleines 3D-Tower Defense Spiel. Dabei soll man Türme am Wegrand bauen können, aber nicht auf dem Weg. Das Problem ist, dass der Weg nur aus einer Textur besteht und ich weiss nicht, wie ich prüfen kann, ob man sich mit der Maus gerade über dem Weg oder daneben befindet...
ich könnte den Weg einfach mit transparenten Cubes abdecken und dann die Kollision mit den Türmen beim Bauen abfragen aber ich glaube es geht eleganter....
Hat jemand eine Idee?

Wäre froh (frohe Weihnachten an alle! Razz), thx Smile

lg

beanage.johannes

BeitragMo, Dez 21, 2009 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
glaube sowas wurde neulich schonmal gefragt mit textur "kollision"

Tankbuster

BeitragMo, Dez 21, 2009 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Eventuell die Welt in ein Raster aufteilen, und die Welt mit einem Dim-Feld, oder sowas definieren. Eigentlich soeine Art Tilemap. Dann hat ein Feld entweder "Weg" oder "kein Weg" Wink
Twitter
Download Jewel Snake!
Windows|Android

Midimaster

BeitragMo, Dez 21, 2009 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
ist den die Textur auf einem Terrain, oder sowas? Ist es wirklich 3D?

Oder meinst Du mit Texture, ein Hintergrundbild das mit DrawImage gemalt ist.

Wie entsteht denn die Texture am Bildschirm?

Ananas

BeitragMo, Dez 21, 2009 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke schonmal für die Antworten, bin noch am rumexperimentieren Wink

@Midimaster: Ja die Textur ist wirklich auf einem Terrain. zuerst wird Gras über die ganze Map gepflanzt und dann noch den Weg, wo es Weg haben soll...

Xeres

Moderator

BeitragMo, Dez 21, 2009 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Speicher die Karte als 2D Array und generiere die Textur beim laden aus fertigen Kacheln; sollte schnell genug gehen und über den Skalierungsfaktor solltest du genau wissen, wo was ist.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragMo, Dez 21, 2009 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, gibt's das in BlitzBasic? Ich dachte das wäre dann B3D...

Du schreibst: "....Weg, wo es weg haben soll...". Wie erstellst Du das? Wäre da nicht eine Möglichkeit ein schwarzweiß-Texture zu erstellen, auf der man später leicht "nachschauen" könnte?

mit EntityX() und EntityZ() vom Spieler, weißt Du, wo er sich auf dem Terrain befindet. Jetzt muss Du nur noch genau auf die Texturstelle rückschließen und in der s/w-Texture nachsehen, ob diese Stelle schwarz(=weg) oder weiss ist.
  • Zuletzt bearbeitet von Midimaster am Di, Dez 22, 2009 0:08, insgesamt einmal bearbeitet

Ananas

BeitragMo, Dez 21, 2009 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ich habe für den Weg eine schwarz-Weiss-Textur. Wie kann ich denn die Farbe eines bestimmten Pixels auf einer Textur ermitteln? Surprised

Midimaster

BeitragMo, Dez 21, 2009 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
das wäre ja der leichtere Teil....die schwierige Frage ist: Wie kann ich aus der Spielerposition wissen, welches PixelX/Y aus der Texture an dieser Landschaftstelle zu liegen kommt?


Code: [AUSKLAPPEN]

Function IstDaWegAufDerTexture(X,Y)
    SetBuffer ImageBuffer(SW_Texture)
    GetColor X, Y
    If colorRed()=1 then
        Return True
    Else
        Return False
    Endif
Endif
  • Zuletzt bearbeitet von Midimaster am Di, Dez 22, 2009 0:10, insgesamt 2-mal bearbeitet

Tankbuster

BeitragDi, Dez 22, 2009 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
VertexX VertexY VertexZ sollten da weiterhelfen.

Ich finde jedoch die Methode von mir und Xeres am besten. Einfach die Map Kacheln, und bestimmte Kacheln - da wo der Weg verläuft- unbebaubar zu machen Wink
Twitter
Download Jewel Snake!
Windows|Android

Ananas

BeitragDi, Dez 22, 2009 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen Dank an alle hat mir sehr geholfen Smile Das wird jetzt wohl ein Weilchen dauern bis ich das ganze schön hinkriege aber es ist ein weiteres Problem aufgetaucht, ich frag jetzt gleich hier um keinen neuen Thread mehr aufmachen zu müssen:

Wenn man im Menü den Turm zum Bauen anklickt und ihn dann auf dem Terrain platzieren will, sollte er immer schön an dem Ort angezeigt werden, an den auch die Maus zeigt. Wie finde ich heraus an welche Koordinaten auf dem Terrain (3D) der Mauszeiger (2D) zeigt?

mfg

Midimaster

BeitragDi, Dez 22, 2009 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Erzähl mal, wie du es jetzt gemacht hast...

Ich wäre sehr daran interessiert zu erfahren wie man eine Texture scalieren muss, damit sie genau 1x auf das Terrain passt.

Wie ist der Zusammenhang der Werte Texturgrösse - Mapgrösse - ScaleEntity - ScaleTexture ?

Ich hab das nie so ganz kapiert und probier meist rum

Tankbuster

BeitragDi, Dez 22, 2009 0:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Bittesehr:
dafür gibt es die Pick-Befehle Wink
PickedX , ect

Code: [AUSKLAPPEN]
 Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer()
camera = CreateCamera()
light = CreateLight()
cube = CreateCube()
PositionEntity camera, 0, 0, 0
RotateEntity light, 90, 0, 0
PositionEntity cube, 0, 0, 10
EntityPickMode cube, 2

While Not KeyDown(1)
   TurnEntity cube, .5, 1, 2
   mx = MouseX()
   my = MouseY()
   entity = CameraPick(camera, mx, my)
   If entity = 0 Then EntityColor cube, 255, 255, 255
   If entity<>0 Then EntityColor cube, 0, 255, 0
   RenderWorld
   If entity = 0 Then Text 0, 0, "Nicht ausgewählt"
   If entity<>0 Then
      Text 0, 0, "Ausgewählt:" + entity
      Text 0, 20, "X:" + PickedX()
      Text 0, 40, "Y:" + PickedY()
      Text 0, 60, "Z:" + PickedZ()
   EndIf
   Oval mx - 5, my - 5, 10, 10, 1
   Flip
Wend
End
Twitter
Download Jewel Snake!
Windows|Android

Ananas

BeitragDi, Dez 22, 2009 0:37
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Midimaster: Naja ich probier auch meist rum, aber diesmal wars bei mir so: die Grösse des Terrains (Heighmap) ist 512*512. Die schwarz-weiss Textur die anzeigt wo der Weg draufgepflanzt wird habe ich im Programm dann skaliert: ScaleTexture bla,512,512
So passt sie genau 1 mal aufs Terrain. Deshalb vermute ich, dass eine nicht skalierte Textur pro Pixel des Heighmaps einmal aufs Terrain kommt.
(naja ka vielleicht ist es Unsinn aber bei mir klappts^^)

Für mein Weg-Kollisionsproblem hatte ich grad noch nen anderen Einfall für ne Lösung: Ich könnte ja einfach den Weg ein bisschen tieferlegen als alles andere und dann die Y-Koordinate überprüfen ob sie tief (=Weg) oder hoch (=kein Weg) ist. Was haltet ihr davon?

@Tankbuster: Thx! Smile das Picked-Zeugs funktioniert prima Very Happy

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Dez 22, 2009 0:37
Antworten mit Zitat
Benutzer-Profile anzeigen
@Midimaster,

ScaleTexture muß auf die größe der Highmap-Textur eingestellt sein. Dann zieht sich die Textur über das gesamte Terrain*. ScaleEntity auf ein Terrain oder überhaupt auf ein Entity verändert nicht die UV-Koordinaten, womit das egal ist wie groß es skalliert wurde.

*Eine Textur sollte quadratisch sein und eine 2er Potenz Kantenlänge haben.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Midimaster

BeitragDi, Dez 22, 2009 1:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, wenn das so ist, dann ist es ja ganz leicht:

Code: [AUSKLAPPEN]
Funktion FarbeUnterPlayer()
    X=EntityX(Player)
    Z=EntityZ(Player)
    TextureX= TerrainX( terrain,X,Y)
    TextureY= TerrainZ( terrain,X,Y)
   
    SetBuffer ImageBuffer(SW_Texture)
    GetColor TextureX, TextureY
    SetBuffer BackBuffer
    Return  colorRed()
end function   

Chester

BeitragDi, Dez 22, 2009 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Tankbuster hat bzgl. des Weg/Kein-Weg Problems doch die einfachste Lösung schon gesagt. Das über die Textur zu lösen, ist wesentlich aufwendiger!

Erstelle einfach ein Dim Array, mit den Dimensionen deiner Map.

Wenn du nun ein Weg irgendwo hin baust, dann setzt du Map(Weg_X,weg_Y) auf 1.

Wenn du jetzt nen Turm bauen willst, prüfst du einfach ob in der Map die Position Map(Turm_X, Turm_Y) schon auf 1 ist, wenn ja, kann hier nicht gebaut werden.

In meinem TD für den BCC33 mache ich es genauso und es funktioniert tadellos.

Wobei du allerdings aufpassen musst, beim Umrechnen von 2D auf 3D.
Meine Map z.B. geht quadratisch von -70 bis 70, da sieht der Code dann so aus:

Code: [AUSKLAPPEN]
Local MMap_x = Int(PickedX())
Local MMap_y = Int(PickedZ())

If (MMap(70 + MMap_x , 70 + MMap_y) = 0 ) Then ; Baue...

Midimaster

BeitragDi, Dez 22, 2009 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Was issen an dem 10-Zeiler noch kompliziert? Die Routine sagt Dir 100% welche Farbe das Terrain-Pixel genau unter dem Player hat.

Ananas musste nur eine zweites Bild aus der Textur herstellen, das den Weg als schwarzes Band enthält. Das ist viel schneller zu machen als ein Array zu erstellen, weil es Dir jedes Grafikprogramm in 1sec macht und es ist viel genauer. Da rastert auch nix. Und Peformance kostet es auch nicht, denn wir legen es ja nicht als 2.Texture auf das Terrain.

Wenn mans genau betrachtet ist es ja ein "Array(255,255)", dass sich mit dem Malprogramm erstellen lässt.

Ausblick: Man könnte mit mehreren Farben sogar beliebig viele Gebiete abstecken, wo besondere Bedingungen herschen.

Chester

BeitragDi, Dez 22, 2009 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
Wenn mans genau betrachtet ist es ja ein "Array(255,255)", dass sich mit dem Malprogramm erstellen lässt.

Eben. Warum also den Umweg über ein Image?

Mit aufwendiger meinte ich nicht den Programmieraufwand, sondern die Berechnung.
Terrainkoordinatenumrechnung, BufferWechsel und eine Farbabfrage benötigen mehr Rechenzeit als ein CameraPick und eine Arrayabfrage. Selbst mit ReadPixelFast müsste es immer noch langsamer sein.

Nicdel

BeitragDi, Dez 22, 2009 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Selbst mit ReadPixelFast müsste es immer noch langsamer sein.


Ist bei mir sogar langsamer als mit GetColor.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group