Seite 3 von 7

Verfasst: 09.08.2007 09:40
von Fusselohr
@ Kaeru : http://www.purebasic.fr/german/viewtopic.php?t=10272 <)
Wenn ich was darüber zeichnen lasse, wird dann nicht die Tile-Position ungenau ? Also ich meine eben wenn der Tile 0|0 überzeichnet ist kann ich ihn ja nimmer verwenden, oder ?

@ Zaphod : Ich vermute mal es wäre besser wenn die Anzahl der zu zeichnenden Tiles verringert wird, da ja sonst alle Tiles nicht die gewünschte Größe von 16*16 beibehalten würden oder ? Aber wie soll mir dann die Verkleinerung der Zeichenfläche helfen die Zeichenfläsche 20 Pixel vom Bildschirm wegzubekommen ?

Verfasst: 09.08.2007 10:21
von Kaeru Gaman
doch nicht auf das tile selber drüberzeichnen, sondern über den dargestellten mapausschnitt... :lol:

Verfasst: 09.08.2007 10:31
von Fusselohr
Du meinst also, dass das alles einfach hin und her gescrollt wird oder ?

Verfasst: 09.08.2007 11:15
von Kaeru Gaman
hm... vielleicht meinst du das richtige...

wenn du den bildschirm mit tiles füllst, dann zeichnest du ja so,
dass ein bißchen über den screen hinaus gezeichnet wird,
dadurch bleibt der rand an der selben stelle.

wenn du jetzt nur einen ausschnitt zeichnest, "hüpft" der rand ja,
weil eben immer komplette tiles gezeichnet werden.

deswegen zeichnet man über den fertigen kartenausschnitt einen rahmen drüber,
dadurch wird das wieder "smooth"...

hab dir mal ne kleine demo gecoded.
ist meine alte tiledemo, nur den kartenausschnitt verkleinert, und nen rehmen drumgesetzt.

zuerst so laufen lassen, wie es ist, dann siehst du wie der rand hüpft.

dann das rahmendisplay entkommentieren, dann wird der rahmen drüber gezeichnet.

;------------------------------------
wer mittesten will, hier ist das alte posting, wo auch die tiles drin sind:
http://www.purebasic.fr/german/viewtopi ... 634#116634
(auf die grafik rechtsklicken, kopieren, in paint einfügen, die einzelnen tiles ausschneiden, kopieren nach -> 001.bmp bis 008.bmp)
;------------------------------------

Code: Alles auswählen

#Display_Left   = 108
#Display_Top    = 108
#Display_Width  = 384
#Display_Height = 384
InitSprite()
InitKeyboard()
OpenScreen(800,600,32,"Tiledemo")

For n=1 To 8
  LoadSprite( 100+n, Right("00"+Str(n),3)+".bmp")
Next

Dim Map(1023,1023)

For n=0 To 1023
  For t=0 To 1023
    Map(n,t) = Random(7)+1
  Next
Next

; *** Create Framesprites ***
CreateSprite(97, 24, 24)
CreateSprite(98,384, 24)
CreateSprite(99, 24,384)

