Iso problem

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Tigerkev

Betreff: Iso problem

BeitragMo, Dez 08, 2008 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
user posted image


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:
user posted image

Und hier mein etwas noobiger code Very Happy

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 Shocked


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! Very Happy

TimBo

BeitragMo, Dez 08, 2008 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 08, 2008 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
könntest du mir das evtl näher z.b. mit codeschnipsel- erklären, wir sind hier ja schlieslich in der beginners-corner Very Happy

DAK

BeitragMo, Dez 08, 2008 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragMo, Dez 08, 2008 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 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

BeitragMo, Dez 08, 2008 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 08, 2008 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 08, 2008 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry für die blöde frage aber, wie mach is das? Very Happy

Goodjee

BeitragMo, Dez 08, 2008 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 08, 2008 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
oh gott, das wird ja immer kpmlizierter, ich werd mal rumprobieren und mich dann melden Mad

Nicdel

BeitragMo, Dez 08, 2008 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ums einfacher zu machen:

insert
first
before
last
after
 

Tigerkev

BeitragMo, Dez 08, 2008 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit insertionsort siehts so aus:
Von oben nach unten gehts und von unten nach oben auch hier screen:
user posted image


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:

user posted image

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

BeitragMo, Dez 08, 2008 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
ich meinte mit oben und rechts eher die absolute pixel postition Very Happy
also auf dem Bildschirm die position
 

Tigerkev

BeitragMo, Dez 08, 2008 22:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Das versteh ich jetzt mal überhaupt nicht Very Happy


Kann mir da keiner mit ein bisschen mehr code helfen?


Hab was rausgefunden und zwar dies hier:
user posted image

Links geht alles wie gewollt aber wenn ich das gleiche rechts mache gehts nichtmehr, mittlerweile versteh ich nurnoch bahnhof Very Happy

tedy

BeitragMo, Dez 08, 2008 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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


user posted image
 

Tigerkev

BeitragMo, Dez 08, 2008 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja aber wie schreib ich das denn nu richtig ich bekomms auf teufe komm raus nicht hin Mad

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()
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
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 Very Happy




So hab mich ma bissl rangesetzt nachgedacht und debuglogs geschrieben

So sieht meine sortierfunktion jetzt aus:
Code: [AUSKLAPPEN]
Function createblock(x, y)
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
(jetzt wieder mit block, ist ja nur zu testzwecken Wink )

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 Very Happy

Goodjee

BeitragDi, Dez 09, 2008 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 09, 2008 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragDi, Dez 09, 2008 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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
If a\dist>b\dist Then Insert b.block Before a.block
If a\dist<b\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?
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)
 

Tigerkev

BeitragDi, Dez 09, 2008 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Rolling Eyes

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 Very Happy


Gibts denn keine dll o.ä. was das ganze vereinfacht? Rolling Eyes

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group