Ogłoszenie |
Administracja Forum
|
Przesunięty przez: Ayene Pią 26 Lut, 2010 14:15 |
Okno w Ruby |
Autor |
Wiadomość |
pw115

Preferowany:

Pomógł: 10 razy Dołączył: 19 Lut 2010 Posty: 235 Skąd: Katowice
|
Wysłany: Sob 20 Lut, 2010 14:58
|
|
Okno w Ruby
|
Witam chciałbym wam dziś pokazać jak stworzyć własne okno w RGSS
a więc będą nam potrzebne:
- Podstawy j. angielskiego
- RMXP lub RMVX
- Umiejętność obsługiwania klawiatury
- Chęci
Zaczynamy
Wchodzimy w edytor skryptów (F11) i po lewej stronie widzimy okienko ze skryptami.
Odszukujemy tam klasę Window_Base i POD nią klikamy wstaw (ewentualnie wyszukujemy Main i wstawiamy pusty slot nad nią).
Wyświetla nam się Całe Puste okno na pisanie.
Pisać zaczynamy od nazwania naszej klasy:
Kod: | class Window_okno < Window Base |
Dlaczego < Window_Base ?
Bo nasze okienko będzie korzystać z metod zdefiniowanych w tej klasie
Teraz pod definicją piszemy:
Kod: | def initialize(x,y,width,height) |
x,y,width,height,
x- położenie okna na osi x
y - położenie okna na osi y
width - szerokość okna
height - wysokość okna
Całość powinna wyglądać tak:
Kod: | class Window_okno < Window_Base
def initialize(160,200,220,240)
end
end
|
Zapomniałem napisać. Każdy klasa (class) i każda definicja (def)
MUSI mieć swój end
Następnym krokiem jest stworzenie nadklasy (super)
W wypadku klasy Window_Base niezbędnymi argumentami są:
- pozycja x i y
- szerokość i wysokość okna.
A więc:
Kod: | class Okienko < Window_Base
def initialize(160,200,220,240)
super(x,y,width,height)
end
end
|
Następnym krokiem jest wywołanie bitmapy (żeby móc zamieszczać teksty i obrazki).
Robimy to dzięki:
Kod: | self.contents = Bitmap.new(width - 32, height - 32)
|
self oznacza, że następująca metoda odnosi się do obiektu, na którym aktualnie pracujemy (czyli naszego okna).
contents oznacza zawartość okna.
Bitmap.new(width-32, height-32) tworzy obiekt klasy Bitmap o wielkości okna pomniejszonego w każdej z osi o 32 piksele.
Jest to spowodowane tym, że 16 pikseli z każdej strony okna jest przeznaczonych na ramkę i nie może być na nich wyświetlane nic innego.
Mamy już okno mamy ogólną zawartość. Co teraz ?
Zdefiniujmy Czcionkę, rozmiar i przeźroczystość.
Piszemy pod self.contents......
Kod: | self.contents.font.name = ("Tahoma")
self.contents.font.size = 18
self.back_opacity = 160
|
self.back_opacity = 160 ustawia parametr opacity (przezroczystość) tła okna na 160 (przyjmowane wartości - 0 do 255).
Oprócz takiej metody możemy jeszcze zastosować metodę self.opacity, która wpływa nie tylko na tło, ale również na ramkę okna i jego zawartość.
Jeśli chcielibyśmy, aby nasze okno miało inną grafikę (windowskin) to możemy to zrobić wpisując poniższy kod:
~ dla RMXP:
Kod: | self.windowskin = RPG::Cache.windowskin("nazwa_pliku.png") |
~ dla RMVX:
Kod: | self.windowskin = Cache.system("nazwa_pliku.png") |
Nasze okno zostawimy ze standardową grafiką ;)
Proszę oto kod naszej obecnej pracy
Kod: | class Window_okno < Window_Base
def initialize (x = 160, y = 120, width = 320, height = 240)
super (x, y, width, height)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = "Tahoma"
self.contents.font.size = 18
self.back_opacity = 160
refresh
end
end
|
Rozpoczynamy definicję metody refresh. Co w niej zawrzemy?
Zwyczajowo najpierw czyścimy wszystko, co zostało napisane/narysowane poprzednio. Jest to konieczne w przypadku zmiennej zawartości okna, aby zmieniające się znaki nie nakładały się na siebie.
Dla zawartości stałej można ten fragment pominąć, ale trzeba go znać.
Kod: | def refresh
self.contents.clear
|
Nadszedł czas na wstawienie tekstu
Kod: | self.contents.draw_text(0, 0, 288, 32, "Tu wpiszcie tekst", 1)
|
Powoduje wyświetlenie tekstu ("tekst") w miejscu (0, 0), który wyrównany będzie do środka (0 - do lewej; 1 - do środka; 2 - do prawej).
Na tekst przeznaczone jest pole o szerokości 288 pikseli i wysokości 32 pikseli.
Jeśli tekst będzie większy niż zadane pole - zostanie zmniejszony, aby się do niego dopasować.
A teraz nowa przydatna opcja:
Jeśli chcemy wyświetlić wartość zmiennej (fajnie nie?) najpierw trzeba ją przekonwertować do ciągów znaków (string)
$game_variables[5].to_s - wyświetli wartość zmiennej numer 5.
Koniec tworzenia okna !
oto cały kod
Kod: | class Window_okno < Window_Base
def initialize(x = 160, y = 120, width = 320, height = 240)
super(x, y, width, height)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = "Tahoma"
self.contents.font.size = 18
self.back_opacity = 160
refresh
end
def refresh
self.contents.clear
self.contents.draw_text(0, 0, 288, 32, "Losowy tekst służący do zapełnienia okna", 1)
end
end
|
Teraz musimy spowodować wyświetlanie okna na mapie.
W tym celu wchodzimy do Scene_Map i odszukujemy linijki.
Kod: | @spriteset = Spriteset_Map.new
@message_window = Window_Message.new
|
POD tym piszemy:
Kod: | @okienko = Window_okno.new |
Okienko wyświetla się na mapie. Jednak nie znika po wyjściu do Menu.
Nie chcemy tak!
Schodzimy trochę niżej do linijki 36?
Widzimy:
Kod: | @spriteset.dispose
@message_window.dispose |
Piszemy:
Teraz okno schodzi posłusznie z mapy ;]
Jeśli zawartość okna zmienia się co jakiś czas
to musimy zejść niżej do definicję (def) update i tam znaleźć (73 linia)
Kod: | @spriteset.update
@message_window.update |
piszemy:
KONIEC
EDIT
Jeśli chcemy żeby wybrany tekst zależał od zmiennej to piszemy:
Kod: | if $game_variables[ID zmiennej] == N*
akcja1
else
akcja2
end
|
N - jakiś numer
Teraz przyjrzyjmy się tej linijce:
Kod: | if $game_variables[ID] == N
|
Przyjmujemy, że komenda if w Ruby znaczy "jeżeli, kiedy"
$game_variables hmm... wygląda na zmienną globalną co ?
teraz bardzo ważne jest == co to znaczy?
to znaczy że zmienna [Id] jest RÓWNA == N czyli numerkowi
Zamiast == można wpisać:
!= różna od
<= mniejsza lub równa
>= większa lub równa
< mniejsza
> większa
Teraz po całym warunku wstawiamy naszą wybraną akcję.
Jeśli chcemy tak, żeby w przypadku, gdy warunek nie jest spełniony była inna akcja, wówczas piszemy:
i pod tym drugą akcję.
Całość kończymy komendą end
Teraz to samo, ale z przełącznikami:
Kod: | if $game_switches[0001] == true (czyli ON)
akcja1
else
akcja2
end
|
Enjoy !
Mam nadzieję, że komuś pomogłem.
Proszę o oceny 0/6
PS Jeśli poradnik się spodoba to napiszę następny o CMS'sie
PS2 Poradnik został w niewielkim stopniu zedytowany, tak aby pasował zarówno do RMXP jak i do RMVX - Ayene. |
|
|
|
Asantos


