UltimaForum

Wsparcie [VX] - Class Sprite

Teyan - Czw 30 Gru, 2010 00:13
Temat postu: Class Sprite
Cześć wróciłem.
Mam prośbę. Czy ktoś mi wytłumaczy class Sprite?
Jak to działa i w ogóle.
Nie jestem zielony w Ruby, nawet napisałem kilka skryptów (jedne lepiej inne gorzej - przyznaje sie bez bicia). Ale nie potrafie dodawać sprite'ów. Nawet nie wiem jakie pytanie mam tutaj zadać.
Chcę także zrobić animację (potrafie "zatrzymywać czas w grze", tj: posługiwać się zmienną lokalną @wait (choć u mnie nazywa się @czekaj)). Czy ktoś mi pomoże?

Ayene - Czw 30 Gru, 2010 01:17

A przeglądałeś w tym celu Pomoc VX? Wpisz w wyszukiwarce Sprite, a tam może znajdziesz odpowiedź na swoje tajemnicze pytanie ;-) Jeśli chcesz zrobić animacje, zajrzyj do Sprite_Base. VX chociażby tym różni się od XP, że ma ładnie zdefiniowane klasy "bazowe". Jest tam definicja, dzięki której można odtworzyć animacje z bazy danych... 'start_animation' ;-)
Teyan - Czw 30 Gru, 2010 20:10

Yyy... i tak nic z tego nie kumam. Ostatnio robiłem łowienie ryb i skrypt na podawanie (wpisywanie) hasła. Animacjami zajmę się potem, teraz mam inne pytanie.
Czy można uzależnić windowskin okna (jak zmienić windowskin tylko jednego okna to wiem) od terenu na jakim znajduje się gracz (drużyna). Próbowałem juz poszukać jakieś pokemony (bo te potworki siedziały w trawie, musieli to zrobić na podobnej zasadzie), ale nie znalazłem poków na VX. Czy ktoś pomoże?

Sabikku - Czw 30 Gru, 2010 22:20

Polecam: http://tryruby.org/
+ znajomość angielskiego i przejrzenie dokumentacji rmvx.

Musisz stworzyć obiekt klasy Sprite_Base i przypisać mu bitmapę o odpowiedniej wielkości. Potem z każdym odświeżeniem ekranu wywoływać jego funkcję składową update. W momencie odtworzenia animacji wywołaj funkcję start_animation, jako argument podając docelową animację ($data_animation[id]). Uruchom ją tylko raz, inaczej nie będzie widać animacji. Pamiętaj też o funkcji dispose, którą uruchamia się, kiedy Sprite'a już nie potrzebujesz.
Ot, cała filozofia :P.

W jakim sensie 'terenu'? Jeśli pasowałoby ci zrobić listę id map każdego z 'terenów', możesz zrobić tak:
Kod:

case $game_map.map_id
when 1..5
  s = "teren1"
when 6,7,8
  s = "teren2"
when 9..15
  s = "teren3"
end
self.windowskin = Cache.system("windowskin "+s.to_s)

W tym przypadku na mapie 3 wymagać będzie windowskina o nazwie "windowskin teren1", na mapie 7 "windowskin teren2", a na mapie 14 - "windowskin teren3". Mam nadzieję, że rozumiesz.

Można też uzależnić od id konkretnego tile'a (np. trawa -> zielony windowskin, pustynia -> żółty itp), ale nie jestem pewien, o co dokładnie ci chodziło ;-) .

Teyan - Pią 31 Gru, 2010 14:33

Cytat:
Można też uzależnić od id konkretnego tile'a (np. trawa -> zielony windowskin, pustynia -> żółty itp), ale nie jestem pewien, o co dokładnie ci chodziło ;-) .

Tak! O to!
Chcę uzależnić windowskin o danego terenu na "TileA1"
Cytat:
Polecam: http://tryruby.org/

Skoro już tak sobie polecamy:
Apohllo (po polsku)
Kolejna strona po polsku :-)
Stronki po angielsku:
Pełny opis klasy String
Pełny opis klasy Array
Pełny opis klasy Hash

Niemal wszystko co umiem znam z tych stron, może wam sie przyda!

Sabikku - Pią 31 Gru, 2010 16:29

$game_map.data <-- tu przechowywany jest obiekt klasy Table, tj. trójwymiarowa tablica przechowująca ID tileów w każdym miejscu na mapie. Możesz z niego pobrać id w ten sposób:
Kod:
$game_map.data[x, y, z]

Czyli przykładowo z pomocą:
Kod:
$game_map.data[$game_player.x, $game_player.y, 0]

dostaniesz id tile'a na najniższej warstwie, na którym aktualnie stoi gracz. Zauważ, że id nie są poustawiane równo (1,2,3) tylko mają nieco większe numery (nie wiem jak to jest przeliczane, ale wychodzi w tysiącach).
Warunek wyglądałby np. tak:
Kod:
case $game_map.data[$game_player.x, $game_player.y, 0]
when 5012
  s = "teren1"
when 1201
  s = "teren2"
when 4504
  s = "teren3"
else
  s = "teren0"
end
self.windowskin = Cache.system("windowskin "+s.to_s)

Teyan - Pią 31 Gru, 2010 20:39

Tak! To jest to! Dzięki.
Za pomoc masz oczywiście pomógł!.

Mam teraz pytania odnośnie sprite'ów:
Załóżmy, że stworzyłem taki sprite:

Kod:
    @sprite = Sprite.new
    @sprite.bitmap = Cache.system("Iconset")


1. Czy można zrobić tak aby program wyciął jedną ikonkę i wstawił ją zamiast całego iconsetu?
2. Czy można wyłączyć widzialność tego sprite'u tak jak okienek (visible = true/false).
3. Czy można ustawić by program pokolorował cały sprite na np: czerwono, ale oprócz miejsc przezroczystych?

Sabikku - Pon 03 Sty, 2011 00:37

Nie mam dostępu do RMa, a do jutra zapomnę o temacie - napiszę co wiem z pamięci, w rmxp działa na pewno, w rmvx nie jestem pewien:

Kolorowanie - wystarczy nałożyć odpowiednią maskę kollorów (sprawdź w dokumentacji, konkretniej o klasie Sprite):
@sprite.color = Color.new(255,0,0, 150)

Tak, można wyłączyć widoczność: @sprite.visible = false. Tak samo jak w przypadku okienek.

Wycinanie... Na pewno trzeba zmodyfikować prostokąt 'źródłowy' który standardowo ogarnia cały obrazek, a mamy go ustawić na np. 24x24. Spróbuj tak: @sprite.rect = Rect.new(0,0,24,24)

Pamiętaj jednak, że żadne zmiany nie będą widoczne na ekranie, dopóki nie będziesz co ramkę odświeżał Sprite'a - @sprite.update.


Powered by phpBB modified by Przemo © 2003 phpBB Group