StartDrawing(SpriteOutput(97))
  DrawingMode(#PB_2DDrawing_Outlined)
  For n=0 To 3
    Box( n+1, n+1, 23-2*n, 23-2*n,RGB(96+8*n,96+8*n,96+8*n))
    Box( n  , n  , 23-2*n, 23-2*n,RGB(160-8*n,160-8*n,160-8*n))
  Next
  DrawingMode(#PB_2DDrawing_Default)
  Box( 4, 4, 16, 16,$808080)
StopDrawing()

StartDrawing(SpriteOutput(98))
  DrawingMode(#PB_2DDrawing_Outlined)
  For n=0 To 3
    Box( n+1, n+1,383-2*n, 23-2*n,RGB(96+8*n,96+8*n,96+8*n))
    Box( n  , n  ,383-2*n, 23-2*n,RGB(160-8*n,160-8*n,160-8*n))
  Next
  DrawingMode(#PB_2DDrawing_Default)
  Box( 4, 4,376, 16,$808080)
StopDrawing()

StartDrawing(SpriteOutput(99))
  DrawingMode(#PB_2DDrawing_Outlined)
  For n=0 To 3
    Box( n+1, n+1, 23-2*n,383-2*n,RGB(96+8*n,96+8*n,96+8*n))
    Box( n  , n  , 23-2*n,383-2*n,RGB(160-8*n,160-8*n,160-8*n))
  Next
  DrawingMode(#PB_2DDrawing_Default)
  Box( 4, 4, 16,376,$808080)
StopDrawing()
; ***************************

Repeat
  ExamineKeyboard()
  ClearScreen(0)

  If KeyboardPushed(#PB_Key_Left)
    FineX-2
    If FineX < 0
      FineX = 14
      MapX-1
      If MapX < 0
        MapX = 0
        FineX = 0
      EndIf
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Right)
    FineX+2
    If FineX > 14
      FineX = 0
      MapX+1
      If MapX > 1023-50
        MapX = 1023-50
        FineX = 14
      EndIf
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Up)
    FineY-2
    If FineY < 0
      FineY = 14
      MapY-1
      If MapY < 0
        MapY = 0
        FineY = 0
      EndIf
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    FineY+2
    If FineY > 14
      FineY = 0
      MapY+1
      If MapY > 1023-38
        MapY = 1023-38
        FineY = 14
      EndIf
    EndIf
  EndIf

;***********************************
;*** Tile Engine
  For SY=0 To 24
    For SX = 0 To 24
      DisplaySprite(100+Map(MapX+SX,MapY+SY), #Display_Left + 16*SX - FineX , #Display_Top + 16*SY - FineY )
    Next
  Next
;***********************************

;***********************************
;*** Frame Display
;***
;*** erst so ansehen, dann entkommentieren.
; DisplaySprite(97, #Display_Left - 24, #Display_Top - 24 )
; DisplaySprite(97, #Display_Left + #Display_Width, #Display_Top - 24 )
; DisplaySprite(97, #Display_Left - 24, #Display_Top + #Display_Height )
; DisplaySprite(97, #Display_Left + #Display_Width, #Display_Top + #Display_Height )
; DisplaySprite(98, #Display_Left, #Display_Top - 24 )
; DisplaySprite(98, #Display_Left, #Display_Top + #Display_Height )
; DisplaySprite(99, #Display_Left - 24, #Display_Top )
; DisplaySprite(99, #Display_Left + #Display_Width, #Display_Top )
;***********************************

  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Verfasst: 09.08.2007 13:11
von Zaphod
Exakt, die Anzahl der Tiles musst du natürlich anpassen um den Bereich zu verkleinern.

Wie du sie vom Rand weg bekommst ist doch aber mehr als offensichtlich. Du scheinst noch nicht verstanden zu haben was du da tust. Denk doch mal eine weile über das Problem konzentriert nach, ich bin mir absolut sicher du wirst mindestens eine der beiden sehr offensichtlichen Lösungen dafür entdecken.

Verfasst: 16.08.2007 12:04
von Fusselohr
@ Zaphod: Natürlich! Ich muss einfach das die X und Y Position verschieben ^^.

@ Kaeru: Hab's mir mal angeguggt ^^. Soweit ich es nachvollziehen kann wird durch einen Tastendruck die Map Position der einzelnen Tiles um 1 verändert. Da aber immer Ganze Tiles gezeichnet werden verschiebt sich die Tile Engine immer wieder. Durch die Rahmen, die man einfach drüberzeichnet wird dieser unschöne Effekt überdeckt, richtig ?

Verfasst: 16.08.2007 12:33
von Kaeru Gaman
rischtisch! :mrgreen:

Verfasst: 17.08.2007 11:18
von Fusselohr
<)
Ähm wenn ich jetzt mit der Maus über einen Tile bsw. 5|9 fahre und diesen verändern möchte muss ich eig. nur:

Code: Alles auswählen

Map(5,8) = 8
schreiben. ABER woher weis ich das die Maus genau auf diesem Tile ist ?

Verfasst: 17.08.2007 11:44
von Kaeru Gaman
koordinatenberechnung.

schau dir in dem thread, den du selber verlinkt hast,
mein zweites beispiel ein posting später an.
http://www.purebasic.fr/german/viewtopi ... 689#116689

Verfasst: 17.08.2007 11:45
von Fluid Byte
Kommt auf die Größe des Tiles an. Ansonsten ist die Berechnung simpel:

Mouse Koordinate / TileGröße * TileGröße