Gitternetz im Spiel (unterteilen)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Ok, die Zuweisung der Grafiken:

Entweder sehen deine Maps so aus, wie ich oben beschrieben habe, mit 0, 1 usw für die jeweiligen Tiles. Dann musst du eben in deiner ANzeige-Routine abfragen, welche Ziffer sich dort befindet und dann das korrekte tile setzen. Da arbeitest du am besten mit Variablen und änderst die ID des Sprites je nach Tile in der Map.

Pseudocode:

Code: Alles auswählen

if zeichen in map = 1
  spriteid = 5
elseif zeichen in map = 2
  spriteid = 8
elseif zeichen in map = 3
  spriteid = 19
endif

displaysprite(spriteid, posx, posy)...
So in etwa könnte das aussehen. Eine andere Methode ist es, wenn du ein festes Tileset hast, auf dem also sich die Grafiken befinden, und du dann die Koordinaten der Grafik für jedes TIle der Karte abspeicherst.
Also etwa so:

mapdata[x][y].grafik_x = 1;
mapdata[x][y].grafik_y = 4;

Das würde bedeuten, dass auf der Karte an der Stelle x,y das Tile verwendet wird, welches sich auf dem Tileset an der Position 1, 4 befindet. Dann rechnest du einfach diese Position * 50, dann hast du die Pixelposition.
Also ist dann auf der Karte bei x,y die Grafik mit den Pixelkoordinaten auf dem Tileset 50, 200, dieses musst du dann entsprechend aus dem Tileset clippen und anzeigen.

Für größere Projekte eignet sich imo die Methode 2 besser, wo man für jedes Tile auf der Karte die Koordinaten auf den Tileset angibt und diese dann aus dem Tileset heraus geclippt und angezeigt werden. Hat auch den Vorteil, dass man keine Nummern für die jeweiligen Grafiken vereinbaren muss sondern direkt mit den Positionen arbeiten kann. Es ist einfach logischer zu sagen, an der Karte Stelle x, y befindet sich das Sprite welches sich auf dem Tile an der Stelle 1, 4 befindet. (Welches dann das Tile 1 von links und 4 von oben wäre) In Pixelkoordinaten, wie gesagt, * 50 rechnen.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

oki :)

@ Kaeru: wie das in ladybug geregelt ist interessiert mich jetzt trotzdem;
ich habs mir mal geladen, aber ich "musste ja" formatieren, jetzt finde ich es nichtmehr, nichtmal bei der boardsuche nach "ladybug" und nicht bei der purearea suche nach "ladybug", und google gibt zu viele ergebnisse :D
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

auf der purebasic homepage kannst dus runterladen...

http://www.purebasic.com/german/download.php3
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

bitte nicht böse sein, dass ich schon wieder diesen (alten) thread hochhole... der schon beantwortet zu seien scheint....

aber ich möchte wissen ob ich auf den richtigen weg bin

Code: Alles auswählen

Procedure loadtilemap()
  Enumeration
    #Tile_Grass01
    #Tile_GrassSand01
    #Tile_GrasSsand02
    #Tile_Water01
    #Tile_SandWater02
    #Tile_Sandeckenordwest
    
    #Sprite_Baum01
  EndEnumeration
  
  LoadSprite(#Tile_GrassSand01, "GFX\Sprites\1.PNG")
  
  
  Structure spritesanzeigen
    zeicheninmap.l
    spriteID.l
    spriteposX.l
    spriteposY.l
  EndStructure
  spriteposX.l = 0
  spriteposY.l = 0
  
  If OpenFile(0, "\GFX\Map\Map.map")
    firststring.s = ReadString()
    If FindString(firststring, ".", 0)
      spriteposX + 50
      If spriteposX <= 500
        spriteposY + 50
      EndIf
    EndIf
    
  If zeicheninmap = 1
    spriteID = #Tile_GrassSand01
  EndIf 
  EndIf
    
EndProcedure
die txt ist so aufgebaut.... immer eine ID und dann ein punkt der die ID abschließt, und damit verändert sich die X posi um 50 nach rechts...

tut mir wirklich leid das ich schon wieder frage....
FALLS ich nicht auf den richtigen weg bin wäre es nett es zu erklären

und eine andere frage....
warum sagt der sobald ich die funktion aufrufe: "windows hat ein problem festgestellt und...."

schonmal danke...
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Ich würde die Enumerations und Structures außerhalb der Procedure schreiben... O_o

Wahrscheinlich stürzt er deshalb ab :|
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

und jetzt noch eine frage... aus interesse

was wenn das jetzt eine dll procedure ist?
das ist ja ein einzelner code und der kann dann nicht auf den anderen seine enumerations zugreifen...lässt sich also nicht als dll compillen...
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

soweit ich weiß darf man Strukturen und Enumerations auch außerhalb von Prozeduren schreiben (auch in DLLs) - Enumerations werden ja sowieso direkt beim kompilieren ersetzt. Bei Strukturen wirds das selbe sein.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

ok, ich probiers dann morgen warscheinlich aus, schonmal danke an alle, jetzt müsst ich nur wissen ob das wenigstens schonmal ans prinzip des map lesens kommt...
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

tja - nixda hat wohl nichts gebracht... :cry:

EDIT: hm ging also doch... irgendwas hab ich noch geändert aber egal jetzt....
danke

EDIT2: so... jetzt siehts so aus

Code: Alles auswählen

Structure spritesanzeigen
  zeicheninmap.l
  spriteID.l
  spriteposX.l
  spriteposY.l
EndStructure

Procedure loadtilemap()
  
  spriteposX.l = 0
  spriteposY.l = 0
  
  If OpenFile(0, "\GFX\Map\map.map")
    firststring.s = ReadString()
    If FindString(firststring, ".", 0)
      spriteposX + 50
      If spriteposX <= 500
        spriteposY + 50
      EndIf
    EndIf
    
  If zeicheninmap = 1
    spriteID = #Tile_GrassSand01
  EndIf 
  CloseFile(0)
EndIf

DisplaySprite(spriteID,spriteposX,spriteposY)
    
EndProcedure
ich hab das loadsprite und die komplette enumeration in den hauptcode gepackt... jetzt kommt kein windows error mehr, aber sobald ich mit debugger starte hängt sich das spiel... nur mit debugger!

was is denn daran falsch?
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ein problem ist:

Code: Alles auswählen

      spriteposX + 50
      If spriteposX <= 500
        spriteposY + 50
      EndIf
muß lauten:

Code: Alles auswählen

      spriteposX + 50
      If spriteposX >= 500
        spriteposY + 50
        spriteposX = 0
      EndIf
außerdem solltest du laden und anzeigen trennen.
lade es erst in ein array, dann zeige es mit einer anderen proc an.
denn laden brauchst du nur einmal,
anzeigen mußt du 60x pro sekunde.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten