Seite 1 von 2

Landschaft erstellen , mit Scrollen

Verfasst: 30.09.2007 09:19
von lassma-asma
Hi LEute ,

Ich ab ma wieder ein Problem ...


eill so ne Art kleines Strategiespiel erstellen ... frage mich jetzt aber wie man eine "LAndschaft "´erstellt... also aus der vogelperspektive ... eine wiese , sand ...

ich will also ne Map erstellen auf der man auch scrollen kann ... (bsp Wie in Real FArm)

Hab ma gehört man muss irgendwas mit nem Array machen und dann was mit Data ...Habs aber nich gerafft ... Könnte mir vielleicht einer helfen ...

Verfasst: 30.09.2007 09:43
von #NULL
such' ma nach 'map' oder 'tilemap'
wurde schon oft erklärt.
z.b. hier http://www.purebasic.fr/german/viewtopi ... ht=#116634

<edit>
oder hier
http://www.purebasic.fr/german/viewtopi ... ht=#106177

Verfasst: 30.09.2007 09:48
von Bisonte
ähm was du wohl meinst wäre eine "Tile-Engine" und da würde ich dich gerne auf die Suchfunktion des Forums verweisen (jetzt du den Begriff kennst ;) ) oder http://www.purebasic.fr/german/viewtopi ... c&start=10

Dort ist es wirklich witzig (aber sehr Lehrreich auch für oder sogar besonders für "Anfänger") von Zaphod beschrieben worden (die Funktionsweise)

Der komplette Thread umfasst im Moment 7 Seiten, aber komplett gelesen hab ich z.B. ne Menge über Tile Engine's gelernt .... echt hier nochmal dank an all dieda gepostet haben :D

Edit: boah zu langsam ich sein ;)

Verfasst: 30.09.2007 10:12
von lassma-asma
So .. wollte mir jetzt ma das beispiel da angucken ...

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
OpenScreen(800,600,32,"Tiledemo") 

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

Dim Map(1023,1023) 

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

Repeat 
  ExamineKeyboard() 
  ClearScreen(0,0,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 38 
    For SX = 0 To 50 
      DisplaySprite(100+Map(MapX+SX,MapY+SY), 16*SX - FineX , 16*SY - FineY ) 
    Next 
  Next 
;*********************************** 

  FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape)
aber beim displaysprite sagt er das spriteobject wär nich initialisiert ...

was tuen ?

Verfasst: 30.09.2007 10:40
von #NULL
da ist ein bild im post, das brauchst du natürlich (im selben ordner wie der code).
entweder zu zerplückst es dann in einzelbilder, die du so nennst, wie sie geladen werden (dazu schaust du dir mal bitte die lade-routine im code an).
..oder du ersetzt die lade-routine

Code: Alles auswählen

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

Code: Alles auswählen

UsePNGImageDecoder()
LoadImage(0,"tileset01yi0.png")
For n=1 To 8
  CreateSprite(100+n, 16,16)
  StartDrawing(SpriteOutput(100+n))
    DrawImage(ImageID(0), -(n-1)*18-2, -2)
    ;Circle(7,7,5,$00ff00)
  StopDrawing()
Next
dann kannst du das bild als ganzes lassen, aber mußt es trotzdem runterladen und im ordner speichern, in dem der code ist.

..bei dem anderen link/code brauchst du übrigens keine extra bilder.

<edit>
steht aber auch mit dabei, dass man die bildchen braucht.
lesen mußt du schon!

Verfasst: 30.09.2007 11:54
von lassma-asma
ja schon klar ... habs auch gelesen ... habs auch alles so gemacht ... ausgeschnitten , benannt ... schon klar ... aber es geht trotzdem nittt...

was soll das mit dem 100 + überhaupt ...???

Verfasst: 30.09.2007 11:58
von Kaeru Gaman
kann ja nich sein.

wenn du das so ausgeschnibbelt und abgespeichert hast, wie es da steht, dann funzt es auch.

denk dran, dass du auch den code abspeichern musst, damit es eine aktuelle direktory gibt.
Bisonte hat geschrieben:Der komplette Thread umfasst im Moment 7 Seiten, aber komplett gelesen hab ich z.B. ne Menge über Tile Engine's gelernt .... echt hier nochmal dank an all dieda gepostet haben :D
hört man gern. danke fürs feedback. :D

Verfasst: 30.09.2007 14:07
von lassma-asma
ahhh ... sry war mein fehler ... sry echt ... falsch ausgeschnitten ...
so jetzt hab ichs schon fast ganz verstanden ...

frag mich jetzt noch was dieses 100+Map(***) soll und was das

Code: Alles auswählen

16*SX - FineX
soll..
achso und oben das

Code: Alles auswählen

Right("00"+Str(n),3)
da weiss ich nich was das sein soll...

wenn mir das nochma einer näherbringen könnte wäre ich echt froh ...
sry für die umstände nochmal !

Verfasst: 30.09.2007 14:34
von #NULL

Code: Alles auswählen

For n=1 To 8
  LoadSprite( 100+n [....]
die sprites werden unter den nummern 101 bis 108 geladen, und unter den
nummern müssen sie auch angezeigt werden. beim laden ist die 1 bis 8
in der variable n und beim anzeigen in dem jeweiligen array-element.
das mit der 100+ hat KG nur gemacht, damit der code flexlibler wird, wenn
du mal noch andere sprites laden willst und sich die konstanten ändern/verschieben.

das Right(..) erzeugt einfach die dateinnamen, deren dateien geladen werden sollen. guckt die einfach an was es macht:

Code: Alles auswählen

For n=1 To 8
  Debug Right("00"+Str(n),3)+".jpg"
Next 
das "16*SX - FineX"..
SX zählt in der schleife hoch, so dass ein tile des arrays bei
x-index = 0, bei x-pixel 0 dargestellt wird.
x-index = 1, bei x-pixel 16 dargestellt wird.
x-index = 2, bei x-pixel 32 dargestellt wird.
x-index = 3, bei x-pixel 48 dargestellt wird.
..immer plus 16 (wenn deine tiles 16 pixel breit sind)
und das - FineX verschiebt die map dann um einzelne pixel (scrolling)

Verfasst: 30.09.2007 18:23
von lassma-asma
ok sowit schin ma danke ...

aber bei mir wird immer ne fehlermeldung angezeit , dass das sprite "100+Map(rechnung" nich initialisiert wär ... was soll das Map (MapX+SX und so eigentlich ?