Ogłoszenie 

Uwaga! To forum jest w trybie offline.
Wszelką pomoc uzyskasz pod adresem
forum.ultimateam.pl


Administracja Forum


Poprzedni temat «» Następny temat
Przesunięty przez: Ayene
Pią 26 Lut, 2010 14:15
Okno w Ruby
Autor Wiadomość
pw115 



Preferowany:
RPG Maker XP

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:
Kod:
@okienko.dispose

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:
Kod:
@okienko.refresh

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:
Kod:
else

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:
RPG Maker VX

Ranga RM:
1 gra

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:
RPG Maker XP

Ranga RM:
1 gra

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ę. :mrgreen:

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:
Spoiler:

 
 
cNN 




Preferowany:
RPG Maker VX

Dołączył: 07 Kwi 2009
Posty: 43
Skąd: Stalowa Wola
Wysłany: Wto 09 Mar, 2010 15:48
O.o wielkie thx. Szukałem czegoś takiego ;-) Leczy mógłbyś trochę lepiej wytłumaczyć ;p i dodać screeny :->

pzdr.
________________________
"Lepiej być nienawidzonym za to kim się jest, niż być kochanym za to, kim się nie jest." - Kurt Cobain

 
 
pw115 



Preferowany:
RPG Maker XP

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:
4 gry

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:
RPG Maker XP

Ranga RM:
1 gra

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:
Spoiler:

 
 
Ayene 




Ranga RM:
4 gry

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:
Kod:
@okienko.dispose

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:
RPG Maker XP

Ranga RM:
1 gra

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 :mrgreen:

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:
Spoiler:

 
 
Ayene 




Ranga RM:
4 gry

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:
RPG Maker VX

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ł :mrgreen: Time, Dzięki jeszcze raz, mi się naprawdę przydało :-D Więcej! Prosimy :-P

[ 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:
4 gry

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:
Kod:
self.opacity = 0


Powinno zadziałać :-P
________________________


 
 
 
Squall 




Preferowany:
RPG Maker VX

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 :-P
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:
4 gry

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:
RPG Maker VX

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% :-P
________________________

 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group | Template Klam by Ayene