Karte verschiebt sich - scroll-Wert mitberechnen [Gelöst]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Sereyanne

Betreff: Karte verschiebt sich - scroll-Wert mitberechnen [Gelöst]

BeitragMi, Mai 21, 2008 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo allerseits,
ich habe ein kleines Problem. Ist nichts großes, ärgert mich aber.
Code: [AUSKLAPPEN]
If richtung=LINKS Then
   Cls
   For y = 0 To 14
      For x = 0 To 19
         DrawImage Tileset,x*32,y*32,map(x,y)
         map(px-1,py)=191
      Next
   Next
   DrawImage Magier,x,y,richtung+frame
EndIf

Den Codeschnipsel muss ich erklären:
richtung=Links - ist ein Frame der Spielfigur. Wenn die Spielfigur nach links guckt, ist die Bedingung erfüllt.
Danach werden Karte und Spieler neu gezeichnet und ein Tile aus der Karte wird ersetzt - die angesprochene Person soll sich zum Spieler umdrehen, wofür ich ein neues Frame des Tilesets benutze. Das Tile mit der Person wird durch das Tile Nr 191 ersetzt (Person guckt nach rechts, zum Spieler, der ja nach links guckt).

Also: Der Code funktioniert einwandfrei, aber nur auf Karten, deren Größe den Bildschirm nicht übersteigen. Sobald die Karte zu groß ist und die Scrollfunktion mit eingesetzt wird, klappt es nur noch bedingt. Ich sehe halt nicht den aktuellen Ausschnitt, sondern die obere linke Ecke, die zuerst neu gezeichnet wird.

Bewegungscode der Spielfigur: (Auszug)
Code: [AUSKLAPPEN]
DrawImage Magier,x-scrollx,y-scrolly,richtung+frame

Wo bring ich die Scrollvariable jetzt mit unter, dass der aktuelle Kartenausschnitt angezeigt wird?
Ich hoffe ihr versteht mein Problem und könnt mir helfen....
  • Zuletzt bearbeitet von Sereyanne am Mo, Mai 26, 2008 9:32, insgesamt einmal bearbeitet

BigMaexle

BeitragMi, Mai 21, 2008 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
For Y = 0 to 14

NAtürlich werden dann nur die anfangs-Ecke gezeichnet.
Hier müsstest du die Scroll-Variable reinbauen

Also so ungefähr

For Y = YScroll To YScroll + 14

Nur so als DEnkansatz.
Ich hab deine Idee nicht zu 100% verstanden, aber die SAche mit der oberen Ecke deutet darauf hin
--------------------------------------
Ich bin unfreiwillig ein Mitglied dieser kapitalistischen Gesellschaft, wo jeder Geldgeile Unternehmer an mein Geld will und ich selbst bei meinen Entscheidungen so gut wie willenlos bin...... und ich bin glücklich drüber

Sereyanne

BeitragMi, Mai 21, 2008 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
dann krieg ich "array index out of bounds"
muss wohl noch ein bisschen tüfteln.

danke für den ansatz!

BigMaexle

BeitragMi, Mai 21, 2008 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann ist deine Map kleiner als SCroll + 14
Da musst du dann ne Sperre oder so einbauen, entweder in er Schleife oder bei der Scroll Variable
--------------------------------------
Ich bin unfreiwillig ein Mitglied dieser kapitalistischen Gesellschaft, wo jeder Geldgeile Unternehmer an mein Geld will und ich selbst bei meinen Entscheidungen so gut wie willenlos bin...... und ich bin glücklich drüber

Sereyanne

BeitragMi, Mai 21, 2008 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
meine map ist kleiner also scroll+14? wie soll denn das gehen?
Dim map (50,50)
ist zu klein oder was?
ich glaub ich mir nur zu blöd diese scrollvariable richtig anzuwenden.... Embarassed

BladeRunner

Moderator

BeitragMi, Mai 21, 2008 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich tippe mal drauf dass du den Player Pixelweise bewegst, dann ist das was Du da als scroll hast natürlich wesentlich grösser als die Dimension deines Arrays.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Sereyanne

BeitragMi, Mai 21, 2008 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ich meinte eigentlich meine figur würde tileweise laufen.
den bewegungscode hab ich doch von dir, BladeRunner (zumindest zum großen teil, der andere teil war aus nem tut)
Code: [AUSKLAPPEN]
If map(px,py-1) = 8 Then
   py = py - 1 ;die figur wird um ein tile bewegt
   ;die variable scrollx/y wird verändert und beim nächsten mal
   ;wenn die hauptschleife durchlaufen wird. malt man die karte halt
   ;an der position x/y-scrollx/y gemalt
   ;achja und - 32 weil die figur sich auch nur um 32 pixel
   ;bewegt.
   scrolly = scrolly - 32
   move = 1 ;überträgt die spielerkoordinaten auf die x und y variablen der map und malt unsere figur
   moving=True
    richtung = HOCH
    EndIf
;ANIMATIONSLOGIK
If timer <MilliSecs() ;alle 100 ms wird weiteranimiert
timer = MilliSecs() +100 ;timer resetten
frame = frame +1 ;frame weiterzählen
frame = frame Mod 3 ;der modulo sorgt dafür das frame zwischen 0 und 3 bleibt
EndIf

If moving = False
frame = 0 ;und wenn nix gedrückt wird wird auch nichts animiert.
EndIf
   
;BEWEGUNG
If movetimer < MilliSecs() Then
   movetimer = MilliSecs() +25 ;Bewegung findet nur maximal alle 25 ms statt, sprich: maximal 40 Pixel/Sekunde
   If moving = True Then ;und nur wenn auch noch bewegt werden soll
      Select richtung
         Case HOCH
            If y >0 Then y = y-1
         Case RUNTER
            If y < GraphicsHeight()-32 Then y = y +1
         Case LINKS
            If x >0 Then x = x-1
         Case RECHTS
            If x < GraphicsWidth()-32 Then x = x +1
      End Select
   EndIf
EndIf

ShadowJumper

BeitragFr, Mai 23, 2008 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
mein erster Gedanke (und anscheinend auch Bladrunners) ist, dass du den Wert der Variable scrollx/scrolly (so heißen auch meine Variablen, die die selbe Funktion haben... xD) nicht um 1 änderst, wenn du dich bewegst, sondern um die Größe eines Tiles (oder die Anzahl der Schritte, die dein Held in einem solchen machen kann)

so müsstest du es ändern:

Code: [AUSKLAPPEN]

For y = 0 To 15
    For x = 0 To 20
        If x-scrollx/32 >= 0 And x-scrollx/32 < mapwidth And y-scrolly/32 >= 0 And y-scrolly/32 < mapheight Then
            DrawImage Tileset, x * 32 - (scrollx Mod 32), y * 32 - (scrolly Mod 32), map(x - scrollx/32, y - scrolly/32)
        Endif
        map(px-1,py)=191
    Next
Next



Erklärung:

fangen wir mal hinten an^^
Code: [AUSKLAPPEN]

map(x - scrollx/32,y - scrolly/32)

durch das scrollx/32 und scrolly/32 wird die Angabe "umgerechnet" (gespeichert sind die Pixel und errechnet werden die Tiles)
dadurch werden schonmal immer die richtigen Tiles dargestellt, wenn man sich um genau 1 Tile fortbewegt hat
dies ist erforderlich, damit später nicht Tiles fehlen

Code: [AUSKLAPPEN]

x * 32 - scrollx, y * 32 - scrolly

alleine würde, wenn man in der oberen Linken Ecke steht, immernoch das richtige darstellen, aber sobald man sich um 1 Tile weiterbewegt hat, stimmt die Darstellung nicht mehr (du kannst ja ausprobieren, wie es so läuft, aber der Fehler ist recht eindeutig zu sehen^^)

der Grund ist das map(x - scrollx/32,y - scrolly/32)
wenn man das weglässt, dann geht es wieder, aber die Tiles unten links werden, je weiter man dorthin läuft, nicht gezeichnet (um Performance bei großen Maps zu sparen)

durch scrollx Mod 32 wird "für jeden komplett zurückgelegten Tile" von scrollx 32 abgezogen und die Darstellung stimmt (es sind also deshalb keine weiteren If's mehr nötig)
dies sollte man möglichst immer in Klammern setzen, um Fehler zu vermeiden (deshalb hab ich dies gleich getan)

um Fehler zu Vermeiden wurde aber noch einmal ein If eingefügt, falls man an anderer Stelle einen Fehler gemacht hat, z.B. wenn scrollx/scrolly negative Werte bekommen können oder scrollx/32 bzw. scrolly/32 größer sind als die Höhe/Breite der Map
jedoch kann es auch sein, dass dies beabsichtigt ist, dann wird außerhalb der Map immer ein schwarzer Bereich erscheinen (je nachdem welche Farbe Cls nutzt und wenn kein Hintergrundbild gezeicnet wird)
mapwidth und mapheight stellen in dem Fall die Breite und Höhe der Map dar

dies funktioniert, wenn in scrollx/scrolly (hauptsächlich) positive Werte gespeichert werden (ansonsten aus - + machen)
(es müsste zwar funktionieren, aber ich hab es nicht getestet...)
Bilder kostenlos hosten
lest und weint:
RAM - 512 MB; GrafikRAM - 32 MB; CPU - 800 MHz
Ps: ... und weint (vor lachen)

Sereyanne

BeitragFr, Mai 23, 2008 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
herzlichen dank für die tollen antworten!

@ShadowJumper: leider ist dein beitrag ziemlich kompliziert für mich und daher funzt es auch noch nicht.
hab ihn jetzt schon 10x gelesen... komme trotzdem nicht weiter Crying or Very sad

du hast recht, dass sich die scrollvariablen nicht um 1 ändern. wusste nicht, dass ihr das voraussetzt (sorry). bei mir ändern sie sich um +32 und -32, je nachdem wohin man läuft. das heißt auch, dass sie mal positiv und mal negativ sind, in bezug auf:
Zitat:
dies funktioniert, wenn in scrollx/scrolly (hauptsächlich) positive Werte gespeichert werden (ansonsten aus - + machen)

Zitat:
wenn scrollx/scrolly negative Werte bekommen können oder scrollx/32 bzw. scrolly/32 größer sind als die Höhe/Breite der Map
jedoch kann es auch sein, dass dies beabsichtigt ist, dann wird außerhalb der Map immer ein schwarzer Bereich erscheinen

ja genau. am rand meiner karte wird immer der schwarze (bei mir grüne) hintergrund gezeichnet. inwiefern ändere ich den (entschuldigung) komplizierten code jetzt ab?

sorry für so dumme fragen... Embarassed Embarassed
ich komm nur einfach nicht weiter.

und danke für eure mühe! Very Happy

PS: achja mein problem^^
also ich kriege mit deinem code nur einen leeren (grünen wegen clscolor) bildschirm.


EDIT
Danke @ all, besonders ShadowJumper, der mich sogar per PN noch angeschrieben hat
Ich habe den Fehler jetzt gefunden^^
Für die, die es interessiert:
Mein Anfangscode steht oben, hier der richtige:
Code: [AUSKLAPPEN]
If richtung=LINKS Then
   Cls
   For y = 0 To 49
         For x = 0 To 49
           DrawImage tileset,[b]x*32-scrollx,y*32-scrolly[/b],map(x,y)
            map(px-1,py)=191
      Next
   Next
   x = px * 32: y = py * 32:DrawImage Magier,[b]x-scrollx,y-scrolly[/b],richtung+frame
EndIf

Nicht nur dass ich das Dim falsch beziffert habe... nicht 14/19 sondern natürlich 49/49 auf der Hauptkarte....
Ich habe einfach vergessen den scrollwert mit abzuziehen. Embarassed
Habe lang getüftelt... habs einfach nicht gepeilt. Danke für eure Hilfe!

hm... warum kann ich im Code nicht fett schreiben? wollte den fehler markieren... naja.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group