Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Indexy obiektów
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003
Indexy obiektów

1)Mam kod:

    For Y = 0 To Height
    EditLoad "Ładowanie pól", Y, Height + 1
        For X = 0 To Width
            Load shpPole(X)
            Load imgPole(X)
            shpPole(X).Left = shpLevel.Left + X * (shpLevel.Width / Width)
            shpPole(X).Top = shpLevel.Top + Y * (shpLevel.Height / Height)
            imgPole(X).Left = shpLevel.Left + X * (shpLevel.Width / Width)
            imgPole(X).Top = shpLevel.Top + Y * (shpLevel.Height / Height)
            shpPole(X).Height = Y * (shpLevel.Height / Height)
            shpPole(X).Width = X * (shpLevel.Width / Width)
            imgPole(X).Height = shpPole(X).Height
            imgPole(X).Width = shpPole(X).Width
            shpPole(X).Visible = True
            imgPole(X).Visible = True
            imgPole(X).Picture = LoadResPicture(101, 0)
            Test = shpPole(X).Left & ";" & shpPole(X).Width & ";" & shpPole(X).Height & ";" & shpPole(X).Top & ";" & shpPole(X).Visible
        Next
    Next

zmienna test (jak sprawdzę np. Watch'em) podaje dobre wartości, a zarówno shp, jak img nie pojawia się
2)Edytor plansz zrobiony w ten sposób (przez indexowane image) działa wolno i wszelkie operacje to horror. Jest może sposób, aby można było wstawiać obiekty, a później bez problemów je przesuwać (bez problemów tzn. bez cięcia się). Mam na myśli np. edytor do StarCrafta (nie mówię, że chcę, aby tak samo wyglądał, choć był bym za ), ale samo to, że mogę dużo wstawić obiektów i nie tnie się przy jakiej kolwiek operacji. Edytor ma być do gry 3D , ale wstawianie obiektów może być zrobione, jak w zwykłym edytorze - od góry. No a skoro gra 3D, to pewnie osoby wtajemniczone wiedzą, że plansza jest podzielona na kwadraty (a może to tylko moje urojenia). Dlatego tych kwadratów będzie od 100x100 do 10000x10000


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

23-11-2004 13:49
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
Chudy
[TLHW]Wiktor



Typ: moderator
Postów: 574
Zarejestrowany: Aug 2002

A powiedz mi czy dobra gra korzysta z kontrolek ? Co prawda tutaj idzie o edytor, ale uważam że lepiej jest zastosować funkcje graficzne a nie kontrolki image. Jeśli plansze w tym edytorze są podzielone na sektory o takim samym rozmiarze to nie ma problemu.


_____________________________________________
Projekt "Thunder Cannons" nadchodzi...

23-11-2004 14:33
Pokaż profil Chudy  Wyślij email do Chudy   Odwiedź stronę Chudy       1220895
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

No to jest myśl! Powiedz, jak taki edytor zrobić?


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

23-11-2004 14:59
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

1) Sprawdź, czy przypadkiem jakaś kontrolka ich nie zasłania (pamiętaj, ze shape i image w run-time właściwie nie istnieją jako okna - są tylko obrazkami na bitmapie kontenera!).
2) Sprawdź, czy masz odpowiedni .ScaleMode ustawiony... bo może poprostu działasz np. na pixelach, a .ScaleMode masz ustawione na Twipy i kontrolki wychodzą zbyt małe, by mozna je było zobaczyć lub odwrotnie - są poza formą, bo podajesz pozycję w Twipach, a .ScaleMode jest w pixelach .
3) Właśnie... ja też nie polecam robienia tego kontrolkami, szczególnie, jeśli ma być ich bardzo dużo. Ale jest tutaj jedna uwaga - image nie tworzą okien, więc w ostateczności można spróbować ich użyć. Jednak mimo wszystko polecam - tak jak Chudy - użycie funkcji graficznych - np. PaintPicture lub nawet fucnkji GDI.
4) 10000x10000 nie powinno stanowić problemu, jeśli nie próbujesz wyświetlić wszystkich 1000000000 kwadratów jednoczesnie . Wyświetlaj tylko te widoczne. Co wiecej - przy takiej ilosci możesz spróbować ładować mapę fragmentami, zeby nie zapychać całkowicie pamięci.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

23-11-2004 17:40
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

5) Kształ - jak wiedzą jeszcze bardziej wtajemniczeni - czasami mają one kształ rombów a nawet sześciokątów, jeśli nie trójkątów lub okręgów .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

23-11-2004 17:42
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

Dzięki za pomoc! Nawet nie będę sprawdzał, czy inna kontrolka nie przysłania tego, bo spróbuję to zrobić za pomocą funkcji rysujących. Tylko problem: co będzie, jak user zechce zapisać planszę? 1000000000? Trochę długo będzie to trwało jeżeli zrobię For I = 0 To 1000000000. A więc jak zapisać/otwierać planszę?


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

