scrollen auf tilemap mit viewport und origin

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

brezelbakery

Betreff: scrollen auf tilemap mit viewport und origin

BeitragMo, Mai 16, 2005 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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
ppy=py*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

BeitragDi, Mai 17, 2005 0:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter

brezelbakery

BeitragDi, Mai 17, 2005 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Mai 17, 2005 7:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr gut, oldskool Smile

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 Smile

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

BeitragDi, Mai 17, 2005 7:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter

DivineDominion

BeitragDi, Mai 17, 2005 7:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

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

BeitragDi, Mai 17, 2005 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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."

BladeRunner

Moderator

BeitragDi, Mai 17, 2005 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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

BeitragDi, Mai 17, 2005 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
kk
konfuzius sagt:
"töte einen und du bist ein mörder,
töte 1000 und du bist ein held."

brezelbakery

BeitragDi, Mai 17, 2005 13:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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."

BladeRunner

Moderator

BeitragDi, Mai 17, 2005 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte es auch nicht.
Aber ohne kompletten Code kann ich da nur wenig sagen Wink
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

BeitragDi, Mai 17, 2005 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Mai 17, 2005 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Mai 17, 2005 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

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 Smile

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! Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS

skey-z

BeitragDi, Mai 17, 2005 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter
  • Zuletzt bearbeitet von skey-z am Di, Mai 17, 2005 14:10, insgesamt einmal bearbeitet

brezelbakery

BeitragDi, Mai 17, 2005 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Rolling Eyes
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."

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group