Preferowany:

Ranga RM:

Pomógł: 15 razy Dołączył: 31 Sty 2010 Posty: 236 Skąd: Gniezno
|
Wysłany: Wto 09 Mar, 2010 11:05
|
|
|
No dam ci czwóreczkę za tę pracę. Mógłbyś dodać kilka rzeczy, a mianowicie:
1. Kiedy okno się wyświetla strasznie "muli" się gra - jak otworzyć okno aby bohater stał nieruchomo.
2. Jak umieszczać tekst w następnej linijce lub obok (rozpracowałem to ale nie każdemu tak szybko idzie).
3. Dokładnie wyrównanie do lewej prawej itp. bo u mnie to średnio działa - nie rozpracowałem.
4. Wywoływanie okna przyciskiem. |
|
|
|
Melvin


Preferowany:

Ranga RM:

Pomógł: 35 razy Dołączył: 23 Paź 2009 Posty: 1063
|
Wysłany: Wto 09 Mar, 2010 11:07
|
|
|
AAAA!!!!!!! Time!!!! Kozak jesteś!!!
Przyda się.
5/6
Dałbym 6/6 ale nie napisałeś co zrobić, aby zniknęło.
(Wywoływanie przyciskiem)
[ Dodano: Wto 09 Mar, 2010 12:12 ]
Dobra wiem jak podporządkować to danemu klawiszowi.(Np. F5)
W Scene_Map
Cytat: | if Input.trigger?(Input::F5)
$massage_window = Window_Okno.new
end |
A jak zrobić, żeby je zamknąć i żeby jak już się to otworzy, to można otwierać ze 100 razy i się te okienka na siebie nakładają...? |
________________________ MelvinClass:
|
|
|
|
cNN