28-11-2004 22:51
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Obawiam się, że zapis w pętli będzie najskuteczniejszy .
Z tym, że ja radziłbym wczytywać mapę do edycji tylko fragmentami (np. 300x300) i po edycji danego fragmentu (czyli zmianie na inny) - zapisywać. Drugim psosobem może być dziłanie bezpośrednio na pliku - po zmianie każdego pola jest ono natychmiast zapisywane. Ta metoda ma jednak pewną wadę - częste zapisy do pliku zbyt dużych ilości informacji mogą spowolnić cały edytor (dlatego trzeba znaleźć złoty środek między zużyciem pamięci a prędkością programu). Najlepiej realizuje się to, gdy plik jest w czasie edycji cały czas otwarty - czyli otwierasz na początku, pracujesz na nim i dopiero na końcu (lub z innej okazji) zamykasz. Obydwie metody wymagają przeliczania pozycji w dwóch wymiarach (X,Y) na pozycję w jednym wymiarze (L) - przecież plik jest jednowymiarowym ciągiem bajtów. Z tego co wiem miałeś już do czynienia z niskopoziomową grafiką komputerową, więc pewnie wiesz jak to przeliczać, ale umieszczę tutaj najprostszy schemat postępowania dla innych:
Zapis:
nOffset = (Y * Width + X) * nRSize
Odczyt:
Y = (nOffset / nRSize) \ Width
X = (nOffset / nRSize) Mod Width

, gdzie:
nOffset - adres w pliku od początku zapisu wybranych danych
X,Y - adres w przestrzeni 2D, wartość minimalna wynosi 0.
Width - szerokość danych w 2D (czyli maksymalna poprawna wartość X + 1 dla ścisłości)
nRSize - długość pojedynczej jednostki danych w bajtach - np. 3 bajty dla RGB w bitmapie 24-bitowej (stąd jej nazwa).

Widzę tutaj inny problem: mapa 10000x10000 zajmie... z 95MB minimum (w najlepszym przypadku niekompresowaną mapę o tych rozmiarach można zapisać na 12MB) - to dość dużo. I komu będzie się chciało edytować takie giganty?
Owszem - grałem w grę, w której do dyspozycji graczy były mapy w kształcie kwadratu o boku 6km, "ale..."
Nie wiem co robisz - może takie duże są ci potrzebne. Ale jeśli nie - warto sie zastanowić, czy nie lepiej użyć czegoś mniejszego .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-11-2004 06:29
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Aha - co do zasłaniania: jeśli będziesz rysował bezpośrednio na formie, to kontrolki nadal mogą to zasłonić. Jeśli nie chcesz, by cokolwiek zasłoniło ci mapę, rysuj ją na PictureBoxie umieszczonym nad wszystkimi innymi kontrolkami.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-11-2004 06:30
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

Większości z tego co napisałeś to rozumiem tylko spójniki, ale kit. 12mb? No to chyba nie jest mało, ale ograniczyć pole niestety nie mogę! Zrobiłem se właśnie grę, aby zobaczyć jaką wielkość wizualnie będzie miało pole 1000x1000. Powiem, że tragicznie. Jeden taki kwadrat = 1 bajt. A więc 1000000 B=1000kB=1mB (dobrze liczę? ). To jeszcze mogę znieść, ale w grach 3D potrzebuję większą mapę! A może wiesz, jak radzą sobie z tym problemem inne edytory? Np. edytor do Tomb Raidera. U mnie są 2 wym. W tamtym edytorze - 3, bo może być obiekt nad obiektem+skrypty.

[Post edytowany dnia 29-11-2004 20:09 przez mikmas]


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

29-11-2004 20:07
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Większość omówiłem z mikmasem na GG, więc tutaj umieszczam raczej odpowiedź dla pozostałych forumowiczów, gdyby kiedyś ktoś czegoś takiego również szukał:
1) Nalezy się przede wszystkim zastanowić, czy mapa o rozmiarach 10000x10000 pól jest nam wogóle potrzebna. Największymi mapami z jakimi spotykam się w zwykłych grach są takie o wymiarach 300x300, ale zwykle znacznie mniejsze (a i te są uważane za ogromne). Nielicznymi wyjątkami mogą być tutaj np. Tibia, w której jest na oko z 5000x5000 pól (może się mylę) - ale to jest MMORPG z dziesiątkami tysięcy graczy, do tego umieszczony na dobrych serwerach. Drugą znaną mi grą o dużych mapach jest Wulfram - 6x6km, ale wykonane w innej technice zapisu map.
2) Jeśli mówimy o symulatorze 3D, to okazuje się, że te 10000x10000 pól okazuje się wogóle niepotrzebne. Przede wszystkim najlepiej wtedy zastosować modele. Jeśli jednak ktoś uprze się, żeby używać pól - można np. zwiększyć rozmiar pola. Przecież pola nie muszą mieć 1x1m. Prawdę mówiąc mogą mieć spokojnie np. 5x5m. Ponieważ wzrost rozmiarów pola powoduje, że ilość potrzebnych pól spada kwadratowo - mapa z 95MB zmniejszy się do 3.8MB (przy założeniu, że na jedno pole potrzebujemy 1 bajt).
3) Teraz spokojnie możemy np. zwiększyć ilość danych na jedno pole do 2 bajtów. Tym samym uzyskujemy 65536 możliwych typów terenu. Do różnorodnego wypełnienia kwadratów o boku 5m powinno to wystarczyć.
4) Jeśli ktoś chce się bawić zapisem na bitach, nie bajtach - to przypominam, że liczbę możliwych do zapisania na tych bitach wartości rośnie wykładniczo w stosunku do wzrostu liczby bitów. Zatem dodanie jednego bitu spowoduje 2-krotne zwiększenie liczby możliwych wartości.
5) Proponuję również oddzielać warstwę terenu i elementów naziemnych - czołgów, budynków itp. Teren może zająć np. 3.8MB, a do tego można dołączyć listę obiektów razem ze współrzednymi, na których mają zostać ustawione... ile takich obiektów będzie? 100? 500?
6) Tak, wiem, że to wszystko wiąże się z dodatkową robotą - ale nikt nie mówił, że optymalizacja jest łatwa .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

30-11-2004 04:40
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Wszystkich odpowiedzi: 9 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1