Problem mit Layern in einer TileMap?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Problem mit Layern in einer TileMap?

BeitragDi, Feb 02, 2010 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute, ich bins schon wieder mit meiner Tilemap.

Ich hab folgendes bisher getan:
Ich habe in mein Array eine weitere Dimension für den Layer eingebaut.
Dort will ich jetzt Häuser bzw Wegpunkte setzen per Mausklick, also momentan nur Häuser.
Das mit dem setzen funktioniert im Prinzip.
Also, wenn ich irgendwo im Layer 2 (0,1,2) auf eine Stelle klicke, dann merke ich, dass dort ein Haus gesetzt wurde, aber nicht so wie es sein sollte:
Wenn ich dann mit der Maus über die Stelle fahre bekomme ich dort keine Informationen mehr angezeigt und kann dort auch nichts mehr zeichnen.

Soweit der Code der relevant ist:

Code: [AUSKLAPPEN]
Dim Map(XMAPSIZE,YMAPSIZE,2)


bzw mal die komplette Hauptschleife:
Code: [AUSKLAPPEN]
Repeat
   
   KHPlus = KeyHit(27)
   KHMinus = KeyHit(53)
   
   MausRad=MausRad-MouseZSpeed()
   If MausRad>9 Then MausRad=9
   If MausRad<0 Then MausRad=0
   
   If KHPlus Then Layer = Layer + 1
   
   If KHMinus Then Layer = Layer - 1
   
   If Layer > 2 Then Layer = 2
   If Layer < 0 Then Layer = 0
      
   
   MH = MouseHit(2)
   
   If MH = 1 Then Gewaehlt = (Gewaehlt+1) Mod Tileanzahl
   
   XPos = XPos+(KeyDown(205)-KeyDown(203))*2
   YPos = YPos+(KeyDown(200)-KeyDown(208))*2
   
   If XPos<0 Then XPos=0
   If YPos<0 Then YPos=0
   If XPos>XWALL Then XPos=XWALL
   If YPos>YWALL Then YPos=YWALL
   
   XRtv=Floor(XPos/(TILESIZE))
   YRtv=Floor(YPos/(TILESIZE))
   
   For Yi = 0 To YDRAWTILES
      For Xi = 0 To XDRAWTILES
         If (Map(Xi+XRtv,Yi+YRtv,1)=>0) Then DrawImage3D(TileFrame, XOFFSET-(XPos Mod TILESIZE)+Xi*TILESIZE,YOFFSET-(YPos Mod TILESIZE)+Yi*TILESIZE, 1, 0, 1, Map(Xi+XRtv,Yi+YRtv,1))
         
         If (Map(Xi+XRtv,Yi+YRtv,2) = 1) Then Drawimage3d(Haus1, XOFFSET-(XPos)+Xi,YOFFSET-(YPos)+Yi, 1, 0, 1)
         
         If mouseover3d Then
            Text3D(Schriftart,MouseX3D+20,Mousey3D,(Xi+XRtv)+" "+(Yi+YRtv),0)
            Rect3D(Textur,XOFFSET-(XPos Mod TILESIZE)+Xi*TILESIZE,YOFFSET-(YPos Mod TILESIZE)+Yi*TILESIZE,TILESIZE/2+TILESIZE*MausRad,TILESIZE/2+TILESIZE*MausRad,1,2)
            drawimage3d(TileFrame, mousex3d, mousey3d,  1, 0, 1, Gewaehlt)
            text3d(Schriftart, Mousex3d, mousey3d-20, Map(Xi+XRtv,Yi+YRtv,2),0)
         EndIf
         
         Select Layer   
               
               
            Case 0
               
            Case 1
         
               If MouseDown3D=1 Then
                  For Yj=-MausRad To MausRad
                     For Xj=-MausRad To MausRad
                        If (Xi+Xj+XRtv)=>0 And (Xi+Xj+XRtv)<=XMAPSIZE Then
                           If (Yi+Yj+YRtv)=>0 And (Yi+Yj+YRtv)<=YMAPSIZE Then
                              Map(Xi+Xj+XRtv,Yi+Yj+YRtv,1)=Gewaehlt
                           End If
                        End If
                     Next
                  Next
               End If
               
            Case 2
               
               If mousedown3d=1 Then
                  
                  Haus.THaus = New THaus
                  Haus\HX = Xi+XRtv
                  Haus\HY = Yi+YRtv
                  Haus\HImage = Haus1
                  Haus\HWinkel = 0
                  Haus\HArt = 1
                  Haus\HDead = 0
                  
                  Map(Xi+XRtv,Yi+YRtv,2) = 1
                  
               EndIf
               
         End Select
         
            
;            For i = -(DrawSizeX/2) To (DrawSizeX/2)
;               For i2 = -(DrawSizeY/2) To (DrawSizeY/2)
;                  Map(Xi+i,Yi+i2)=Gewaehlt
;            Next
;         Next
            
         ;EndIf
      Next
   Next


Ich wäre echt froh, wenn mir mal jemand weiterhelfen könnte, weil das eigentlich nicht so funtzt wie es sollte.
Und ich verstehe auch nicht, warum dort keine Infos mehr angezeigt werden.

Lg, M0rgenstern

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Feb 02, 2010 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Da eine Abfrage gemacht wird, ob überhaupt zu zeichnen ist, kann bei einem Tile das nicht gezeichnet wird, auch keine Kollision via Mouse(Hit/Pit/Over/Down)3D gemacht werden.

Code: [AUSKLAPPEN]
If (Map(Xi+XRtv,Yi+YRtv,1)=>0) Then ...

Aus diesem Grund sollte dann die Position besser berechnet werden (zum Beispiel mit RectsOverlap). Du kannst dafür die bereits vorberechneten Variablen Xi und XRtv benutzen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Xeres

Moderator

BeitragDi, Feb 02, 2010 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
MausRad=MausRad-MouseZSpeed()
If MausRad>9 Then MausRad=9
If MausRad<0 Then MausRad=0
Lässt sich kürzer schreiben als:
Code: [AUSKLAPPEN]
MausRad=(MausRad+MouseZSpeed()+10) Mod 10
Selbiges gilt für die Layer Wink
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)

M0rgenstern

BeitragDi, Feb 02, 2010 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, das kommt immer auf den vorangegangenen Zeichnebefehl an.
Wenn ich die beiden Zeichenbefehle vertausche, dann zeigt er mir jetzt wenigstens die Infos an.
Danke.

Aber das Bild vom Haus wird nicht gezeichnet.
Weiß jemand vllt woran das liegt?.

Lg, M0rgenstern

EDIT:
Also, um das ganze besser zu erklären:

Ich hab ein dreidimensionales Array. Die dritte Dimension gibt den Layer an.
Jetzt will ich auf dem 3. Layer (bzw dem 2., weil von 0 ab gezählt wird) ein Haus per Mausklick erstellen.
Dementsprechend soll das Haus angezeigt werden, undzwar mit dem Tile als Mittelpunkt der Grafik.
Das Tile wird auch auf 1 gesetzt, aber das Haus nicht angezeigt.

Vielleicht ist es jetzt besser erklärt.

M0rgenstern

BeitragDo, Feb 04, 2010 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich hab das ganze jetzt anders versucht, aber das wird irgendwie viel zu langsam.
Das Programm ist wirklich total langsam sobald ich ein Haus erstelle.

Ich hab die Schleife um folgenden Code erweitert:

Code: [AUSKLAPPEN]
For Yi = 0 To YDRAWTILES
      For Xi = 0 To XDRAWTILES
         
         ;If (Map(Xi+XRtv,Yi+YRtv,2) = 1) Then Drawimage3d(Haus1, XOFFSET-(XPos)+Xi,YOFFSET-(YPos)+Yi, 1, 0, 1)
         
         For Haus.THaus = Each THaus
            DrawImage3d(Haus1, XOFFSET-(XPos Mod TILESIZE)+Haus\HX, YOFFSET-(YPos Mod TILESIZE)+Haus\HY, 1, 0, 1)
         Next


Also, nur das letzte was im Codeblock steht ist neu.
Das Haus sitzt nicht richtig, da muss ich noch an der Position feilen.
Aber das Programm ist schon nach einem Haus langsam ohne Ende.

Wäre echt nett wenn mir jemand bei dem ganzen helfen könnte.

Lg, M0rgenstern

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Feb 05, 2010 0:49
Antworten mit Zitat
Benutzer-Profile anzeigen
M0rgenstern hat Folgendes geschrieben:
Also, ich hab das ganze jetzt anders versucht, aber das wird irgendwie viel zu langsam.
Das Programm ist wirklich total langsam sobald ich ein Haus erstelle.

Du hast in deinen beinden verschachtelten Schleifen die Variablen Xi und Y1 drin ablaufen. Wenn du nun innerhalb dieser beiden Schleifen deine Each-Schleife laufen lässt, dann wird diese jedes Frame (XDRAWTILES*YDRAWTILES) mal aufgerufen. Noch mal: Jedes Frame immer wieder neu! Wenn nun XDRAWTILES=39 und YDRAWTILES=29 ist, dann wird bereits diese Schleife jedes Frame 1200 mal aufgerufen. Außerdem wird in dieser überhaupt kein Bezug auf Xi und Yi genommen, wodurch du diese Schleife auch genauso gut außerhalb von den beiden verschachtelten Schleifen packen kannst.

- - -

M0rgenstern hat Folgendes geschrieben:
Das Haus sitzt nicht richtig, da muss ich noch an der Position feilen.

Das Haus wird logischer Weise nicht richtig positioniert, weil die ganzen zuvor berechneten Variablen nicht benutzt werden. Welche du dafpr nutzen kannst, siehst du an den auskommentierten Codeteil.

- - -

Wofür brauchst du drei Layer? Zwei sollten auch reichen.

Bei mehreren Layern, muß natürlich auch mehrfach an selber Stelle gezeichnet werden.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

M0rgenstern

BeitragFr, Feb 05, 2010 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine Tipps. Ist eigentlich logisch, sorry.

Wegen den drei Layern:
Ich will einmal den "Boden" Also die Tiles. Dann eine "Umgebung" darüber, also Häuser etc. Und der unterste Layer sollen Wegpunkte für die Gegner werden.
Deshalb habe ich gedacht ich sollte drei Layer benutzen.
Oder hast du da ne bessere Lösung?

Lg, M0rgenstern

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 06, 2010 0:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Nehms mir nicht übel, aber der Grund warum ich zum Teil etwas eingeschränkte Antworten gebe ist, dass es auch wirklich wichtig ist den Code zu verstehen. Mit nur fertigen Codes wirst du zwar zunähst schneller vorran kommen, aber dann am Ende wieder nicht weiter kommen. Wink

So, und jetzt zu deiner Frage:

Das mit drei Layer ist in Ordnung so. Ich hatte schon befürchtet, du willst drei Layer zum zeichnen verwenden. Das ist in den meisten Fällen nicht notwendig. Die meisten nehmen dann den Kollisionslayer so, das eine enthaltene 1 eine Wand bedeutet, und eine 0 eben nicht. Man kann natürlich auch die Wegekosten einsetzen. So würde eine unüberwindbare Wand zum Beispiel %7FFFFFFF kosten, Asphalt =1, und Wasser zum Beispiel =10 oder so. Siehe A*-Algorithmus.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

M0rgenstern

BeitragSa, Feb 06, 2010 8:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Hectic.

Ich versteh schon, warum du mir nur bedingt Antworten gibts und das ist auch gut so. Hast schon recht, sonst würd ichs net lernen.
Habs jetzt übrigens umprogrammiert und es funktioniert jetzt perfekt:

Code: [AUSKLAPPEN]
If (Map(Xi+XRtv,Yi+YRtv,2) = 1) Then Drawimage3d(Haus1, XOFFSET-(XPos Mod TILESIZE)+Xi*TILESIZE,YOFFSET-(YPos Mod TILESIZE)+Yi*TILESIZE, 1, 0, 1)


Und hier der Code wegen den Häusern.
Mir ist nämlich aufgefallen, dass vorher bei einem "klick" ziemlich viele Häuser erstellt wurden wegen dem Mousedown:

Code: [AUSKLAPPEN]
If mousedown3d=1 Then
                  
                  If Map(Xi+XRtv,Yi+YRtv,2) = 0 Then
                     
                     Map(Xi+XRtv,Yi+YRtv,2) = 1
                  
                     Haus.THaus = New THaus
                     Haus\HX = Xi+XRtv
                     Haus\HY = Yi+YRtv
                     Haus\HImage = Haus1
                     Haus\HWinkel = 0
                     Haus\HArt = 1
                     Haus\HDead = 0
                  
                  EndIf
                  
               EndIf


Das mit dem Kollisionslayer halt ich für ne richtig gute Idee, ich glaube, den bau ich auch noch ein.
Denn was ich wirklich schrecklich fände, wäre einheitliche Tilemaps zu haben nur damit Map(x,y) = 3 immer eine Wand oder Wasser oder so ist.
Das wär auch glaube ich nicht sehr dynamisch.

Also, ich weiß nicht, ob das ganze für die Gegner mit A* sein soll. Ich hab mir eher gedacht, dass ich Wegpunkte setze im Editor, die dann später gespeichert werden und im Spiel nicht sichtbar sind.
Dann bin ich wahrscheinlich auch am flexibelsten, indem ich bestimmte Bereiche für Gegner sperren kann und so.
Die Wegpunkte sollen dann einfach verbunden werden mit einem anderen (wahrscheinlich passiert das manuell). Somit kann man die Wege genau einschränken.

Vielen Dank für deine Hilfe.

Lg, M0rgenstern

Edit:

Okay, ich bräuchte doch nochmal Hilfe.
Das Speichern funktioniert nicht mehr, bzw das laden.
Also, die Dateien werden erstellt und es wird auch was reingeschrieben, aber wenn ich dann das Programm neu starte und dann lade steht zwar da, dass die Map geladen wurde, d.h. er hat die Datei gefunden, aber die Map auf dem Bildschirm ändert sich kein bisschen.
Und ich bin auch schon durch die ganze Map gescrollt.

Hier ist der Code zum Laden:

Code: [AUSKLAPPEN]
   Local InputName$
   Local FileName$
   ;F1=LOAD
   If KeyHit(59) Then
      InputName$ = Input$("Bitte Gib den Namen der Map an: ")
      If FileType("maps\"+InputName$+".dat") = 1 Then
         Datei = ReadFile ("maps\"+InputName$+".dat")
         For Yi = 0 To YGroesse
            For Xi = 0 To XGroesse
               Map(Xi+XRtv,Yi+YRtv,1)=ReadByte(Datei)
               ;Map(Xi,Yi,2)=ReadByte(Datei)
               ;Map(Xi,Yi,0)=ReadByte(Datei)
            Next
         Next
         CloseFile Datei
         Print "LOAD"
         Delay 1000
      EndIf
   End If


Und hier zum speichern:

Code: [AUSKLAPPEN]
;F2=SAVE
   If KeyHit(60) Then
      InputName$ = Input$("Bitte Gib den Namen der Map an: ")
      Datei = WriteFile ("maps\"+InputName$+".dat")
      For Yi = 0 To YGroesse
         For Xi = 0 To XGroesse
            WriteByte Datei,Map(Xi+XRtv,Yi+YRtv,1)
            ;WriteByte Datei,Map(Xi,Yi,2)
            ;WriteByte Datei,Map(Xi,Yi,0)
         Next
      Next
      CloseFile Datei
      Print "SAVE"
      Delay 1000
   End If



Ich habs auch schon ohne +xrtv bzw +yrtv versucht.
Ganz ehrlich, ich versteh wirklich nicht warum ers jetzt nicht macht. Meiner Meinung nach stimmt da alles.


Lg, M0rgenstern

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Feb 10, 2010 1:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Also erstmal natürlich ohne XRtv und YRtv.

Dann wäre gut zu wissen welche Werte XGroesse und YGroesse zu diesem Zeitpunkt haben? Denn diese sollten den gleichen Wert haben, mit welchen mit Dim das Array dimensioniert wurde.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

M0rgenstern

BeitragMi, Feb 10, 2010 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
*Hust*

Man sollte vllt überall die gleichen Variablen benutzen.
Danke dass du mich drauf aufmerksam gemacht hast, ich muss eindeutig sauberer arbeiten.

Tut mir echt leid, dass ich son Blödsinn dauernd mache.

Hab jetzt mal Ferien, da wirds dann wieder besser... Versprochen.

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group