scrollen auf tilemap mit viewport und origin
Übersicht

![]() |
brezelbakeryBetreff: scrollen auf tilemap mit viewport und origin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also.
Vorneweg: Auflösung 320x240 Meine figur besitzt eine Startposition mit Punkt P(px,py). Dabei sind px und py die Tilekoordinaten. D.h px=2 ^ py=2 --> figur befindet sich auf 2. Tile in x und y Richtung (vom Nullpunkt ausgehend). Diese Punkte werden in Pixelkoordinaten umgerechnet BlitzBasic: [AUSKLAPPEN] ppx=px*16 Damit die Figur zentriert ist, habe ich folgendes gedacht: Origin. Dieser ermöglicht bei mir, das die figur in der mitte dargestellt wird. Hier meine gleichung: BlitzBasic: [AUSKLAPPEN] Origin 0-ppx+160-scrollx,0-ppy+120-scrolly Erklärung: der koordinatenursprung wird um Pixelkoordinate der Figur ins Negative geschoben (d.h. figur befindet sich oben links in der ecke). Danach noch + 160 und 120 (Figur ist nun im Mittelpunkt des Bildschirms). Da mein Spieler durch scrollx und scrolly bewegt werden, muss das noch ins Verhältnis dazu gesetzt werden. Bei kleineren Karten (25x25 tiles) ist das kein problem. Aber bei großen Karten (100x100) fängt es derbe an zu ruckeln. Da habe ich gedacht, das mir der Befehl viewport was brächte. Dazu folgender code: BlitzBasic: [AUSKLAPPEN] Viewport (ppx-160+scrollx, ppy-120+scrolly, ppx+320+scrollx,ppy+240+scrolly) Zur Erklärung: Viewport zeichnet nur den Bereich der Karte. Viewport hat Syntax viewport x,y,breite,hoehe --> Breite und Höhe entspricht der Auflösung 320,240. Ursprung x,y errechnet sich aus Pixelspielerposition und hälfte der Auflösung. Unter mitbeachtung von scrollx und scrolly ergibt sich BlitzBasic: [AUSKLAPPEN] Viewport (ppx-160+scrollx, ppy-120+scrolly, ppx+320+scrollx,ppy+240+scrolly) Das klappt auch am Anfang, aber im späteren Verlauf, ( Tile 70x80) beginnt sich die performance erneut drastisch zu verschlechtern. Kann mir jemand helfen? Ich denke die Lösung liegt im scrollen der map, aber jegliche Gedanken in die Richtung ergeben nur Müll. mfg brezel |
||
konfuzius sagt:
"töte einen und du bist ein mörder, töte 1000 und du bist ein held." |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich kenn nun deinen ganzen code nicht, aber schreibe dir mal ne funktion, die nur die benachbarten Tiles des Spielers, also alle die ins Bild passen plus noch jeweils 1-2 unten/oben, rechts/links mehr, zur sicherheit, dürfte mit ein paar einfachen if oder select case befehlen fertig sein, benötigt zwar etwas rechenzeit, aber dadurch wird dann nur die nähere umgebung des Spielers gezeichnet und nicht alles.
viewport würde ich nur benutzen, wenn du ne klare abgrenzung 2er oder mehr bereichen auf dem Bildschirm hast, den damit zeichenst du auch alles, also für dein vorhaben weniger sinvoll. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
brezelbakery |
![]() Antworten mit Zitat ![]() |
---|---|---|
das klingt ja relativ gut.
Problematisch ist jedoch, das diese funtkion für den Bereich animationen etc. drin haben müsste. Aber gibt es ne andere möglichkeit, oder gibt es nur deine vorgeschlagene? |
||
konfuzius sagt:
"töte einen und du bist ein mörder, töte 1000 und du bist ein held." |
![]() |
DivineDominion |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sehr gut, oldskool ![]() Dein bildschirm kann 320/16=20 * 240/16=15 Tiles anzeigen. du scrollst, indem du das Scroll-Offset veränderst. Wenn du 16 Pixel scrollst nach rechts, dann wird die erste Tilezeile nicht mehr angezeigt, weil die Karte "nach links verschoben" wird: DrawImage Tile, TileX * 16 - ScrollX, TileY * 16 - ScrollY Das kommt in deine zwei For-NExt Schleifen, die alles anzeigen. Anfangen müssen die For-Next bei der Scrollposition/16, im obigen Beispiel also beim 1. Tile, nicht mehr beim 0. Aufhören muss es 20 Tiles weiter rechts und 15 Tiles weiter unten. StartX = (ScrollX / 16) StartY = (ScrollY / 16) EndX = StartX + 20 EndY = StartY + 15 Entweder du baust jetzt eine If ein, damit man nicht versucht außerhalb des Map-Endes zu malen, oder du verhinderst, dass man Weiter scrollen kann als bis dahin, also das nur bis zum Rand der Map gescrollt wird. Hab ich so gemacht, finde ich hübscher ![]() Deine For Schleifen dann jedenfalls von 'StartX To EndX' und Y laufen lassen und ab die Post. Kein Origin, kein Viewport |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
was hat den die "Animation, etc" mit der Map zu tun?
zeig doch vlt mal den ganzen code, oder lad mal das hoch, was du bisher hast. [edit] oh, zu spät |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
DivineDominion |
![]() Antworten mit Zitat ![]() |
---|---|---|
So früh morgens so viel los... Er meint wohl, dass er zum animieren die tiles außerhalb des Bildschirms dann nicht mehr prüft. Ist völlig richtig, aber Anzeigen muss man ja nicht mehr als nötig. Und animieren geht auch so, bei Wasser z.B.; hab ich früher auch nicht anders gemacht und es ist synchron ![]() Zentrieren musst du übrigens auch beim Scrollen, lese das erst jetzt. BEdingung ist, dass, wenn man z.b. links zum Maprand geht, 7 Tiles links vom Spieler frei sein müssen (Hälfte von 15). Sind es weniger als 7, scrollst du nicht weiter nach links sondern lässt den Spieler "nur so" laufen. Das ist dann der Effekt, den man in Final Fantasy für SNES sieht - oder Secret Of Mana etc. Ist eine Karte zu Ende, wird nicht mehr gescrollt und die Helden laufen auf den Rand zu. Mit diesen BEstimmungen, wieviel Tiles beim scrollen in die jeweilige Richtung von der Map übrig sein müssen, kann man auch ein kleines rechteck festlegen in der der Spieler sich bewegen kann ohne zu Scrollen (Final Fantasy 5) |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
![]() |
brezelbakery |
![]() Antworten mit Zitat ![]() |
---|---|---|
na ich versuch das mal umzusetzen. Problematisch ist nur das ich den mapeditor von TS benutze. D.h die Layer (mit den Tiles) werden mit einer Funktion gedrawt. Na, ich guck mal ob ich da durchsteige.
Thx erstmal Aber bei eins seid ihr euch ja sicher, das es mit viewport net geht oder? |
||
konfuzius sagt:
"töte einen und du bist ein mörder, töte 1000 und du bist ein held." |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der viewport bringt in der Tat nichts. Denn auch wenn ein Bild nicht gezeichnet wird oder nur teilweise muss doch für jedes geprüft werden ob es denn im zu Zeichnenden Bereich liegt.
Reduzier deine Anzeigeschleife auf die sichtbaren Tiles und du gewinnst wesentlich mehr speed ![]() |
||
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 |
![]() |
brezelbakery |
![]() Antworten mit Zitat ![]() |
---|---|---|
kk | ||
konfuzius sagt:
"töte einen und du bist ein mörder, töte 1000 und du bist ein held." |
![]() |
brezelbakery |
![]() Antworten mit Zitat ![]() |
---|---|---|
blade, kannst du mir nur mal erklären warum viewport das ruckeln am anfang der map aufhebt (bereich x=1-25 y=1-25) aber erst im unteren rechten ende (x=80-100, y=80-100) anfängt zu ruckeln? Theoretisch dürfte nach deiner Aussage da doch kein Unterschied bestehen oder? | ||
konfuzius sagt:
"töte einen und du bist ein mörder, töte 1000 und du bist ein held." |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sollte es auch nicht.
Aber ohne kompletten Code kann ich da nur wenig sagen ![]() |
||
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 |
![]() |
DivineDominion |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klingt als würde die Map von 0,0 bis zum Bildschirmende u.r. gemalt werden. Wenn du dann natürlich am Ende der Map bist, wied sie komplett gezeichnet.
TS Mapeditor sollte aber sowas von Haus aus bieten, bin mir sicher, dass er da Funktionen für hat. Kann dir aber nur ans Herz legen fürs Probieren und Lernen selber mal so nen Editor zu versuchen, man lernt recht viel dabei |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
![]() |
brezelbakery |
![]() Antworten mit Zitat ![]() |
---|---|---|
divine. hatte ich schon.
(mit data-feldern) Da es dabei aber recht undurchsichtig wird, wirst du selber wissen, dachte ich man schreibt nen mapeditor. (mit tileplatzierung). Dazu bräuchte man ne gui. Leider besitze ich kein blitz plus und visual basic allein ist ziemlich kompliziert zu portieren. Deshalb dachte ich der Universal Map editor ist gut dafür. Habe es auch geschafft das einzubinden, suche nur nach passender Lösung. Tjoar und nen Spiel/maps nur mit datafeldern zu machen ist mir doch zu müsam -.- mfg brezel |
||
konfuzius sagt:
"töte einen und du bist ein mörder, töte 1000 und du bist ein held." |
![]() |
DivineDominion |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe auch kein B+ und viele Mapeditoren gemacht. Wenn du mit types umgehen kannst, erstelle buttons damit (X, Y, Höhe, BReite) und zeichne die als Rechtecke irgendwohin.
http://www.softgames.de/develo...?cid=16410 Hab das damals mit B3D Quick'n'Dirty gemacht, funktionierte aber auch "animiert" super. Sind nur ein paar Rects in einen ImageBuffer geschrieben. Zugegeben, könnte anfangs ein bisschen schwer sein, aber man lernt wie gesagt dazu ![]() Oder mal die eine Menüleiste als PNG mit aufgemalten knöpfen und prüf die Mausposition und führe dann ggf. die Aktion der Knöpfe durch. so hab ich das vor 2 Jahren gemacht ![]() Oder lade dir GUIs wie BlitzUI oder such im Forum hier mal nach welchen - sowas gibts wie Sand am Meer! Dann speicherst du den Kram in Dateien und hast so gleich Extralektion in Dateizugriff, von Benutzung fremder GUIs etc. mal ganz zu schweigen! Was man da alles lernen könnte! ![]() |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
du brauchst keine data felder zu benutzen, das kannste ganz einfach mit nem 2dimensionalen array und und den Befehlen für die dateien machen, am anfang ist es noch relativ undurchsichtig, aber versuche mal einen zu schreiben, dadurch lernt man sehr viel und du kannst ihn nach deinen Wünschen gestalten, also alles was du für dich selber brauchst.
und dafür brauchst du auch kein BlitzPlus, habe letztens auch einen gemacht, also wenn du hilfe oder Tipps brauchst, kannst du dich ja bei mir per icq melden. [edit] mist, schon wieder zu spät |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
- Zuletzt bearbeitet von skey-z am Di, Mai 17, 2005 14:10, insgesamt einmal bearbeitet
![]() |
brezelbakery |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() na mal sehen. ICh suche nach ner Lösung. Thread kann geschlossen werden |
||
konfuzius sagt:
"töte einen und du bist ein mörder, töte 1000 und du bist ein held." |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group