Seite 1 von 2

Screen soll doch noch nicht geschlossen werden ...

Verfasst: 29.03.2008 20:27
von Tombi
Hallo liebe Community,
arbeite seit gestern-abend an einem RPG.

Hier mal die Main.pb:

Code: Alles auswählen

;Init
InitSprite()
InitKeyboard()
InitMouse()

;Includes
IncludeFile "befehle.pb"

OpenScreen(640,480,32,"RPG")

LoadSprites()

Repeat
ExamineKeyboard()

ShowLandschaft(4,4)
Delay(1)

Until KeyboardPushed(#PB_Key_Down)
Nun, das Problem liegt in der ShowLandschaft() die über die includete Datei "Befehle.pb" kommt:

Code: Alles auswählen

Procedure ShowLandschaft(zeilen.l,werte.l)

;Mir fällt gerade auf das hier ja in jedem Tick
;neu dimensioniert wird ^^
Dim map.b(zeilen,werte)

ClearScreen(0,0,0)

For x=0 To zeilen-1
  For y=0 To werte-1
    Read map(x,y)
    
    ;hier, der spuckt nach `ner Zeit `ne merkwürdige Zahl raus:
    Debug map(x,y)

    DisplaySprite(map(x,y),x*25,y*25)
  Next
Next

FlipBuffers()
Delay(1)

EndProcedure
Debug map(x,y) spuckt mir nach einigen Durchläufen eine merkwürdige Zahl raus.
Wenn ich "Data.b" angebe kommt die Zahl 97 nach einer Weile, bei Data.l (und aufwärts) kommen ziemliche hohe merkwürdige Zahlen.

Aber erst nach einigen Durchläufen?!

Verfasst: 29.03.2008 22:26
von #NULL

Code: Alles auswählen

DisplaySprite(1.. ?
soll da vielleicht die map-data hin? :wink:

die map brauchst du eigentlich auch nur einmal laden (Read). bzw ansonsten brauchst du natürlich auch ein Restore pro frame..

<edit>
und wo ist eigentlich flipbuffer() :roll:

Verfasst: 29.03.2008 23:06
von PMV
1. Hilfe zu sämtlichen PB-Befehlen durchlesen
2. Beispielprogramme in dem Examples-Ordner von PB durcharbeiten
(sind meist in der Hilfe direkt unter der Hilfe zu den Befehlen verlinkt)
3. Programm selber überarbeiten und bei Fragen dannach noch mal stellen

:D

MFG PMV

Verfasst: 30.03.2008 11:16
von Tombi
#NULL hat geschrieben:

Code: Alles auswählen

DisplaySprite(1.. ?
soll da vielleicht die map-data hin? :wink:

die map brauchst du eigentlich auch nur einmal laden (Read). bzw ansonsten brauchst du natürlich auch ein Restore pro frame..

<edit>
und wo ist eigentlich flipbuffer() :roll:
map(x,y) war schonmal drinne, hatte ich aus Testgründen raugemacht.
Kommt natürlich gleich wieder rein :allright:

Ah, FlipBuffers() fehlt :roll:
Huch, wenn ich gerade in meinen Code schaue ist FlipBuffers schon drinne :freak:
Habe auch oben mal den Code angepasst.

Habe immernoch das gleiche Problem :(

Verfasst: 30.03.2008 11:24
von Andreas_S
Da feht ja alles...

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenScreen(640,480,32,"RPG")

Repeat
ExamineKeyboard()

ClearScreen(0,0,0)
ShowLandschaft(5,4) 
FlipBuffers()
Delay(1)

Until KeyboardPushed(#PB_Key_Escape)

Verfasst: 30.03.2008 11:32
von Tombi
Andreas_S hat geschrieben:Da feht ja alles...

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenScreen(640,480,32,"RPG")

Repeat
ExamineKeyboard()

ClearScreen(0,0,0)
ShowLandschaft(5,4) 
FlipBuffers()
Delay(1)

Until KeyboardPushed(#PB_Key_Escape)
Das steht in der Befehle.pb ganz oben, stimmt, sollte ich mal in die Main reinschmeißen /:->

Habe oben den ersten Beitrag mal komplett neu geschrieben, da mir was aufgefallen ist, woran es liegen könnte?!

Verfasst: 30.03.2008 11:44
von #NULL
und was is mit dem nötigen 'Restore' von dem ich geredet hatte?
bzw wie gesagt: lade deine map lieber nur einmal mit Read vor der hauptschleife!

Verfasst: 30.03.2008 13:11
von Tombi
Jetzt ließt er mir nur noch die erste Zeile :(

Code: Alles auswählen

Procedure Reading(zeilen.l,werte.l)
Dim map.b(zeilen,werte)

Restore karte
For x=0 To zeilen-1
  For y=0 To werte-1
    Read map(x,y)
  Next
Next
EndProcedure

Procedure ShowLandschaft(zeilen.l,werte.l)

ClearScreen(0,0,0)

For x=0 To zeilen-1
  For y=0 To werte-1
    DisplaySprite(map(x,y),x*25,y*25)
  Next
Next

FlipBuffers()
Delay(1)

EndProcedure
Reading() wird vor dem Repeat aufgerufen:

Code: Alles auswählen

;Init
InitSprite()
InitKeyboard()
InitMouse()

;Includes
IncludeFile "befehle.pb"

OpenScreen(640,480,32,"RPG")

LoadSprites()
Reading(4,4)

Repeat
ExamineKeyboard()
ShowLandschaft(4,4)
Delay(1)

Until KeyboardPushed(#PB_Key_Down)
Und die DataSection:

Code: Alles auswählen

DataSection

karte:
Data.l 1,2,2,2
Data.l 2,2,2,2
Data.l 3,3,3,3
Data.l 4,4,4,4
EndDataSection

Verfasst: 30.03.2008 13:38
von #NULL

Code: Alles auswählen

For x=0 To zeilen-1
bisschen komisch, den x ist eigentlich die spalte ..hauptsache du weißt was du machst.

und map() ist global?

man kann nur raten bei den code-brocken. haste nicht was halbwegs lauffähiges?

benutzt du EnableExplicit? könnte ja auch sein dass du deine x/y zähler der schleifen irgendwo doppelst oder global/local verhaust und dann deine schleifen spinnen..


<edit>
achso:

Code: Alles auswählen

dim map.b(..)
data.l ..
read map(..)
das wird nix. verwende den gleichen typ!

..und du scheinst auch PB <4.00 zu verwenden. sowas sagt man lieber gleich dazu.

Verfasst: 30.03.2008 13:44
von Kaeru Gaman
map() ist nicht Global

Code: Alles auswählen

Procedure Reading(zeilen.l,werte.l)
Dim map.b(zeilen,werte)
es ist ja schön und gut, dass du so viel wie möglich in procedures packen willst.
aber du musst dir dabei auch im klaren sein, welchen gültigkeitsbereich deine variablen haben.

und ich hab dir in dem anderen thread schon mal gesagt, dass du das
Clearscreen und das FlipBuffers besser nicht in die Landschaft-Procedure packen solltest.
irgendwann willst du auch noch chars darstellen, dafür schreibst du wieder ne procedure, und dann klappt garnix mehr.

und das mit dem Read außerhalb der Darstellungsschleife hatte ich dir auch schon gesagt.

und wieso machst du eigentlich zum selben Grundprogramm nen zweiten thread auf?

ich muss PMV echt beipflichten:
PMV hat geschrieben:1. Hilfe zu sämtlichen PB-Befehlen durchlesen
2. Beispielprogramme in dem Examples-Ordner von PB durcharbeiten
(sind meist in der Hilfe direkt unter der Hilfe zu den Befehlen verlinkt)
3. Programm selber überarbeiten und bei Fragen dannach noch mal stellen