Iso problem
Übersicht

![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
korrigier mich wenn ich falsch liege, aber eg muss doch oben links als erstes und unten rechts als letztes gezeichnet werden.
also musst du doch nur beim erstellen einen würfel erstellen, an die erste position packen mit insert before first und dann mit insert after nach hinten durchreichen, bis er an der richtigen position steht. und die richtige position ist halt geordnet nach der formel die ich mir ausgedacht habe, ich weiß nich was die ganzen ifs sollen |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
tedy |
![]() Antworten mit Zitat ![]() |
---|---|---|
nein eben nicht da das was man zuerst zeichnet immer hinten ist und somit siehst du die kante vom hinteren block auf dem vorderen ^^ | ||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hab ein bischen gebastelt, erkläre es morgen nochmal ausführlicher...beziehungsweise suche den fehler...es geht nämlich auch nich ![]() Code: [AUSKLAPPEN] Graphics 800,600,32,2
SetBuffer BackBuffer() Global tile=LoadImage("iso1.png") Global box=LoadImage("box.png") MaskImage tile,255,255,255 HandleImage box,0,ImageHeight(box)-16 Type box Field x,y End Type Function createbox(x,y) a.box=New box a\x=x a\y=y pos=a\y*32+a\x Insert a Before First box b.box=After a If(b<>Null) ;einfuegen, sonst immer am anfang Repeat pos2=b\y*32+b\x If(pos<pos2) Insert a before b Exit EndIf If(b<>Last box) b=After b Else DebugLog "ans ende damit" Insert a After Last box Exit EndIf Forever EndIf End Function Function drawbox() For b.box=Each box PositionX = (b\x-b\y) * 32 /2 PositionY = (b\x+b\y) * 16 /2 DrawImage box, PositionX,PositionY Next End Function createbox(20,16) createbox(21,16) createbox(20,17) createbox(21,17) createbox(21,18) Repeat Cls For x=0 To 31 For y=0 To 31 PositionX = (x-y) * 32 /2 PositionY = (x+y) * 16 /2 DrawImage tile,PositionX,PositionY Color 0,0,0 Text positionx,positiony,x+""+y Next Next drawbox() Flip Until KeyHit(1) |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
- Zuletzt bearbeitet von Goodjee am Do, Dez 11, 2008 14:35, insgesamt einmal bearbeitet
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich glaube du verstehst mich etwas falsch, oder ich deinen code, denn in deinem code kann man nicht mit der Maus Blöcke "malen" sondern sie werden einfach nur sozusagen als map "gemalt", das wäre natürlich das geringste problem bei mir. zumal ich auch nur 1tile als boden brauch und die blöcke werden später durch Häuser ersetzt ![]() Was ich nicht verstehe ist wieso es in Bmax so einfach ist?! Könnte auch sein das ich die umsetzung total falsch geschrieben hab und es dadurch nicht geht. Hier der code zur Bmax version: Code: [AUSKLAPPEN] SuperStrict Framework brl.max2d Import brl.glmax2d Import brl.bmploader Graphics(800,600,32) SetBlend ALPHABLEND Const TILE_WIDTH:Int = 64 Const TILE_HEIGHT:Int = 80 Local tile:TImage = LoadAnimImage("it.bmp", TILE_WIDTH, TILE_HEIGHT, 0, 2) Local maus:TImage = LoadImage("m.bmp") Local col:TImage = LoadImage("col.bmp") Global map_w:Int = 20 Global map_h:Int = 20 Global map:Int[,] = New Int[map_w, map_h] Local fx:Int = 400 Local fy:Int = 0 Local off_x:Int = 32 Local off_y:Int = 16 Local s:Int = 0 Local z:Int = 0 Init() Repeat Cls Local mx:Int = MouseX() Local my:Int = MouseY() s = 0 z = 0 Local sx:Int = fx Local sy:Int = fy Local x:Int = sx Local y:Int = sy Repeat DrawImage(col, x, y) DrawImage(tile, x, y, map[s, z]) If ImagesCollide(maus, mx, my, 0, col, x, y, 0) If MouseDown(1) Then map[s, z] = 1 If MouseDown(2) Then map[s, z] = 0 SetColor 255,0,0 SetAlpha 0.5 DrawImage(tile, x, y, 1) SetAlpha 1.0 setcolor 255,255,255 End If x:-off_x y:+off_y s:+1 If s = map_w s = 0 sx:+off_x sy:+off_y x = sx y = sy z:+1 End If Until z = map_h DrawImage(maus, mx, my) Flip Until KeyHit(KEY_ESCAPE) End Function Init() Local s:Int = 0 Local z:Int = 0 Repeat map[s, z] = 0 s:+1 If s = map_w s = 0; z:+1 End If Until z = map_h End Function |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich sehe da keinen widerspruch...denn zum blöcke erstellen gibt es eine funktion...nur die maussteuerung, die diese funktion aufruft fehlt halt ![]() der blitzmax code macht es ja generell etwas anders, er speichert die blöcke auch in dem maparray, welches in der richtigen reihenfolge gemalt wird, genau wie der boden, und nich in types wie du es versuchst. folglich kann er sich sortierungen sparen |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie schon gesagt, Type & Array...
Code: [AUSKLAPPEN] Graphics(800, 600, 0, 2)
Type Ttile Field r, g, b End Type Const Map_X = 32, Map_Y = 32 Dim Map.Ttile(Map_X, Map_Y) For i=0 To 10 Ttile_Create(Rand(0,Map_X), Rand(0,Map_Y)) Next For x=0 To Map_X For y=0 To Map_Y If Map(x, y) <> Null Then Color(Map(x, y)\r, Map(x, y)\g, Map(x, y)\b) Rect(x*16, y*16, 8, 8) EndIf Next Next WaitKey() End Function Ttile_Create(fx, fy) Map(fx, fy) = New Ttile Map(fx, fy)\r = Rand(128, 255) Map(fx, fy)\g = Rand(128, 255) Map(fx, fy)\b = Rand(128, 255) End Function |
||
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) |
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey, die Lösung von Xeres hat doch tatsächlich funktioniert, das hätte ich nicht gedacht das es nur an dem fehlendem Array liegt! Zusätzlich hab ich nichtmal einen Type gebraucht!
Hier mein neuer Code (für alle die damit noch probleme haben): Code: [AUSKLAPPEN] Graphics(800,600,32)
SetBuffer BackBuffer() Const TILE_WIDTH = 64 Const TILE_HEIGHT = 80 Local Timer=CreateTimer(60) Global tile = LoadAnimImage("it.bmp", TILE_WIDTH, TILE_HEIGHT, 0, 4) Global maus = LoadImage("m.bmp") Global col = LoadImage("col.bmp") Global map_w = 20 Global map_h = 20 Dim map(map_w, map_h) Global fx = 400 Global fy = 0 Global off_x = 32 Global off_y = 16 Global s = 0 Global z = 0 Init() Repeat Cls Local mx = MouseX() Local my = MouseY() DrawImage(maus, mx, my) s = 0 z = 0 Local sx =Int fx Local sy =Int fy Local x =Int sx Local y =Int sy If MouseHit(1) Then hit = 1 Else hit = 0 EndIf If MouseDown(2) Then EndIf Repeat DrawImage(col, x, y) DrawImage(tile, x, y, map(s, z)) If ImagesCollide(maus, mx, my, 0, tile, x, y, 0) If hit=1 Then map(s, z) = 1 FlushMouse EndIf DrawImage(tile, x, y, 1) End If x=x-off_x y=y+off_y s=s+1 If s = map_w s = 0 sx=sx+off_x sy=sy+off_y x = sx y = sy z=z+1 EndIf Until z = map_h WaitTimer(Timer) Flip 0 Forever End Function Init() Local s = 0 Local z = 0 Repeat map(s, z) = 0 s=s+1 If s = map_w s = 0 z=z+1 End If Until z = map_h End Function Und hier kommt mein großes danke ![]() Edit: Es geht zwar jetz alles wie ich es wollte aber nun bahnt sich ein anderes problem an. Und zwar möchte ich ja mit Types arbeiten, aber dies geht nicht mit dem code den ich gepostet habe. Meine createhaus() function müsstet ihr ja langsam auswendig können xD' Naja sie schreibt ja x und y koordinaten des tiles auf auf was ich mit der Maus drücke, wenn ich das ganze nun mit Code: [AUSKLAPPEN] For h.haus=Each haus DrawImage(tile, h\x, h\y, map(s, z)) Next Code: [AUSKLAPPEN] For h.haus=Each haus DrawImage(tile, x, y, map(s, z)) Next Wenn ich das gane nochmal anderst mache spinnt wieder das mit dem sortieren rum ![]() Meine createhaus() function Code: [AUSKLAPPEN] Function createhaus(x, y) h.haus = New haus h\x = x h\y = y-66 map(s, z) = 2 End Function Bin für jede Hilfe sehr dankbar ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe bisher noch nicht hier geantwortet, aber ich habe mich schon die ganze Zeit gefragt wozu unbedingt ein Type für eine Tilemap benutzt werden muß. Denn, wenn man eine statische Map hat, dann bietet sich ein Array ja gerade zu an. Denn dieses kann direkt so eingezeichnet werden, es gibt keine Überschneidungen und auch kein Z-Order-Problem.
Im Normalfall sieht es so aus, dass man ein 2D-Array mithilfe Dim Map(x,y) erstellt. Um auf diesen noch eine Kollision einzubringen, kann man eine weitere Dimension einsetzen. Das sähe dann so aus: Dim Map(x,y,1). Nun bedeutet Map(x,y,0)=0 keine Kollision, und Map(x,y,0)=1 Kollision. Der Rest mit einer 1 am Ende, also Map(x,y,1) bleibt wie gehabt. Es werden lediglich die Imagehandles abgelegt. So kann jedes Feld nur ein Image beinhalten. Werden mehrere Bilder benötigt, so kann die letzte Dimension weiter erweitert werden. Die Aufteilung könnte dann in etwa so aussehen: Map(x,y,0) = Kollisionen (0/nicht, 1/kollision) Map(x,y,1) = Imagehandles für Layer 1 (z.B. Bodentiles) Map(x,y,2) = Imagehandles für Layer 2 (z.B. Häuser, Bäume) Map(x,y,3) = Imagehandles für Layer 3 (z.B. Brücken die über den Häusern sind) Ein Type ist zwar cool, aber auch nicht die Allgemeinlösung für alles. Wenn du aber ein guten Grund zur Benutzung eines Types nennen kannst, dann würde mich das schon interessieren. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ein Array feld mit mehreren Dimensionen wäre eine möglichkeit aber ich brauche Types und hier auch gleich die Begründung dazu:
Wie ich schon einmal in einem vorherigen Post hier gesagt habe, möchte ich eine kleine Simulation alâ Sim City Programmieren, zwar nicht ganz so komplex aber man brauch ja auch zum leben Häuser. Und die Types brauch ich nunmal um festzluegen z.b. wieviel Einwohner in einem Haus leben oder den dazugehörigen Haustyp ... etc. Nun ob das mit Arrays möglich ist, ist mir nicht bekannt, und genau deswegen setze ich in dem Fall auf Types. .. Obwohl... Man könnte natürlich das Tile in der jeweiligen Dimension ablegen und den rest dann über einen Type regeln, mal schnell schauen ob ich das hinkrieg... Hm, nein so wie ich es dachte gings nicht :/ Wieder einmal dieser überlappungseffekt Edit: So hab ichs jetzt verscuht, habe 2 dimensionen angelegt ( map(x,y,1) ) in der 0. Dimension habe ich die Bodentiles in der 1. die Häuser. Wenn ich das ganze mit diesen Befehlen ausgebe Code: [AUSKLAPPEN] DrawImage(tile, x, y-66, map(s, z,0)) DrawImage(tile, x, y-66, map(s, z,1)) Funktioniert es einwandfrei, aber dann habe ich gedacht, später bei der abfrage ob der mauszeiger damit kollidiert wenn ich die Gebäude-Abreißen funktion einbaue kann das doch garnicht gelöscht werden weil ich ja die x,y koordinaten nicht auslesen kann, oder bin ich total auf der falschen spur? Wenn ich das ganze versuche wieder so auszugeben: Code: [AUSKLAPPEN] For h.haus=Each haus DrawImage(tile, x, y, map(s, z,1)) Next Funktioniert wieder garnichtsmehr ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn eine Map über ein 2D-Array erstellt ist, dann wird nichtmal die Mausposition mit anderen Gegenständen berechnet werden müßen, sondern kann direkt ausgegeben werden. Also das direkte Tile worauf die Maus hinzeigt. Dazu habe ich mehrere mal hier irgendwo eine leichte Formel bereitsgestellt die eine Mausposition auf einer ISO-Map direkt umrechnet.
gesucht, gefunden..: https://www.blitzforum.de/foru...ht=#260903 oder auch ne Möglichkeit [B3D]..: https://www.blitzforum.de/foru...hlight=iso Für deine Zwecke wäre meiner Meinung nach die beste Lösung, eine Mischung aus einem 3D-Array und verlinkte Types. Das sähe dann in etwa so aus: Map(x,y,0) = Kollisionen (0/nicht, 1/kollision) Map(x,y,1) = Imagehandles für Layer 1 (z.B. Bodentiles) Map(x,y,2) = Imagehandles für Layer 2 (z.B. Häuser, Bäume) Map(x,y,3) = Imagehandles für Layer 3 (z.B. Brücken die über den Häusern sind) Map(x,y,4) = ggf. Verlinke Type-ID zu Objekteigenschaften, sonst 0 Jede Type-ID beinhaltet dann weitere Eigenschaften die notwendig sind Um verlinkte Types erstellen zu können, gibt es mir bekannte zwei Möglichkeiten: 1.) Über Return Handle ![]() 2.) Die bessere Lösung meiner Meinung. Siehe dazu folgenden Code mit einem 1D-Array Code: [AUSKLAPPEN] Type JaJa
Field WasIchBin$ Field WasIchHabe% End Type Dim Map.JaJa(3) Map(0)=SetJaJa("Mensch",300) Map(1)=SetJaJa("Polizei",400) Map(2)=SetJaJa("Der coolste",500) Map(3)=SetJaJa("Ein niemand",666) Print Get_WasIchBin(Map(0)) Print Get_WasIchHabe(Map(0)) Print Get_WasIchBin(Map(1)) Print Get_WasIchHabe(Map(1)) Print Get_WasIchBin(Map(2)) Print Get_WasIchHabe(Map(2)) Print Get_WasIchBin(Map(3)) Print Get_WasIchHabe(Map(3)) WaitKey Function SetJaJa.JaJa(FWasIchBin$,FWasIchHabe%) Local Inhalt.JaJa Inhalt.JaJa=New JaJa Inhalt\WasIchBin=FWasIchBin Inhalt\WasIchHabe=FWasIchHabe Return Inhalt End Function Function Get_WasIchBin$(FTypeID.JaJa) Return FTypeID\WasIchBin End Function Function Get_WasIchHabe%(FTypeID.JaJa) Return FTypeID\WasIchHabe End Function |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
auch wenn types ohne dim die unelegantere lösung sind, mein quellcode oben würde jetzt funzen ![]() |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jetzt wirds mir aber langsam wirklich zu hoch, naja dann werde ich wohl oder übel noch ein paar Wochen an dem Code dransitzen müssen ![]() PS: Wäre es nicht einfacher wenn ich mir eine eigene Iso-"Engine" baue? (weiß jetzt nicht ob engine dafür der richtige ausdruck ist) Also nicht den code von der BMax version (Hab leider den Autor namen vergessen) Wäre für mich zwar nicht einfach, da aber der code nicht gerade dynamisch ist und die FPS ziemlich runterdrückt wäre das doch die bessere lösung für mich? Zumal ich den Code nichtmal ganz verstehe *hust* ![]() Edit: Goodjee hast du dazu Grafiken?Wenn ja lad die mal bitte ins Codearchiv keine lust die selbst zu machen ![]() |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
vllt verstehst du disen code besser, ich hab ihn mal auskommentiert
Code: [AUSKLAPPEN] Graphics 800,600,32,2 SetBuffer BackBuffer() Global tile=LoadImage("iso1.png") Global box=LoadImage("box.png") MaskImage tile,255,255,255 HandleImage box,0,ImageHeight(box)-16 ;type für kisten, speichert lediglich die koordinaten Type box Field x,y End Type ;diese funktion erzeugt eine neue box und sortiert sie richtig ein ;kann zum beispiel bei mausklick ausgeführt werden ;x und y in tiles, nicht in pixeln Function createbox(x,y) a.box=New box a\x=x a\y=y ;reihenfolgenvergleichswert aus den beiden koordinaten und der breite der karte pos=a\y*32+a\x ;box an den anfang der liste setzen->wird als erstes gezeichnet->ganz hinten Insert a Before First box ;alle anderen boxen vergleichen b.box=After a If(b<>Null) ;einfuegen, sonst immer am anfang Repeat ;vergleichswerte für andere boxen errechnen pos2=b\y*32+b\x ;Wenn die box weiter vorne stehen müsste als die andere vor der anderen einfügen und aufhören If(pos<pos2) Insert a before b Exit EndIf ;Wenn man nicht ganz hinten ist mit der nächsten box weitermachen If(b<>Last box) b=After b Else ;wenn man mit der letzen box vergleicht hinter der letzen einfügen->neue box wird als letztes gezeichnet DebugLog "ans ende damit" Insert a After Last box Exit EndIf Forever EndIf End Function ;alle boxen malen Function drawbox() For b.box=Each box PositionX = (b\x-b\y) * 32 /2 PositionY = (b\x+b\y) * 16 /2 DrawImage box, PositionX,PositionY Next End Function createbox(20,16) createbox(21,16) createbox(20,17) createbox(21,17) createbox(21,18) Repeat Cls ;map malen For x=0 To 31 For y=0 To 31 PositionX = (x-y) * 32 /2 PositionY = (x+y) * 16 /2 DrawImage tile,PositionX,PositionY Color 0,0,0 Text positionx,positiony,x+""+y Next Next ;alle boxen malen drawbox() Flip Until KeyHit(1) |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der Code funktioniert einwandfrei aber ich hab da nochn problem bei der sache.
Und zwar kann ich meine eigenen gepixelten bilder nicht verwenden da verratzt die map hab auch schon alle werte der größen angepasst. Meine pics sind 64*140 groß, entweder ich bin einfach nur zu dumm oder naja... hier der screen: |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ohne den Code da oben gelesen zu haben, nehme ich an, dass du einfach deine Breiten und höhen in diesem Code übertragen hast. Was natürlich nicht richtig ist, denn jedes unterliegende Tile muß um die hälfte zur Seite verschoben werden. Das ist nun mal so bei einer ISO-Grafik. Und ehrlich, wenn selbst das ein Problem darstellt, dann solltest du zuerst eine einfache Tilemap (nicht ISO, nicht Hexagonal) machen. Denn die wirklichen Probleme kommen dann erst später. Vor allem mit einer ISO oder Hex -Map.
Denn du willst dich doch sicherlich nicht selbst frusten. Auch wegen der Komplexität sind ISO-Maps erst sehr viel später in Spielen aufgetaucht gegenüber den sehr viel einfacheren normalen Tilemaps. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit Tilemaps hab ich schon genug geproggt, wurde mir leider langsam zu langweilig ![]() Frusten tu ich mich deswegen nicht, weil aus fehlern lernt man. Ich progge ja nicht zum ersten mal, zwar noch nicht sehr lange mit BB aber dafür mit c/++ u.ä. finde aber BB übersichtlicher als c/++ und bin deshalb umgestiegen. Das eigentliche problem darin liegt das ich einfach ne niete im mathe bin und mir deshalb nicht viel darüber vorstellen kann. Da ja viele Iso tuts nicht wirklich zu gebrauchen sind mangels fehlendem beispiel code o.ä. muss ich natürlich selbst probieren und wenn es probleme gibt nachfragen, so ist das nun mal. Übrigens hab ich das Problem jetzt gelöst, benötigt nur noch ein wenig feintuning ![]() Und wenn ich das ganze feintuning fertig hab, werd ich versuchen mir das ding selbst zu schreiben. So finde ich, lerne ich besser. Aber das soll ja jetzt nicht alles Offtopic sein um über meine unfähigkeiten zu sprechen. Wie gesagt, habs ja jetzt soweit hinbekommen ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group