Problem mit Layern in einer TileMap?
Übersicht

![]() |
M0rgensternBetreff: Problem mit Layern in einer TileMap? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] MausRad=MausRad-MouseZSpeed()
Lässt sich kürzer schreiben als:
If MausRad>9 Then MausRad=9 If MausRad<0 Then MausRad=0 Code: [AUSKLAPPEN] MausRad=(MausRad+MouseZSpeed()+10) Mod 10 Selbiges gilt für die Layer ![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
*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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group