Preferowany:

Dołączył: 07 Kwi 2009 Posty: 43 Skąd: Stalowa Wola
|
|
|
|
pw115

Preferowany:

Pomógł: 10 razy Dołączył: 19 Lut 2010 Posty: 235 Skąd: Katowice
|
Wysłany: Wto 09 Mar, 2010 15:59
|
|
|
Trudno mi to lepiej wytłumaczyć i po co screeny ? całe kody są podane
w następnych tutorialach pokaże jak zrobić CMS'a |
________________________ Pomocy:
http://pw115.myminicity.com/
 |
|
|
|
Ayene


Ranga RM:

Pomogła: 232 razy Dołączyła: 18 Wrz 2007 Posty: 2424
|
Wysłany: Wto 09 Mar, 2010 16:27
|
|
|
Asantos, odpowiedź na pkt 3:
Tekst w oknie wyświetla się za pomocą kodu:
Kod: | self.contents.draw_text (x, y, width, height, "text", align) |
gdzie:
x - położenie tekstu na osi X
y - położenie tekstu na osi Y
width - szerokość tekstu (jeżeli wartość będzie za mała, to tekst będzie ucięty)
height - wysokość tekstu
"text" - czyli sama zawartość tekstowa
align - położenie, które domyślnie wynosi 0 (dlatego czasami ten parametr jest pomijany):
- 0 - wyrównanie do lewej
- 1 - wyrównanie do środka
- 2 - wyrównanie do prawej |
________________________
       
 |
|
|
|
Melvin


Preferowany:

Ranga RM:

Pomógł: 35 razy Dołączył: 23 Paź 2009 Posty: 1063
|
Wysłany: Wto 09 Mar, 2010 16:43
|
|
|
A jak to zrobić?:
Cytat: | 1. Kiedy okno się wyświetla strasznie "muli" się gra - jak otworzyć okno aby bohater stał nieruchomo. |
Cytat: | 4. Wywoływanie okna przyciskiem. |
I jeszcze jak się robi, żeby to okno było na 640 x 480? |
________________________ MelvinClass:
|
|
|
|
Ayene


Ranga RM:

Pomogła: 232 razy Dołączyła: 18 Wrz 2007 Posty: 2424
|
Wysłany: Wto 09 Mar, 2010 17:58
|
|
|
1. Nie rozumiem pytania.
4. Należy umieścić w definicji update (np. w Scene_Map):
Kod: | if Input.trigger?(Input::F5)
@okienko = Window_okno.new
end |
Jednak należy pamiętać, aby umieścić kod:
W RMXP to sam koniec definicji 'main' (w Scene_Map)
w RMVX to już definicja 'Terminate' (również w Scene_Map)
Melvin, najwyraźniej w ogóle nie czytałeś tutoriala. Time napisał przecież, który fragment skryptu odpowiada za wymiary okna. |
________________________
       
 |
|
|
|
Melvin


Preferowany:

Ranga RM:

Pomógł: 35 razy Dołączył: 23 Paź 2009 Posty: 1063
|
Wysłany: Wto 09 Mar, 2010 18:06
|
|
|
Cytat: | Melvin, najwyraźniej w ogóle nie czytałeś tutoriala. Time napisał przecież, który fragment skryptu odpowiada za wymiary okna. |
Tak ale mi wychodziło takie okienko po lewej stronie
A co do pytania 1:
Czy do się zrobić okienko tak jak np. menu? Tzn, że bohater stoi w miejscu i nie można nim poruszać, gdy jest wyświetlone okienko...
[ Dodano: Wto 09 Mar, 2010 18:10 ]
Cytat: | if Input.trigger?(Input::F5)
@okienko = Window_okno.new
end |
Ok.
A jak wyłączyć?
Coś nie kapuję... |
________________________ MelvinClass:
|
|
|
|
Ayene


