pw115 - Sob 20 Lut, 2010 14:58 Temat postu: Okno w RubyWitam 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:
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......
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:
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ć.
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.
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 - 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 - 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ą...?cNN - 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.pw115 - 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'aAyene - 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 prawejMelvin - 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?Ayene - 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 - 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ę...Ayene - 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):
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 - 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 - Czw 18 Mar, 2010 21:10 W definicji initialize okienka wpisz na końcu:
Ewentualnie jeśli będziesz chciał się pozbyć ramki to przed tym wpisz:
Kod:
self.opacity = 0
Powinno zadziałać Squall - 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 - 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 - Sob 20 Mar, 2010 15:44 Dzięki Ayene, przydało się w 100% Czeliosss - Pon 05 Kwi, 2010 20:53 Mam pytanie. Jak zrobić, że po lewej stronie jest jakiś spis (wybór), a jak się naciśnie spację to otwiera się kolejne okno.
Z oknem wiem jak, ale nie wiem z tym spisem.
Pzdr.Ayene - Wto 06 Kwi, 2010 11:16 Przykładowo w Scene_Map za dowolną zmienną np. @command podstaw:
oczywiście pamiętaj o dispose i update. Trzeba by było zdefiniować, co wybór komendy powoduje, należałoby również aktywować i dezaktywować odpowiednie okna...
Ciężko mi to wytłumaczyć, lepiej będzie jak złożysz odpowiednie zamówienie. Postaram się to zrobić, a Ty podejrzysz o co w tym chodzi.Sabikku - Wto 06 Kwi, 2010 14:45 Zależy gdzie okienko ma się pojawić. Jeśli na mapie gry, będziesz musiał zrobić to w Scene_Map.
Samo wywołanie (utworzenie) okienka wygląda tak:
Szerokość to liczba, np. 100. Tablica wygląda tak: ['Wybór 1.', 'Wybór 2.', 'Wybór 3']
Window_Command ma dwie zmienne, których nie ma normalne okienko, a mianowicie: index (liczba aktualnie wybranej komendy) i active (przyzwolenie poruszania kursorem wyboru).
Najprościej (i najbezpieczniej) zapisać to w ten sposób:
Kod:
class Scene_Map
alias o_main main
def main
komenda_1 = "Zrób coś 1."
komenda_2 = "Zrób coś 2."
komenda_3 = "Zrób coś 3."
@twoje_okienko = Window_Command.new(192, [komenda_1, komenda_2, komenda_3])
@twoje_okienko.x = 50
@twoje_okienko.y = 100
@twoje_okienko.back_opacity = 150
o_main
@twoje_okienko.dispose
end
alias o_update update
def update
@twoje_okienko.update
if Input.trigger?(Input::C) and @twoje_okienko.active
case @twoje_okienko.index
when 0:
# Pierwsza opcja.
when 1:
# Druga opcja.
when 2:
# Trzecia opcja.
end
end
o_update
end
end
Żeby potem zmienić widoczność okienka (schować), wpisujesz:
Kod:
@twoje_okienko.visible = false
A jeśli nie chcesz, żeby można było poruszać kursorem, wpisujesz:
Kod:
@twoje_okienko.active = false
Komend możesz dodawać dowolnie, ale musisz je zapisywać w taki sam sposób.
Jakby coś było nadal niejasne, pisz :).Czeliosss - Sob 10 Kwi, 2010 18:25 Prześlę Ci na pw Sabikku jak to mam i wkleisz mi ten fragment z wyborem, bo nie wiem, gdzie to dać.ziomalek - Pon 03 Maj, 2010 07:53 a jak zrobić żeby nie wstawiać nic do scene_map???Fixed - Pon 03 Maj, 2010 08:50 Użyć "aliasu", albo przekopiować modyfikowany kawałek skryptu do Twojego...ziomalek - Wto 04 Maj, 2010 12:45 dzięki, a mógłby ktoś dać przykład małego obrazka z napisem "LOL" w prawym górnym rogu i aby nie trzeba było nic wstawiac do scene map???Sabikku - Wto 04 Maj, 2010 14:32 Niestety, nie zrobisz wyświetlania czegoś podczas gry na mapie nie modyfikując zarazem lub nadpisując Scene_Map.
Da się też zrobić o wiele szybciej, lepiej, łatwiej. W zdarzeniu - odsyłając do tutków na twierdzy .ziomalek - Wto 04 Maj, 2010 18:09 a jak zrobić aby automatycznie wstawialo coś do scene_map
P.S.
Każdy skrypt jest tak zrobiony...(chyba)Sabikku - Wto 04 Maj, 2010 18:28 Można to zaliasowac. I pokaż, o jaki skrypt ci chodzi, bo i tak każdy działa na tej zasadzie co napisałem.
Kod:
alias nowa_nazwa stara_nazwa
def stara_nazwa
kod przed funkcją
nowa_nazwa
kod po funkcji
end
W ten sposób zaliasuj w Scene_Map main, dodając przed wywołaniem utworzenie obrazka, a po wywołaniu jego usuwanie, + alias na update odświeżający obrazek przed wywołaniem normalnego update.
Obrazek można stworzyć na dwa sposoby, jako niewidzialne okienko wypełnione obrazkiem (przed aliasowaniem przydałoby się zdefiniować podklasę klasy Window_Base na wzór Window_Gold, Window_Steps itp), lub zwykły obiekt klasy Sprite (niepotrzebna podklasa właściwie).
Namawiam dalej. Zrób to na najnormalniejszych zdarzeniach :).ziomalek - Wto 04 Maj, 2010 18:36 dzięki
P.S.
Możesz dokładnie (i pokolei) wszystko opisać???
P.S.2
Jestem w tym zielonyFlanagan - Sob 22 Maj, 2010 11:30 wyskakuje mi błąd a chcem użyć zmiennej błąd jest następującej treści:
?????'Window_okno'? 14 ??? NoMethodError?????
undefined method ' [] ' for nil:NilClass
A skrypt wygląda tak:
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, "$game_variables[1]", 1)
end
if $game_variables[0001] == 10*
self.contents.draw_text (x, y, width, height, "Dobry", 1)
else
self.contents.draw_text (x, y, width, height, "Neutralny", 1)
end
end
Prosze o pomoc!!!! bo chcem napisać ten skrypt do mojego projektu Sabikku - Sob 22 Maj, 2010 11:58 Wystarczy, że porobisz sobie wcięcia:
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, "$game_variables[1]", 1)
end
if $game_variables[0001] == 10*
self.contents.draw_text (x, y, width, height, "Dobry", 1)
else
self.contents.draw_text (x, y, width, height, "Neutralny", 1)
end
end
Jak widać, rysowanie napisu 'dobry' / 'neutralny' wyszło ci poza metodę refresh. Przesuń więc cały warunek wyżej, w ten sposób:
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, "$game_variables[1]", 1)
if $game_variables[0001] == 10*
self.contents.draw_text (x, y, width, height, "Dobry", 1)
else
self.contents.draw_text (x, y, width, height, "Neutralny", 1)
end
end
end
Flanagan - Sob 22 Maj, 2010 12:09 A jak zrobić by zależnie od zmiennej wyświetlał się text co trzeba wpisać??pw115 - Sob 22 Maj, 2010 12:26
Kod:
if $game_variables[0001] == 10
self.contents.draw_text (x, y, width, height, "Dobry", 1)
end
Ten warunek znaczy że jeśli zmienna 1 wynosi 10 to się pokaże tekstFlanagan - Sob 22 Maj, 2010 13:39 Czy trzeba coś zmienić w main?? Bo wyskakuje mi następujący błąd:
????? 'Main' ? 20 ??? NoMethodError ??????
undefined method 'main' for #<Window_okno:0x46fd170>
Prosze o pomoc i jeszcze jedno jak ma wyglądać linijka:
self.contents.draw_text(0, 0, 288, 32, "$game_variables[0001]", 1)
bo mi tekst nachodzi na tekst prosze także tu o pomoc i gdy skończe skrypt umieszcze na tym forum pw115 - Sob 22 Maj, 2010 13:56 1. Musiałeś coś źle napisałeś w klasie def main w swoim oknie.
2.Żeby tekst nie nachodził musisz go odpowiednio ustawić (x i y)Flanagan - Sob 22 Maj, 2010 14:08 Jeszcze jedno pytanie czemu wyświetla mi się to:
$game_variables[0001]- Kod do wyświetlania zmiennej
linijka wygląda tak:
self.contents.draw_text(50, 50, 278, 32, "$game_variables[0001]", 1)Sabikku - Sob 22 Maj, 2010 16:39 Nie nie, $game_variables[1] to zmienna typu liczbowego. Ty potrzebujesz łańcucha znaków, napisu, czyli stringa. Żeby to przekonwertować używa się dopisku .to_s :) - czyli 'to string', tj. 'na napis'.
erienus - Wto 25 Maj, 2010 19:49 time mógłbyś dodać jak zrobić okno wywoływane przyciskiem ;ppw115 - Wto 25 Maj, 2010 21:01 Poczytaj posty Ayene na pierwszej stronie; wyjaśniła tam wszystkoradek02 - Nie 20 Cze, 2010 09:16 i tak dla mnie to ciemna magia . Mój pierwszy skrypt :
Spoiler:
Kod:
#Skrypt by Radek02
#Zastosowanie : żadne
#Używając go , umieśc mnie w credtisach
erienus - Sob 03 Lip, 2010 16:15 radek ruby moze poza htmlem jest najprostszym jezykiem programowania ;d co nie zmienia faktu, ze trzeba pracy by sie tego nauczyccj2 - Sro 07 Lip, 2010 18:27 radek02 taki skrypt to ja też już napisałemsitax5 - Sro 21 Lip, 2010 09:52
Melvin napisał/a:
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 pod którą linijką wkleić ten kod?
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ą...?
shiwt - Sro 21 Lip, 2010 20:04 Zauważyłem to już wcześniej i bardzo mnie irytuje to, że zgarniasz nagrody, pochwały i ludzie piszą, że to dzięki tobie stworzyli swoje pierwsze okienko w rgss, bo każdy myśli że to ty napisałeś ten tutorial i jesteś fajny, a prawda jest taka, że ten tutorial napisał arev 3 lata temu >>>KLICK<<<. Ty po prostu skopiowałeś, wkleiłeś, troszeczkę prze-edytowałeś. Mogłeś napisać że Arev napisał ten tutorial i jemu dziękujcie.
Tak samo wszystko co jest w temacie "Przydatne zmienne globalne/komendy "draw"" - przekopiowałeś słowo w słowo z tutoriala, który napisał Dan 1,5 roku temu nawet o nim nie wspominając. >>>KLICK<<< - gdzieś w połowie to wszystko opisał.
To na tyle :)))radek02 - Wto 03 Sie, 2010 18:08 Time , wtopa .... to gratuluję Gatozowi za wyjawienie prawdy . Na forum ostatnio ogólnie zaczyna byc dziwnie ...Fushigi - Pon 20 Wrz, 2010 14:46 Mam problem, robię tak jak trzeba i ZONK! Wyskakuje syntaxerror line: 2...Sabikku - Pon 20 Wrz, 2010 14:50 Pokaż, co masz w pierwszej i drugiej linijce skryptu.Fushigi - Pon 20 Wrz, 2010 14:54
Kod:
class Window_okno < Window Base
def initialize(50,50,220,240)
Sabikku - Pon 20 Wrz, 2010 15:01 Identyfikator klasy nie może zawierać spacji ani znaków specjalnych, właśnie tu się pomyliłeś. Zamień:
Kod:
Window Base
na poprawne:
Kod:
Window_Base
Pamiętaj, w programowaniu każda literówka będzie powodować błędy :).Fushigi - Pon 20 Wrz, 2010 15:55 Dalej jest to samo... ;/CreeperCrisis - Pon 20 Wrz, 2010 16:02 Hejka nie zawsze gdy jest problem w linijce nie trzeba jej poprawiać może coś się stało z dalszą częścią skryptu. Pokaż nam cały skrypt. ^^Fushigi - Pon 20 Wrz, 2010 16:03 Zrobiłem (chyba) wszystko jak w tym poradniku jest
Kod:
class Window_okno < Window_Base
def initialize(0,0,150,150)
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
self.windowskin = RPG::Cache.windowskin("PaperFantasy4.png")
refresh
end
end
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
Widzisz różnicę? Przecież masz jak krowie na rowie, gdzie brakuje a gdzie nadmiar endów. :)David - Wto 28 Wrz, 2010 13:45 Temat postu: Błąd
songoxyz napisał/a:
Czy trzeba coś zmienić w main?? Bo wyskakuje mi następujący błąd:
????? 'Main' ? 20 ??? NoMethodError ??????
undefined method 'main' for #<Window_okno:0x46fd170>
Mi to samo. Nie wiem co z tym zrobić:
Spoiler:
Kod:
#==============================================================================
# ■ Main
#------------------------------------------------------------------------------
#  各クラスの定義が終わった後、ここから実際の処理が始まります。
#==============================================================================
begin
# This variable determines the default font type
$defaultfonttype = "Times New Roman"
# This variable determines the default font size
$defaultfontsize = 26
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, "tekst", 1)
end
end
maciek1520 - Sro 22 Gru, 2010 23:26
Cytat:
Schodzimy trochę niżej do linijki 36?
Widzimy:
Kod:
@spriteset.dispose
@message_window.dispose
Piszemy:
Kod:
@okienko.dispose
gdzie piszemy to @okienko.dispose ??
nad czy pod prosze o odp w pwSabikku - Czw 23 Gru, 2010 01:52 Bez różnicy, kolejność nie ma najmniejszego znaczenia.maciek1520 - Czw 23 Gru, 2010 12:17 ok dzieki jakos to rozwiazalem sam
a bledem bylo to ze na tej linicjce
Cytat:
@okienko = Window_okno.new
miialem zamiast okienko to okienka. wiec przepraszam za klopotPagding - Czw 23 Gru, 2010 15:54 Okno nie schodzi mi z mapy, mimo tego, że wszystko dobrze spisałem
Może wy znajdziecie mój błąd.Sabikku - Czw 23 Gru, 2010 16:12 Tutaj błędu nie ma, musiałbyś pokazać cały kod bro.Pagding - Czw 23 Gru, 2010 18:57 Oto kod:
Cytat:
class Window_okno < Window_Base
def initialize(x = 160, y = 200, width = 220, height =240)
super(x, y, width, height)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = ("Arial")
self.contents.font.size = 18
self.back_opacity = 150
refresh
end
def refresh
self.contents.clear
self.contents.draw_text(0, 0, 288, 32, "Zakazana jaskinia", 0)
end
end
Sabikku - Czw 23 Gru, 2010 23:00 Tutaj też nie ma żadnego błędu ~~. Miałem na myśli kod Scene_Map.Lukortech - Sob 05 Lut, 2011 13:02 5/6 - bo się napracowałeś.
Ale pewnie się przyda. Już zapisuję stronę jako by móc offline'owo oglądać twe wypociny.shiwt - Sob 05 Lut, 2011 14:46
Lukortech napisał/a:
5/6 - bo się napracowałeś.
Ale pewnie się przyda. Już zapisuję stronę jako by móc offline'owo oglądać twe wypociny.
On tego nie napisał, tylko skopiował z innej strony.Mikołaj - Sob 19 Lut, 2011 11:00 Ja nierozumiem tego. Ratti - Sob 19 Lut, 2011 11:39 Jakbyś przeanalizował logicznie tą stronę:
http://pl.wikibooks.org/wiki/Ruby
By wykorzystać ją w rpgmakerze to na pewno zrozumiesz
Pozdrawiam Mikołaj - Sro 02 Mar, 2011 14:42 Czytałem ją już.I dalej nie rozumię Shlizer - Czw 03 Mar, 2011 00:53 Jak nie 'rozumię' to niech nauczy się polskiego to 'zrozumię' =)
co prawda w C++ oraz trochę WinApi, ale z pierwszych lekcji może zajarzysz czym jest programowanie: http://xion.org.pl/produc...g/megatutorial/ wg. mnie Xion napisał póki co najlepszy kurs programowania jaki dotychczas widziały moje oczy, jeśli go nie zrozumiesz to pozostaje Ci błagać o nauczenie Cię programowania nauczyciela informatyki.. choć w Polsce to brzmi bardziej jak żart niestety.. =/Mikołaj - Czw 03 Mar, 2011 14:44 Mój nauczyciel też nie umię. Shlizer - Pią 04 Mar, 2011 01:19 Bo Twój nauczyciel prawie na pewno nie jest informatykiem, a nauczycielem innej dziedziny, który zrobił sobie miesięczny kurs obsługi komputera (jak włączyć, do czego jest mysz i jak formatować tekst w Wordzie), dzięki czemu może nauczać informatyki.. ciekawe czy informatyk po miesięcznym kursie biologii mógłby uczyć tego przedmiotu w szkole? =/Dżoj - Sro 16 Mar, 2011 17:51 pw115 czekam na poradnik o CMS'iesieczken - Pią 06 Maj, 2011 07:58 Dzięki tutorial przydał się w 100%Avara - Sob 16 Lip, 2011 13:28 Zrobiłam pojawiające się okienko wyboru w klasie Scene. Co muszę zrobić, aby gra się zatrzymała, podczas jego wyświetlania? Oczywiście okienko wyboru musi pozostać aktywne.Sabikku - Sob 16 Lip, 2011 14:24 Rmvx? I pisząc 'gra' masz na myśli mapę?
Jeśli tak, wystarczy przestać aktualizować (update'ować) pozostałe elementy z metody Scene_Map::update. Np. tak:
Kod:
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
@okno_wyboru.update
if not @okno_wyboru.active
$game_map.interpreter.update # Update interpreter
$game_map.update # Update map
$game_player.update # Update player
$game_system.update # Update timer
@spriteset.update # Update sprite set
@message_window.update # Update message window
unless $game_message.visible # Unless displaying a message
update_transfer_player
update_encounter
update_call_menu
update_call_debug
update_scene_change
end
end
end
Dzięki czemu tak długo, jak okno wyboru jest aktywne, wszystkie pozostałe elementy (mapa, gracz, zdarzenia) pozostają zatrzymane.Avara - Sob 16 Lip, 2011 22:21 Nic się nie zmieniło. Nawet błędu nie było. Jakbym tego w ogóle nie wkleiła. Oczywiście dostosowałam go i umieściłam pomiędzy def i end itd... ten sposób nie działa. Tylko Graphics.freeze (sama kombinuję co z tym zrobić) zadziałało ale wtedy nawet to okno wyboru jest nieaktywne. Proszę o inne pomysły. Sama też szukam rozwiązania.Sabikku - Sob 16 Lip, 2011 22:52 Powyższy kod działa, jeśli wrzucisz go zamiast def update ... end w klasie Scene_Map, pod warunkiem, że twoje okno wyboru jest aktywne - czyli jego zmienna active wynosi true.
Wszystko zależy od tego, jak zrobione masz okienko i bez kodu trudno tu cokolwiek doradzić. Najlepiej wrzuć całe Scene_Map, albo np. podeślij mi na pw, to spróbuję pomóc.Avara - Sob 16 Lip, 2011 23:05 Ha! Udało mi się!!!
alias o_terminate terminate
def terminate
@okienko_wyboru.dispose
o_terminate
end
alias o_update update
def update
@okienko_wyboru.update
if Input.trigger?(Input::C) and @okienko_wyboru.active
case @okienko_wyboru.index
when 0:
@okienko = Window_okno.new
$game_switches[1] = true
when 1:
$game_variables[5] = 3
$game_variables[6] = 7
when 2:
$game_variables[5] = $game_variables[6]
end
end
if Input.trigger?(Input::F5)
if @okienko_wyboru.active == false
@okienko_wyboru.visible = true
@okienko_wyboru.active = true
$game_temp.background_bitmap.dispose
$game_temp.background_bitmap = Graphics.snap_to_bitmap
$game_temp.background_bitmap.blur
@menuback_sprite = Sprite.new
@menuback_sprite.bitmap = $game_temp.background_bitmap
@menuback_sprite.color.set(16, 16, 16, 128)
update_menu_background
else
@okienko_wyboru.visible = false
@okienko_wyboru.active = false
end
end
o_update
end
def update_menu_background
end
end
Okienko przy pierwszej opcji wyświetla tylko wartość zmiennej nr 5. Jest w osobnym skrypcie.
Teraz tylko muszę odkryć, jak się "odświeża" obraz.
Edit: hmm.. nie do końca. Wszystko pod tłem się porusza, choć tego nie widać. A "odświeżyć" obraz już umiem.
Ma ktoś jakieś pomysły?Sabikku - Sob 16 Lip, 2011 23:30 W tym miejscu...
Kod:
o_update
...wywoływana jest 'stara' definicja update, która aktualizuje wszystkie obiekty - mapę, interpreter (zdarzenia), gracza itd.
Ogólnie nie obraź się, ale za dużo kombinujesz, zamiast robić takie rzeczy lepiej stworzyć osobną scenę (która będzie się odpalać po naciśnięciu F5). Pieprzenie się z takimi rzeczami bezpośrednio na Scene_Map to katorga, jak widzisz powyżej - bardzo trudno uniknąć błędów (np. naciśnij dwa razy F5).
Tak czy siak, jeśli ci to pomoże: żeby zablokować aktualizowanie mapy, zamień:
Kod:
o_update
na:
Kod:
if not @okienko_wyboru.active
o_update
end
Avara - Nie 17 Lip, 2011 00:11 Teraz działa bezbłędnie. Nie obrażam się. Dopiero dziś zaczęłam się uczyć robić okienko z jakąkolwiek treścią. Wcześniej próbowałam nauczyć się robić skrypty, ale w ogóle mi to nie wychodziło. Dopiero dziś mi zaczęło wychodzić.
Próbowałam przerobić to przerobić na osobną scenę, ale nie działa. Korzystałam z kilku różnych poradników, gotowych skryptów i szukałam w podstawowych skryptach programu rozwiązań problemów. Przykro mi, że Cię rozczarowałam i dzięki serdeczne za pomoc Sabikku - Nie 17 Lip, 2011 00:17 Oj, wskazałem tylko (imo) lepsze rozwiązanie, nie musisz wiedzieć wszystkiego i na pewno nikogo nie rozczarowałaś - dobrze ci idzie . Powodzenia.Avara - Nie 17 Lip, 2011 00:25 Oto ostateczna wersja próbnego okienka gdzie wszystko działa bez zarzutu. Można okienko ze zmienną wyłączyć przed powrotem do gry i ładnie się samo odświeża :)
alias o_terminate terminate
def terminate
@okienko_wyboru.dispose
o_terminate
end
alias o_update update
def update
@okienko_wyboru.update
if Input.trigger?(Input::C) and @okienko_wyboru.active
case @okienko_wyboru.index
when 0:
@okienko = Window_okno.new
$game_switches[1] = true
when 1:
$game_variables[5] = 3
$game_variables[6] = 7
@okienko.refresh
when 2:
$game_variables[5] = $game_variables[6]
@okienko.refresh
end
end
if Input.trigger?(Input::F5)
if @okienko_wyboru.active == false
@okienko_wyboru.visible = true
@okienko_wyboru.active = true
$game_temp.background_bitmap.dispose
$game_temp.background_bitmap = Graphics.snap_to_bitmap
$game_temp.background_bitmap.blur
@menuback_sprite = Sprite.new
@menuback_sprite.bitmap = $game_temp.background_bitmap
@menuback_sprite.color.set(16, 16, 16, 128)
else
@okienko_wyboru.visible = false
@okienko_wyboru.active = false
$scene = Scene_Map.new
end
end
if Input.trigger?(Input::F6)
if @okienko.visible == true
@okienko.visible = false
end
end
if not @okienko_wyboru.active
o_update
end
end
end
Jak na pierwszy dzień to chyba nieźle mi poszło :)Avara - Nie 17 Lip, 2011 13:32 Piszę nowy post, bo inaczej nikt nie zauważy mojego pytania:
Jak w prosty sposób można zrobić tak, by samo zaznaczenie opcji dawało jakiś efekt bez potwierdzania enterem?Sabikku - Nie 17 Lip, 2011 13:47 Nie napisałaś, czy efekt ma się wykonywać raz (przy zmianie opcji klawiszem kierunku), czy wielokrotnie (tak długo, jak wybrana jest dana opcja). Wielokrotnie jest łatwo, np. wrzuć pod def update to co poniżej:
Kod:
if @okienko_wyboru.index == 0
# Co ma się dziać, jeśli zaznaczona jest pierwsza opcja.
elsif @okienko_wyboru.index == 1
# Co ma się dziać, jeśli zaznaczona jest druga opcja.
elsif @okienko_wyboru.index == 2
# Co ma się dziać, jeśli zaznaczona jest trzecia opcja.
end
Avara - Nie 17 Lip, 2011 20:01 Bardzo Ci dziękuję. O to mi właśnie chodziło. Jeszcze raz thx Avara - Nie 31 Lip, 2011 11:58 Szukałam sposobu, aby w oknie można było wyświetlić tekst w kolorze wybranym z windowskin, ale nie znalazłam, go nigdzie na forum, ani w necie. Udało mi się jednak samej dojść do tego, jak to zrobić (szukając w podstawowych skryptach maker'a vx).
W klasie naszego okna dodajemy definicję:
Kod:
def text_color(n)
x = 64 + (n % 8) * 8
y = 96 + (n / 8) * 8
return windowskin.get_pixel(x, y)
end
a w definicji reflesh:
Kod:
self.contents.font.color = text_color(15)
Zamiast 15 może być dowolna liczba od 0 do 31 (tyle ile jest kolorów w windowskin).
Każda linijka wstawiona po tym kodzie będzie miała wybrany przez nas kolor. Jeśli chcemy mieć z powrotem kolor podstawowy, to po wybranych przez nas linijkach tekstu wklejamy
Kod:
self.contents.font.color = text_color(0)
Mam nadzieję, że wszystko jest zrozumiałe i że może się to komuś przyda
Kod wzięty z Window_Base Avara - Wto 12 Cze, 2012 11:13 W jaki sposób zwęzić zaznaczenie w danym Window_Selectable? Mam w tym oknie mniejszą czcionkę i chciałabym zwęzić zaznaczenie.Ayene - Sro 13 Cze, 2012 07:44 W RMVX za szerokość zaznaczenia w Window_Selectable odpowiada definicja 'item_rect(index)'. Wystarczy w niej edytować linijkę: