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

![]() |
SereyanneBetreff: Karte verschiebt sich - scroll-Wert mitberechnen [Gelöst] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
dann krieg ich "array index out of bounds"
muss wohl noch ein bisschen tüfteln. danke für den ansatz! |
||
![]() |
BigMaexle |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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.... ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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... ![]() ![]() ich komm nur einfach nicht weiter. und danke für eure mühe! ![]() 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. ![]() 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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group