Ranga RM:

Pomogła: 232 razy Dołączyła: 18 Wrz 2007 Posty: 2424
|
Wysłany: Sro 10 Mar, 2010 07:57
|
|
|
Żeby okienko można było włączać i wyłączać za pomocą tego samego przycisku, można:
umieścić w definicji Main/initialize/start (zależy od tego, co znajduje się w klasie):
Kod: | @okienko = Window_Help.new
@okienko.visible = false |
Co spowoduje, że okienko wgra się od razu po przejściu np. na mapę, ale nie będzie widoczne.
A następnie w definicji 'Update' wstawić:
Kod: | if Input.trigger?(Input::F5)
if @okienko.visible == false
@okienko.visible = true
else
@okienko.visible = false
end
end |
Co do zatrzymania bohatera. Należałoby skorzystać już nie z okna, tylko z klasy Scene. |
________________________
       
 |
|
|
|
Squall


Preferowany:

Pomógł: 1 raz Dołączył: 20 Lip 2009 Posty: 107 Skąd: Ogród Balamb :P
|
Wysłany: Pon 15 Mar, 2010 19:21
|
|
|
Dzięki! To jest świetne, a że dla mnie skrypty to prawie czarna magia...Dlaczego prawie? Bo potrafię tylko kilka rzeczy edytować...ale sam bym takiego czegoś nigdy nie zrobił Time, Dzięki jeszcze raz, mi się naprawdę przydało Więcej! Prosimy
[ Dodano: Pon 15 Mar, 2010 23:31 ]
Cytat: | Jeśli chcielibyśmy, aby nasze okno miało inną grafikę (windowskin) to możemy to zrobić wpisując poniższy kod:
~ dla RMXP:
Kod:
self.windowskin = RPG::Cache.windowskin("nazwa_pliku.png")
~ dla RMVX:
Kod:
self.windowskin = Cache.system("nazwa_pliku.png")
Nasze okno zostawimy ze standardową grafiką ;)
Proszę oto kod naszej obecnej pracy |
A da się zrobić by zamiast windowskin można było dać jakiś obrazek na tło okna? |
________________________
 |
|
|
|
Ayene


Ranga RM:

Pomogła: 232 razy Dołączyła: 18 Wrz 2007 Posty: 2424
|
Wysłany: Czw 18 Mar, 2010 21:10
|
|
|
W definicji initialize okienka wpisz na końcu:
Kod: | @back_sprite = Sprite.new
@back_sprite.bitmap = Cache.picture("Nazwa") |
Ewentualnie jeśli będziesz chciał się pozbyć ramki to przed tym wpisz:
Powinno zadziałać |
________________________
       
 |
|
|
|
Squall


Preferowany:

Pomógł: 1 raz Dołączył: 20 Lip 2009 Posty: 107 Skąd: Ogród Balamb :P
|
Wysłany: Sob 20 Mar, 2010 10:23
|
|
|
Ok dzięki Ayene to działa
Ale mam jeszcze jedno pytanie...da się zrobić z tym obrazkiem to samo co z ramką?
Chodzi mi o (Przezroczystość) : self.opacity = 0 Tylko że w obrazku... |
________________________
 |
|
|
|
Ayene


Ranga RM:

Pomogła: 232 razy Dołączyła: 18 Wrz 2007 Posty: 2424
|
Wysłany: Sob 20 Mar, 2010 15:07
|
|
|
skoro przyporządkowywałeś "sprite" zmiennej @back_sprite, to możesz zmienić przezroczystość za pomocą kodu:
Kod: | @back_sprite.opacity = 0 |
Musi on się znaleźć po deklaracji zmiennej, czyli po:
Kod: | @back_sprite = Sprite.new |
W przeciwnym wypadku wystąpi błąd. |
________________________
       
 |
|
|
|
Squall


Preferowany:

Pomógł: 1 raz Dołączył: 20 Lip 2009 Posty: 107 Skąd: Ogród Balamb :P
|
Wysłany: Sob 20 Mar, 2010 15:44
|
|
|
Dzięki Ayene, przydało się w 100% |
________________________
 |
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
 |