Iso problem
Übersicht

TigerkevBetreff: Iso problem |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also, ich habe ein problem mit meiner Iso darstellung der Grafiken.
Ich hab dieses http://www.colorflow.de/pub/download/isotest.zip sample gesaugt und auf b2d umgeschrieben. Nun habe ich aber das problem das sich die Grafiken wenn ich sie mit der Maus setze "überschneiden" hier ein screen: ![]() Also ich habe erst den vorderen Stein gesetzt und danach den anderen der den vorderen überlappt dahinter. Normalerweise müsste es aber so aus sehen: ![]() Und hier mein etwas noobiger code ![]() Main: Code: [AUSKLAPPEN] Graphics(800,600,32) SetBuffer BackBuffer() AutoMidHandle True Include "func.bb" Init() Repeat Cls Local mx = MouseX() Local my = MouseY() DrawImage(maus, mx, my) s = 0 z = 0 Local sx = fx Local sy = fy Local x = sx Local y = sy If MouseDown(1) Then hit = 1 Else hit = 0 EndIf If MouseDown(2) Then EndIf Repeat DrawImage(col, x, y) DrawImage(tile, x, y) If ImagesCollide(maus, mx, my, 0, col, x, y, 0) If hit=1 Then H.Haus=New Haus H\typ=tile H\x=x H\y=y H\ein=4 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 For H.Haus=Each Haus DrawImage H\typ, H\x-32, H\y-16,1 Next Flip Forever End Functions Code: [AUSKLAPPEN] ; variablen und constante Const TILE_WIDTH = 64 Const TILE_HEIGHT = 80 Global tile = LoadAnimImage("it.bmp", TILE_WIDTH, TILE_HEIGHT, 0, 2) Global maus = LoadImage("m.bmp") Global col = LoadImage("col.bmp") Global map_w = 20 Global map_h = 20 Global fx = 400 Global fy = 0 Global off_x = 32 Global off_y = 16 Global s = 0 Global z = 0 Type Haus Field typ Field x Field y End Type ; functions Function Init() Local s = 0 Local z = 0 Repeat map = 0 s=s+1 If s = map_w s = 0 z=z+1 End If Until z = map_h End Function Ich wusste nicht wie ich das problem suchen konnte und hab deshalb den Thread eröffnet bitte nicht böse sein ![]() Ich weiß das es nicht die beste umsetzung vom bmax code in den b2d code ist aber für meine testzwecke reicht es erst einmal. Hoffe ihr könnt mir helfen! ![]() |
||
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
gehe doch die Schleife rückwärts durch, so dass ale Grafiken, die als letzes Gemalt wurden vor den Grafiken, die als erstes gemalt wurden, gezeichnet werden. Edit: Bei Types dürfte "Before" helfen. Gruß TimBo |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
könntest du mir das evtl näher z.b. mit codeschnipsel- erklären, wir sind hier ja schlieslich in der beginners-corner ![]() |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
@timbo: das bringt nix... die setz-reihenfolge is ja nicht immer die gleiche...
sortier die dinger hald nach der entfernung zum bildschirm. die entfernung kannst du dir einfach mim phytagoras ausrechnen... wenn dus ganz findig machen willst, kannst du dir das ganze gleich in den types sortieren. z.b.: Code: [AUSKLAPPEN] type block field x, y, dist# end type function createblock(x, y) b.block = new block b\x = x b\y = y b\dist = (x^2+y^2)^.5 hb = handle(b) for a.block = each block if handle(a) <> hb then if b\dist>a\dist then insert b.block before a.block end if next end function (hab ich jetz nur schnell hier hingefetzt und nicht getestet, sollte aber funktionieren...) |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ DAK : ich Depp , heute bin ich echt voll verpeilt, hast natürlich Recht.
Dürfe es nicht auch gehen, wenn man von oben nach unten in der Reinfolge malt ? mfg TimBo |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
so hab das ganze jetzt mal umgesetzt auf meinen haus type
und die function bei mausklick aufgerufen Code: [AUSKLAPPEN] If ImagesCollide(maus, mx, my, 0, col, x, y, 0)
If hit=1 Then createhaus(x, y) FlushMouse EndIf DrawImage(tile, x, y, 1) End If dann das ganze so zeichnen lassen Code: [AUSKLAPPEN] For h.haus=Each haus
DrawImage h\typ, h\x, h\y,1 Next besteht aber immernoch das gleiche problem, was mach ich fasch? edit: achja die function sieht so aus Code: [AUSKLAPPEN] Function createhaus(x, y)
h.haus = New haus h\x = x h\y = y h\dist = (x^2+y^2)^.5 h\typ = tile hb = Handle(h) For a.haus = Each haus If Handle(a) <> hb Then If h\dist>h\dist Then Insert h.haus Before h.haus End If Next End Function und mein type so Code: [AUSKLAPPEN] Type haus
Field typ Field x Field y Field dist# End Type EDIT: Aw, ich sehs grade selbst! moment gleich nochmal testen... Edit3: nope geht immernoch nicht... bugfixed function sieht so aus: Code: [AUSKLAPPEN] Function createhaus(x, y)
h.haus = New haus h\x = x h\y = y h\dist = (x^2+y^2)^.5 h\typ = tile hb = Handle(h) For a.haus = Each haus If Handle(a) <> hb Then If h\dist>a\dist Then Insert h.haus Before a.haus End If Next End Function |
||
![]() |
tedy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst die sontieren indem du die blücke die oben rechts sind zuerst zeichnest...
eventuell musst du dir eine Sotier FUnktion machen die du bei neu setzen eines Blockes ausführst |
||
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
sorry für die blöde frage aber, wie mach is das? ![]() |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
folgendes wirst du brauchen:
insert, first, before, last , after und dann schau dir mal folgende sortierverfahren an: insertionsort, bubblesort und selectionsort. ich persönlich finde selectionsort am einfachsten, aber am ehesten für deinen verwendungszweck passt insertionsort, da du quasi immer in eine sortierte menge nur ein neues element eingliedern musst |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
oh gott, das wird ja immer kpmlizierter, ich werd mal rumprobieren und mich dann melden ![]() |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ums einfacher zu machen:
insert ![]() first ![]() before ![]() last ![]() after ![]() |
||
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit insertionsort siehts so aus:
Von oben nach unten gehts und von unten nach oben auch hier screen: So wenn ich jetzt aber von rechts nach links oder umgekehrt "male" (also mit der maus blöcke) Dann sieht das so aus wie vorher: Hier der Insertionsort code: Code: [AUSKLAPPEN] Function InsertionSort()
Local h.haus, Nexthaus.haus Local p.haus, q.haus Local dist% Nexthaus=After First haus While Nexthaus<>Null h=Nexthaus Nexthaus=After h p=h : temp=h\dist Repeat q=Before p If q=Null Then Exit If temp >= q\dist Then Exit p=q Forever q=h Insert q Before p Wend End Function |
||
![]() |
tedy |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich meinte mit oben und rechts eher die absolute pixel postition ![]() also auf dem Bildschirm die position |
||
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das versteh ich jetzt mal überhaupt nicht ![]() Kann mir da keiner mit ein bisschen mehr code helfen? Hab was rausgefunden und zwar dies hier: ![]() Links geht alles wie gewollt aber wenn ich das gleiche rechts mache gehts nichtmehr, mittlerweile versteh ich nurnoch bahnhof ![]() |
||
![]() |
tedy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich schätze mal deine Sotierfunktion ist falsch oder sowas ^^
Im grundegenommen musst du einfach nur die hinteren Reihen zuerst in den type schreiben und zwar in der reihenfolge |
||
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja aber wie schreib ich das denn nu richtig ich bekomms auf teufe komm raus nicht hin ![]() Genauere erklärungen wären doch hilfreicher Ich verstehe auch die sortierfunktionen alle nicht richtig soviel wie ich verstehe ist hier: Code: [AUSKLAPPEN] hb = Handle(h)
For a.haus = Each haus If Handle(a) <> hb Then If h\dist>a\dist Then Insert h.haus Before a.haus End If Next Das er das Handle aus dem type Haus nimmt und dann nochmal?! das vergleicht er dann, und wenn sie ungleich sind frägt er noch einmal ab ob die h\dist gröser ist als die a\dist, aber müsste das nicht das selbe sein wenn er aus ein on dem selben typ... moment nein. das erste handle wird ja aus dem New haus genommen und das 2. aus jedem anderen... und jetzt versteh ich wieder nichtsmehr. Edit: achja dann trägt er h.haus vor a.haus ein... So das nächste: Code: [AUSKLAPPEN] Function InsertionSort()
Hier versteh ich bahnhof und weiß nur das er überprüft ob temp das ja wiederum h\dist ist gröser ist als q\dist und klick~ schaltet sich mein gehirn aus Local h.haus, Nexthaus.haus Local p.haus, q.haus Local dist% Nexthaus=After First haus While Nexthaus<>Null h=Nexthaus Nexthaus=After h p=h : temp=h\dist Repeat q=Before p If q=Null Then Exit If temp > q\dist Then Exit p=q Forever q=h Insert q Before p Wend End Function ![]() So hab mich ma bissl rangesetzt nachgedacht und debuglogs geschrieben So sieht meine sortierfunktion jetzt aus: Code: [AUSKLAPPEN] Function createblock(x, y)
(jetzt wieder mit block, ist ja nur zu testzwecken b.block = New block b\x = x b\y = y-10 b\dist = (x^2+y^2)^.5 hb = Handle(b) For a.block = Each block debug1 = Handle(a) debug2 = Handle(b) DebugLog "Handle Alt "+debug1 DebugLog "Handle NEU "+debug2 DebugLog "Alt "+a\dist DebugLog "NEU "+b\dist DebugLog "-----------" altdist = a\dist If debug1 > debug2 Then If b\dist>a\dist Then Insert b.block Before a.block ElseIf debug1 < debug2 Then If b\dist>a\dist Then Insert b.block After a.block If b\dist<a\dist Then Insert b.block Before a.block If b\dist=a\dist Then Insert b.block Before a.block Else If b\dist<>a\dist Then Insert b.block After a.block If a\dist>b\dist Then Insert b.block Before a.block If a\dist<b\dist Then Insert b.block After a.block EndIf Next End Function ![]() Soweit sogut, es geht jetzt oben -> unten, rechts-links und unten->oben, ich kann aber links->rechts nicht machen da es auf das gleiche wie unten->oben zugreigt, also Code: [AUSKLAPPEN] If b\dist>a\dist Then Insert b.block After a.block
Und das tun die anderen richtungen auch an manch anderen stellen auf der Map, wie soll ich das richtig lösen? Hab ja jetzt den ansatz entdeckt, aber ob er richtig ist müsst ihr mir sagen ![]() |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hab ehrlich gesagt nich deinen gesamten beitrag gelesen, aber versuchs doch mal so in etwa:
wert=yposition*breite+xposition mit den positionen des tiles. und diesem wert könntest du glaube ich genau richtig ordnen. muss eventuell ein bischen angepasst werden |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
Tigerkev |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kommt aufs gleiche raus mit deiner Berechnung.
Die Blöcke kommen einfach an manchen stellen auf die gleiche If-Abfrage wie andere, so ist das Ordnen nicht richtig möglich, deswegen denke ich das meine If-Abfragen oder das ganze allgemein falsch aufgebaut ist. Hier noch einmal mein Sortierungs-code Code: [AUSKLAPPEN] Function createblock(x, y)
b.block = New block b\x = x b\y = y-10 ydist = y b\dist = x*64+ydist hb = Handle(b) For a.block = Each block debug1 = Handle(a) debug2 = Handle(b) DebugLog "Handle Alt "+debug1 DebugLog "Handle NEU "+debug2 DebugLog "Alt "+a\dist DebugLog "NEU "+b\dist DebugLog "-----------" altdist = a\dist If debug1 > debug2 Then If b\dist>a\dist Then Insert b.block Before a.block ElseIf debug1 < debug2 Then If b\dist>a\dist Then Insert b.block After a.block If b\dist<a\dist Then Insert b.block Before a.block If b\dist=a\dist Then Insert b.block Before a.block Else If b\dist<>a\dist Then Insert b.block After a.block If a\dist>b\dist Then Insert b.block Before a.block If a\dist<b\dist Then Insert b.block After a.block EndIf Next End Function Die Blöcke "Kollidieren" immer mit dieser Abfrage: Code: [AUSKLAPPEN] If b\dist>a\dist Then Insert b.block After a.block
|
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du Types und Arrays verknüpfst, könntest du sehr einfach von hinten nach vorn Zeichnen...
Ansonsten würde ich Zeile und Spalte aus den Koordinaten Berechnen und die Types dann danach sortieren. Oh und dein Else Block: Code: [AUSKLAPPEN] If b\dist<>a\dist Then Insert b.block After a.block
Größer und Kleiner sind immer auch immer ungleich... sicher das damit die gewünschte Ordnung entsteht?
If a\dist>b\dist Then Insert b.block Before a.block If a\dist<b\dist Then Insert b.block After a.block |
||
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 ![]() |
|
---|---|---|
Ich werds mal probieren auch wenn ich mit Arrays noch nicht viel gesciptet habe.
Zum Else-Block: Ich dachte immer <> wäre in etwa das gleiche wie Not, hab mich da wohl getäuscht ![]() Edit: Wenn ich die Zeile Code: [AUSKLAPPEN] If b\dist<>a\dist Then Insert b.block After a.block
rausnehme, geht das setzen von unten nach oben nichtmehr ordnungsgemäß also geht das wohl doch wie gewollt ![]() Gibts denn keine dll o.ä. was das ganze vereinfacht? ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group