Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

19.08.2006, 22:22

Map zeichnen?

Hi,

lasse meine Maps immer so zeichnen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
for (unsigned long y = 0; y < 38; ++y)
        {
            for (unsigned long x = 0; x < 54; ++x)
            {
                if (map1[y][x] == 1)
                {
                    tiles.draw (x * 16 + offset_x, y * 16 + offset_y, 0, 0, 16, 16);
                }
              // usw...


Aber jetzt, wo die Maps langsam größer werden, merke ich dann doch, dass
das Programm ganz schön lange zum Map zeichnen braucht. (Ruckeln)
Die Map ist als 2D Array gespeichert. Kennt jemand vielleicht eine deutlich
schnellere Methode?

EDIT: Wenn ich die Map nicht so oft neuzeichnen müsste, wäre ja alles
In Ordnung, aber durch das animieren geht es leider nicht anders...

2

19.08.2006, 22:27

du musst ja nur die speziellen areas, wo sich was animiert neuzeichnen...kein grund, ALLES neu zu zeichnen

Anonymous

unregistriert

3

19.08.2006, 22:49

Das ist auch ne Idee Oo Thx!

Anonymous

unregistriert

4

19.08.2006, 22:50

WarMuuh!!
Warum soooo umständlich? Einfach ausrechnen und gut ist.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        // Die Auflösung beträgt 800x600, die Höhe muss also über 600 Betragen

        // +32 Tolleranzwert Oben und Unten das bedeutet: 20x32 = 640.

        // Das selbe bei der X koordiante: 26x32 = 832

    for (unsigned long y=0; y<20; ++y)
    {
        for (unsigned long x=0; x<26; ++x)
        {
                // Momentane ID für das Array rausfinden

            unsigned char curr_x_id = int(::floor(long double(off_x_+x*32)/32));
            unsigned char curr_y_id = int(::floor(long double(off_y_+y*32)/32));

                // Nur rendern was möglich ist und dann rendern, so das

                // nichts daneben geht

            if (!(curr_x_id < 0 || curr_x_id > map_width-1 || curr_y_id < 0 || curr_y_id > map_height-1))
                tiles_.render (static_cast<int>(::floor(long double(-off_x_)))%32+x*32,  // Y-Koordinate

                               static_cast<int>(::floor(long double(-off_y_)))%32+y*32,  // X-Koordinate

                               map_[curr_y_id][curr_x_id]);                 // Tile-ID die in map_ angespeichert ist

        }
    }


off_x_ und off_y_ ist der Kartenoffset, map_ ist ein 2D Array das die ID des Tiles enthält. map_width und map_height sind selbsterklärend.

ACHTUNG: Dieser Code ist alt und benötigt optimierungsbedarf! Aber er läuft zuverlässig.

Anonymous

unregistriert

5

19.08.2006, 23:03

Dankeschööööööööön :!:

6

20.08.2006, 08:50

Zitat von »"nix da"«

WarMuuh!!
Warum soooo umständlich? Einfach ausrechnen und gut ist.
.


omg...ich hatte vorrausgesetztm, dass er nur sichtbares zeichnet...

ach ja, noch n tip:
wenn du scrolln einbaust, musst du ebenfalls nicht alles neu zeichnen
s reicht, den aktuellen bildinhalt einfach zu verschieben, und die entstandene lücke neuzuzeichnen

Anonymous

unregistriert

7

20.08.2006, 12:14

@ nix da: Könntest du mir noch sagen, wie map_[][] in der render Funktion
verarbeitet wird? Weil muss ja 6 Parameter angeben
(x, y, tilex, tiley, tilew, tileh) d.h. so in der Art müsste es ja aussehen:

C-/C++-Quelltext

1
2
3
(static_cast<int>(::floor(long double(-offset_x)))%16+x*16,  // Y-Koordinate

 static_cast<int>(::floor(long double(-offset_y)))%16+y*16,  // X-Koordinate 

 0, 0, 16, 16);


Werde aber ansonsten eine passendere Render Funktion dazu schreiben.
Muss halt nur wissen, wie du in deinem Beispiel das map_ Array verarbeitest
;)

Anonymous

unregistriert

8

20.08.2006, 13:26

WarMuuh!!
Du denkst zu Analog. Mein Code zeichnet nur sichtbares, mapgröße ist egal, smooth scrolling und kein overdraw. Dafür legt man keine Sektoren an, das ist wie mit ICBMs auf Mücken zu schießen - absoluter unsinn.

Auch hier mit Bildinhaltsverschiebungen, Rendertargets und co anzukommen ist mega übertrieben, das schlägt sogar noch kräftiger auf die Performance. Wir sind ja hier nicht bei GDI wo das keine Performanceeinschübe mit sich zog.

Da ist es schneller jedes einzelne Tile auszurechnen und auf den Bildschirm zu klatschen, wir leben ja mit heutigen GraKas net mehr in der Steinzeit.

DarkRaider
Meine Renderfunktion hatte folgende Parameter:
x-Position zum Zeichnen
y-Position zum Zeichnen
ID des tiles auf der Bitmap. (einfacher unsigned char - wird intern an die richtige Position gesetzt in der bitmap und das tile ausgeschnitten)

9

20.08.2006, 14:02

Zitat von »"nix da"«

Mein Code zeichnet nur sichtbares, mapgröße ist egal, smooth scrolling und kein overdraw.

ich weiß, hab ich auch nix dagegen gesagt...
deine funktion is toll! (gg)

Zitat


Auch hier mit Bildinhaltsverschiebungen, Rendertargets und co anzukommen ist mega übertrieben, das schlägt sogar noch kräftiger auf die Performance.

find ich nich...wenn das ne anspruchsvolle map ist, mit vielen layern und aufgrund vieler effekten brauchst du eh mehrere renderpasses, und da dann nich zu sparen...naja, wenn du meinst...

kommt halt auf die ansprüche drauf an...
[/quote]

Anonymous

unregistriert

10

20.08.2006, 14:08

WarMuuh!!
Glaub mir, ich habe sehr sehr hohe Ansprüche und darüber schon viele Tests gemacht ;)

Werbeanzeige