Tile Engine- Bitte Helft mir =)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Fusselohr
Beiträge: 236
Registriert: 02.04.2007 10:43
Kontaktdaten:

Beitrag 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 ?
Mein Projekt besteht immernoch und wächst stündlich.

Du willst die Entwicklung mitverfolgen ?
Dann besuche jetzt den Entwicklungsblog unter
http://rpg-fire-games.blogspot.com/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

doch nicht auf das tile selber drüberzeichnen, sondern über den dargestellten mapausschnitt... :lol:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Fusselohr
Beiträge: 236
Registriert: 02.04.2007 10:43
Kontaktdaten:

Beitrag von Fusselohr »

Du meinst also, dass das alles einfach hin und her gescrollt wird oder ?
Mein Projekt besteht immernoch und wächst stündlich.

Du willst die Entwicklung mitverfolgen ?
Dann besuche jetzt den Entwicklungsblog unter
http://rpg-fire-games.blogspot.com/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
Fusselohr
Beiträge: 236
Registriert: 02.04.2007 10:43
Kontaktdaten:

Beitrag 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 ?
Mein Projekt besteht immernoch und wächst stündlich.

Du willst die Entwicklung mitverfolgen ?
Dann besuche jetzt den Entwicklungsblog unter
http://rpg-fire-games.blogspot.com/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

rischtisch! :mrgreen:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Fusselohr
Beiträge: 236
Registriert: 02.04.2007 10:43
Kontaktdaten:

Beitrag 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 ?
Mein Projekt besteht immernoch und wächst stündlich.

Du willst die Entwicklung mitverfolgen ?
Dann besuche jetzt den Entwicklungsblog unter
http://rpg-fire-games.blogspot.com/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Kommt auf die Größe des Tiles an. Ansonsten ist die Berechnung simpel:

Mouse Koordinate / TileGröße * TileGröße
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten