Gitternetz im Spiel (unterteilen)

Anfängerfragen zum Programmieren mit PureBasic.
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 »

ich hab jetzt einfach alles im Code raus, was mit der Spielfigur oder so zu tun hat, die brauch ich jetzt eh nicht, und vielleicht ist es dann für dich übersichtlicher

Code: Alles auswählen

IncludeFile "engine.pb"
If InitSprite() = 0 : MessageRequester("","Sprites could not be initialised. DirectX 7 or higher is needed!") : EndIf
If InitKeyboard() = 0 : MessageRequester("","Keyboard could not be initialised. DirectX 7 or higher is needed!") : EndIf
If InitMouse() = 0 : MessageRequester("","Mouse could not be initialised. DirectX 7 or higher is needed!") : EndIf  
  
UseJPEGImageDecoder() : UsePNGImageDecoder() : UsePNGImageEncoder()




kameraX.l = PlayerSpeed
kameraY.l = PlayerSpeed




Procedure.l FPS()  
    Shared Zeit, Frames, Ausgabe  
    If ElapsedMilliseconds() < Zeit + 1000  
        Frames + 1  
    Else  
        Ausgabe = Frames  
        Frames  = 0  
        Zeit    = ElapsedMilliseconds()  
    EndIf  
    If Ausgabe > 0  
        ProcedureReturn Ausgabe  
    Else  
      ProcedureReturn 60  
    EndIf
    
EndProcedure  


Enumeration
  ;window
  #window_1
  #window_2
  ; Sprites
  #Sprite_Interface
  #Sprite_cursor
  ; warrior01
  
EndEnumeration 







; SystemVariablen
msPerFrame.l = 80
ActTimer = ElapsedMilliseconds() + msPerFrame
Posi.l = 1 ; Variable, es wird abgefragt ob sich der Spieler
           ; im Interface, oder im eigentlichen game ist.
           ; 1 = Interface 2 = Game



windowed.l
OpenConsole()
PrintN("Windowed(w) or fullscreen(f)?")
antwort.s = Input() : If antwort = "w" : windowed = #True : EndIf : If antwort = "f" : windowed = #False : EndIf
CloseConsole()


If windowed = #True
  OpenWindow(#window_1,0,0,640,480,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_BorderLess | #PB_Window_ScreenCentered, "Mage of Fear")
  OpenWindowedScreen(WindowID(),0,0,640,480,0,0,0)
  UseWindow(#window_1)
EndIf

If windowed = #False
  OpenScreen(640,480,16,"Mages And Warriors")
EndIf
  

  CatchSprite(#Sprite_Interface, ?Introface)
  CatchSprite(#Sprite_cursor, ?cursor)

  TransparentSpriteColor(#Sprite_cursor,255,0,255)

  
  For n=4 To 18
    LoadSprite(n, "GFX\Tiles\"+Str(n)+".PNG")
  Next
  LoadTileMap()



; Main
  MouseLocate(240,180)
  Repeat
  ExamineKeyboard()  


  If Posi = 1
    ExamineMouse()
    MausX = MouseX()
    MausY = MouseY()
    DisplaySprite(#Sprite_Interface,60,20)
    DisplayTransparentSprite(#Sprite_cursor,MausX,MausY)
    If KeyboardPushed(#PB_Key_S)
      Posi = 2
    EndIf
  EndIf

  
  If Posi = 2

  showmap(0,0)
  FPS()
  

  If windowed = #True : StartDrawing(WindowOutput()) : EndIf
  If windowed = #False : StartDrawing(ScreenOutput()) : EndIf

  
  
EndIf
  



Repeat: Delay(1) : Until ElapsedMilliseconds() > ActTimer
ActTimer + msPerFrame

FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)
End



DataSection
cursor: IncludeBinary "GFX\cursor.png"


;face
Introface: IncludeBinary "GFX\Interface.jpg"
EndDataSection
ich lad doch gleich nach den Öffnen mit

Code: Alles auswählen

  For n=4 To 18
    LoadSprite(n, "GFX\Tiles\"+Str(n)+".PNG")
  Next
  LoadTileMap()
die bilder 4.PNG bis 18.PNG in den Speicher oder?
das Programm liest dann die Longs aus (wo momentan eine 5, und noch eine 5 stehen) und will dann 25 weitere Longs (wo momentan die Zahl 6 drin ist)
Also müsste er doch theoretisch das Bild 6.PNG 25x anzeigen...

Sorry, dass ich so schwer von Begriff bin
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 »

vorhin hattest du noch ne 3 genommen, und das sprite war nich geladen.

also müßtest du jetzt ja ne andere fehlermeldung haben...

auch wenn dus rausgenommen hast zum zeigen:

beginnt bei Nr.4 nicht dein warrior?

...sowas meinte ich mit dem sinnlosen enum...

wie kommst du auf die idee, deine tiles ab sprite 4 zu laden?

weil du keinen plan hast, welche werte deine konstanten haben,
weil du irgendwann mal aufgeschnappt hast:
"wenn man das mit enum macht, braucht man sich nicht um die werte kümmern"


ich rate dir mal, mit richtigen werten zu arbeiten.

mach deine char-sprites ab Nr. 100
100-105: von hinten
110-115: von vorne
120-125: von links
130-135: von rechts

das hat außerdem den vorteil, daß du deine richtung direkt als variable einbinden kannst,
z.b. Dir=1 nach oben, Dir=2 nach unten, etc.

dann ist deine anzuzeigende spritenr: 90+10*Dir+AnimFrame

und dein tileset packst du mal ab spritenr. 1000

und die unterscheidung windowd oder screen würd ich mal zu anfang rauslassen, das bringt dich nur durcheinander...

soweit ich das sehe, hast du deswegen das stopdrawing vergessen...
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 »

ich tu die Spielfigur erst wieder rein wenn wenigstens das Tileset geht...

Code: Alles auswählen

IncludeFile "engine.pb"
If InitSprite() = 0 : MessageRequester("","Sprites could not be initialised. DirectX 7 or higher is needed!") : EndIf
If InitKeyboard() = 0 : MessageRequester("","Keyboard could not be initialised. DirectX 7 or higher is needed!") : EndIf
If InitMouse() = 0 : MessageRequester("","Mouse could not be initialised. DirectX 7 or higher is needed!") : EndIf  
  
UseJPEGImageDecoder() : UsePNGImageDecoder() : UsePNGImageEncoder()




kameraX.l = PlayerSpeed
kameraY.l = PlayerSpeed




Procedure.l FPS()  
    Shared Zeit, Frames, Ausgabe  
    If ElapsedMilliseconds() < Zeit + 1000  
        Frames + 1  
    Else  
        Ausgabe = Frames  
        Frames  = 0  
        Zeit    = ElapsedMilliseconds()  
    EndIf  
    If Ausgabe > 0  
        ProcedureReturn Ausgabe  
    Else  
      ProcedureReturn 60  
    EndIf
    
EndProcedure  


Enumeration
  ;window
  #window_1
  #window_2
  ; Sprites
  #Sprite_Interface
  #Sprite_cursor
  ; warrior01
  
EndEnumeration 







; SystemVariablen
msPerFrame.l = 80
ActTimer = ElapsedMilliseconds() + msPerFrame
Posi.l = 1 ; Variable, es wird abgefragt ob sich der Spieler
           ; im Interface, oder im eigentlichen game ist.
           ; 1 = Interface 2 = Game


  OpenScreen(640, 480, 16, "Mages and Warriors")

  CatchSprite(#Sprite_Interface, ?Introface)
  CatchSprite(#Sprite_cursor, ?cursor)

  TransparentSpriteColor(#Sprite_cursor,255,0,255)

  
  For n=1000 To 1014
    LoadSprite(n, "GFX\Tiles\"+Str(n)+".PNG")
  Next
  LoadTileMap()



; Main
  MouseLocate(240,180)
  Repeat
  ExamineKeyboard()  


  If Posi = 1
    ExamineMouse()
    MausX = MouseX()
    MausY = MouseY()
    DisplaySprite(#Sprite_Interface,60,20)
    DisplayTransparentSprite(#Sprite_cursor,MausX,MausY)
    If KeyboardPushed(#PB_Key_S)
      Posi = 2
    EndIf
  EndIf

  
  If Posi = 2

  ShowMap(0,0)
  FPS()
  EndIf


Repeat: Delay(1) : Until ElapsedMilliseconds() > ActTimer
ActTimer + msPerFrame

FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)
End



DataSection
cursor: IncludeBinary "GFX\cursor.png"


;face
Introface: IncludeBinary "GFX\Interface.jpg"
EndDataSection
jetzt hab ich die Grafiken umbenannt und er lädt 1000.PNG bis 1014.PNG

die erste zwei Grafiken (interface + Cursor) können ja angezeigt werden, aber sobald man dann s drückt, posi auf 2 gesetzt wird und die Tilemap angeigt werden sollte, bricht der Debugger (mit der selben Meldung) #Sprite object not intialized ab
hab natürlich die 25 Longwerte auch auf 1000 gesetzt, damit 1000.PNG 25x angezeigt wird
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 »

Kaeru Gaman hat geschrieben:wenn du deiner datei den header 15,15 gibst, dann müssen danach auch 225 werte folgen, deine proc versucht nämlich, die zu lesen...
also, probiers mal grundsätzlich mit genügend werten im file...

warum deine proc nicht abbricht, wenn du versuchst, nach dateiende zu lesen, weiß ich auch nicht,
aber falls nur die ersten 25 werte im array auf 1000 stehen, dann versucht er danach nunmal,
das sprite nummer 0 anzuzeigen, weil der rest vom array leer ist.

ach.. jetzt seh ich was... uralter thread, das...

die dimensionen im header sind nicht die breite, sondern der maximale index...

also, wenn deine schleifen 0-15 gehen, und deine karte 16x16 angezeigt wird,
dann brauchst du mindestens 256 werte in dem File...

aber mal ernsthaft: kannst du da nicht selbst drauf kommen?
ich mein, das is doch simpelste mathematik.

was programmiert du denn sonst so, wenns schon daran scheitert?
ein bisschen mitdenken muss schon sein, ansonsten kannste ja sogar Häkeln als Hobby vergessen....
(und ich hab dir schon 2x gesagt, das meine Laune auf 'Arsch' steht,
also leb damit, daß ich das so deutlich sag.)

und wenn du auch scrollen austesten willst, mach die Map mal noch größer:

Code: Alles auswählen

  If OpenFile(0, "GFX\Map.map") 
    WriteLong(255) 
    WriteLong(255) 
    For a=0 To 65535
      WriteLong(1000+Random(17)) 
    Next 
  EndIf 
  CloseFile(0) 
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 »

Kaeru Gaman hat geschrieben:
Kaeru Gaman hat geschrieben:wenn du deiner datei den header 15,15 gibst, dann müssen danach auch 225 werte folgen, deine proc versucht nämlich, die zu lesen...
also, probiers mal grundsätzlich mit genügend werten im file...

warum deine proc nicht abbricht, wenn du versuchst, nach dateiende zu lesen, weiß ich auch nicht,
aber falls nur die ersten 25 werte im array auf 1000 stehen, dann versucht er danach nunmal,
das sprite nummer 0 anzuzeigen, weil der rest vom array leer ist.

ach.. jetzt seh ich was... uralter thread, das...

die dimensionen im header sind nicht die breite, sondern der maximale index...

also, wenn deine schleifen 0-15 gehen, und deine karte 16x16 angezeigt wird,
dann brauchst du mindestens 256 werte in dem File...

aber mal ernsthaft: kannst du da nicht selbst drauf kommen?
ich mein, das is doch simpelste mathematik.

was programmiert du denn sonst so, wenns schon daran scheitert?
ein bisschen mitdenken muss schon sein, ansonsten kannste ja sogar Häkeln als Hobby vergessen....
(und ich hab dir schon 2x gesagt, das meine Laune auf 'Arsch' steht,
also leb damit, daß ich das so deutlich sag.)

und wenn du auch scrollen austesten willst, mach die Map mal noch größer:

Code: Alles auswählen

  If OpenFile(0, "GFX\Map.map") 
    WriteLong(255) 
    WriteLong(255) 
    For a=0 To 65535
      WriteLong(1000+Random(17)) 
    Next 
  EndIf 
  CloseFile(0) 
genau das frage ich mich auch, WIE soll ich auf das ganze kommen?
Mathematik ist genau das, wovon ich am wenigsten Ahnung hab, mit viel Glück bekomm ich grad mal ne 4 zusammen bei Mathe (7. Klasse Gymnasium)

Naja, leider kann ich die map so groß machen wie ich will, kann auch noch ne 0 an das 65535 hängen...
bricht trotzdem ab mit #Sprite object not initialized....

Von mir aus kannst du mir offen und ehrlich sagen, ich solls lassen weil ich zu blöd dafür bin... ich versuchs ja aber irgendwie wirds nichts....

ich weiß echt nicht was noch falsch sein soll, die Tiles sind vorhanden und haben die richtigen Namen... geladen werden sie auch, aber immer beim Anzeigen zickt das Programm rum :(
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 »

ok.. ich seh grad, in meinem mini-prog zum erzeugen der map muss es Random(14) heißen,
wenn du insgesamt 15 versch tiles benutzt...

wie auch immer... wenn du oft genug ne 1000 drin hast, dann sollte es funktionieren...

schau halt mal ganz genau hin, was du wohin lädst...

noch was: das ReDim war nur dafür, das es flexibler ist.
wenn du mit ner festen Mapgröße arbeitest, kannst du dir das auch sparen.

mein vorschlag:
fang mal ganz von vorne an, mach mal "weißes Blatt" und schreib jede zeile nochmal neu.

lass erstmal allen schnickschnack weg.
damit meine ich die FPS anzeige, die full/win auswahl...
einfach alles weglassen, was nicht unmittelbar mit der anzeige der Map zu tun hat.

und wenn das funktioniert, dann kannst du immer mehr einbaun...
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 »

hab jetzt alles neu:

Code: Alles auswählen

InitSprite()
InitKeyboard()
IncludeFile "engine.pb"
UsePNGImageDecoder()

OpenScreen(640, 480, 16, "")
For n=1000 To 1014
  LoadSprite(n, "GFX\Tiles\"+Str(n)+".PNG")
Next

LoadTileMap()




Repeat
ExamineKeyboard()


FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
achja sorry, sind 14 versch. aber hab bei deinen Mini-prog das random dann eben auf 13 gesetzt...

bis dahin gehts noch, aber bei ShowMap(0,0) (mal wieder) Probleme
ich weiß auch, was sie genau tut...

Code: Alles auswählen

Procedure ShowMap ( x.l, y.l)
    For t=0 To 15
      For n=0 To 15
          DisplaySprite(Map(x+n,y+t), 32*n, 32*t)
        Next
    Next
  EndProcedure
wenn ich also 0, 0 als Parameter angebe ist es beim ersten Durchlauf:
t = 0 ; n = 0
0 + 0 ; 0 + 0
32*n ; 32*t
also auch Position 0,0

beim zweiten Durchlauf also 1 + 0 und nochmal 1 + 0
ist Map(1, 1)
und bei den x und y Angaben jeweils 32 Pixel weiter rechts / darunter

ist alles klar, aber mit loadtilemap() alleine geht's doch auch, also kann er die tilemap laden... nur warum anzeigen nicht?

... das mit deiner Laune ist übrigens ok... ist schon nett von dir mir hier immernoch zu helfen, gäbe bestimmt ein paar Leute die schon langsam die Lust verloren hätten...
irgend was muss doch nicht stimmen...

also, danke im Vorraus
Rubiko
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 »

ja, mit alles neu mein ich auch das include...

schmeiß das auch mal weg, und schreib die procs, die du wirklich brauchst,
in dein Hauptprogramm, schmeiß das redim raus und arbeite mit ner festen größe.. etc.

nimm auch mal das loadmap raus, und spar dir die datei...

mach einfach mal die schleife, mit der du die map erzeugst an den anfang des hauptprogramms..

Code: Alles auswählen

Dim Map(255,255)
For t=0 to 255
   For n=0 to 255
      Map(n,t) = 1000+ Random(13)
   Next
Next
und dann teste noch mal und dann zeigs hier..

...ich könnte mir vorstellen, daß die Map garnit geladen wird...

du hast zwar ein If in der proc, aber du sicherst nicht ab mit
If LoadTileMap() = 0 MessageRequester(Bla...
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 »

Code: Alles auswählen

InitSprite()
InitKeyboard()

UsePNGImageDecoder()

Dim Map(255,255)
For t=0 To 255
  For n=0 To 255
    Map(n,t) = 1000+Random(13)
  Next
Next

OpenScreen(640, 480, 16, "")
For n=1000 To 1014
  LoadSprite(n, "GFX\Tiles\"+Str(n)+".PNG")
Next


For n=1000 To 1013
DisplaySprite(n, x*32, y*32)
Next




Repeat
ExamineKeyboard()


FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
jetzt geht's aber langsam :)
jetzt zeigt er aber nur ein Tile an in der oberen linken Ecke, anscheinend das letzte in meinem Ordner.... außerdem flackert es
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 »

Lisbeth mei Drobbe! >__<""

du solltest vielleicht deine anzeigeschleife
1. wieder als gestaffelte x/y schleifen machen
2. sie in die hauptschleife setzen...

außerdem kannst du da ruhig ne proc draus machen...

und schreib die Tiles in ein Array... wie gehabt...

mann-o-mann... wollen wir nich lieber nen Kaiserschnitt machen?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten