UltimaForum

Skrypty [XP] - Ring Menu XP

Seivoth - Wto 08 Gru, 2009 23:00
Temat postu: Ring Menu XP
Witam!
Ring Menu to skrypt pozwalający na wyświetlenie menu w formie koła, z ikonami pojawiającym się na ekranie. Zastosowałem ten skrypt w grze "System". Lekko go zmodyfikowałem. Mam nadzieję że komuś się przyda.

Skrypt wklej nad Main
Spoiler:

Kod:
# Ring Menu XP
# Modified by SeIVoth
# www.ultimateam.pl

class Scene_Menu

def initialize(menu_index = 0)
@menu_index = menu_index
$location_text=[]
$gold_text=[]
$window_size=[]
$ring_menu_text=[]
$chara_select=[]
@window_opacity=[]
@chara_select=[]
@window_position=[]
$location_text[0]="Comic Sans MS" # Font Type
$location_text[1]=24 # Font Size
$location_text[2]=0 # Location Title Color
$location_text[4]=0 # Map Name Color
$location_text[3]="Lokacja:" # Text
$gold_text[0]="Comic Sans MS" # Font Type
$gold_text[1]=24 # Font Size
$gold_text[2]=0 # Gold Title Color
$gold_text[6]=0 # Gold Color
$gold_text[4]="Złoto:" # Text
@window_opacity[0]=255 # Border Opacity
@window_opacity[1]=130 # Background Opacity
$window_location_skin="001-Blue01" # Location Windowskin
$window_gold_skin="001-Blue01" # Gold Windowskin
@window_position[0]=0 # X Axis Position
@window_position[1]=0 # Location Y Axis Position
@window_position[2]=384 # Gold Y Axis Position
$window_size[0]=160 # Length
$window_size[1]=96 # Height
$ring_menu_text[0]="Comic Sans MS" # Font Type
$ring_menu_text[7]=0 # Font Color
$ring_menu_text[8]=24 # Font Size
$ring_menu_text[1]="Przedmioty"
$ring_menu_text[2]="Czary"
$ring_menu_text[3]="Ekwipunek"
$ring_menu_text[4]="Stan"
$ring_menu_text[5]="Zapisz grę"
$ring_menu_text[6]="Wyjdź z gry"
@chara_select[0]=408 # X Axis Position
@chara_select[1]=0 # Y Axis Position
$chara_select[0]="Comic Sans MS" # Font Type
$chara_select[1]=0 # Font Color
$chara_select[5]=24 # Font Size
$chara_select[2]=255 # Border Opacity
$chara_select[3]=130 # Background Opacity
$chara_select[4]="001-Blue01" # Windowskin
end

def main
@window_location = Window_Location.new
@window_location.x = @window_position[0]
@window_location.y = @window_position[1]
@window_location.opacity = @window_opacity[0]
@window_location.back_opacity = @window_opacity[1]
@window_gold = Window_MenuGold.new
@window_gold.x = @window_position[0]
@window_gold.y = @window_position[2]
@window_gold.opacity = @window_opacity[0]
@window_gold.back_opacity = @window_opacity[1]
@spriteset = Spriteset_Map.new
px = $game_player.screen_x - 15
py = $game_player.screen_y - 24
@command_window = Window_RingMenu.new(px,py)
@command_window.index = @menu_index

if $game_party.actors.size == 0
@command_window.disable_item(0)
@command_window.disable_item(1)
@command_window.disable_item(2)
@command_window.disable_item(3)
end
@command_window.z = 100

if $game_system.save_disabled
@command_window.disable_item(4)
end

@status_window = Window_RingMenuStatus.new
@status_window.x = @chara_select[0]
@status_window.y = @chara_select[1]
@status_window.z = 200
@status_window.opacity=$chara_select[2]
@status_window.back_opacity=$chara_select[3]
@status_window.visible = false
Graphics.transition
loop do
Graphics.update
Input.update
update

if $scene != self
break
end
end

Graphics.freeze
@spriteset.dispose
@window_location.dispose
@window_gold.dispose
@command_window.dispose
@status_window.dispose
end

def update
@window_location.update
@window_gold.update
@command_window.update
@status_window.update

if @command_window.active
update_command
return
end

if @status_window.active
update_status
return
end
end

def update_command
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
return
end

if Input.trigger?(Input::C)
if $game_party.actors.size == 0 and @command_window.index < 4
$game_system.se_play($data_system.buzzer_se)
return
end

case @command_window.index
when 0
$game_system.se_play($data_system.decision_se)
$scene = Scene_Item.new
when 1
$game_system.se_play($data_system.decision_se)
@command_window.active = false
@status_window.active = true
@status_window.visible = true
@status_window.index = 0
when 2
$game_system.se_play($data_system.decision_se)
@command_window.active = false
@status_window.active = true
@status_window.visible = true
@status_window.index = 0
when 3
$game_system.se_play($data_system.decision_se)
@command_window.active = false
@status_window.active = true
@status_window.visible = true
@status_window.index = 0
when 4
if $game_system.save_disabled
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
$scene = Scene_Save.new
when 5
$game_system.se_play($data_system.decision_se)
$scene = Scene_End.new
end
return
end
return if @command_window.animation?
if Input.press?(Input::UP) or  Input.press?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
@command_window.setup_move_move(Window_RingMenu::MODE_MOVEL)
return
end
if Input.press?(Input::DOWN) or  Input.press?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
@command_window.setup_move_move(Window_RingMenu::MODE_MOVER)
return
end
end

def update_status

if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
@command_window.active = true
@status_window.active = false
@status_window.visible = false
@status_window.index = -1
return
end
if Input.trigger?(Input::C)
case @command_window.index

when 1
if $game_party.actors[@status_window.index].restriction >= 2
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
$scene = Scene_Skill.new(@status_window.index)
when 2
$game_system.se_play($data_system.decision_se)
$scene = Scene_Equip.new(@status_window.index)
when 3
$game_system.se_play($data_system.decision_se)
$scene = Scene_Status.new(@status_window.index)
end
return
end
end
end

class Window_RingMenu < Window_Base
STARTUP_FRAMES = 20
MOVING_FRAMES = 5 
RING_R = 64       
ICON_ITEM   = RPG::Cache.icon("034-Item03")
ICON_SKILL  = RPG::Cache.icon("044-Skill01")
ICON_EQUIP  = RPG::Cache.icon("001-Weapon01")
ICON_STATUS = RPG::Cache.icon("050-Skill07")
ICON_SAVE   = RPG::Cache.icon("038-Item07")
ICON_EXIT   = RPG::Cache.icon("046-Skill03")
ICON_DISABLE= RPG::Cache.icon("")
SE_STARTUP = "056-Right02"
MODE_START = 1
MODE_WAIT  = 2
MODE_MOVER = 3
MODE_MOVEL = 4
attr_accessor :index

def initialize( center_x, center_y )
super(0, 0, 640, 480)
self.contents = Bitmap.new(width-32, height-32)
self.contents.font.name = $ring_menu_text[0]
self.contents.font.color = text_color($ring_menu_text[7])
self.contents.font.size = $ring_menu_text[8]
self.opacity = 0
self.back_opacity = 0
s1 = $ring_menu_text[1]
s2 = $ring_menu_text[2]
s3 = $ring_menu_text[3]
s4 = $ring_menu_text[4]
s5 = $ring_menu_text[5]
s6 = $ring_menu_text[6]
@commands = [ s1, s2, s3, s4, s5, s6 ]
@item_max = 6
@index = 0
@items = [ ICON_ITEM, ICON_SKILL, ICON_EQUIP, ICON_STATUS, ICON_SAVE, ICON_EXIT ]
@disabled = [ false, false, false, false, false, false ]
@cx = center_x - 16
@cy = center_y - 16
setup_move_start
refresh
end

def update
super
refresh
end

def refresh
self.contents.clear
case @mode
when MODE_START
refresh_start
when MODE_WAIT
refresh_wait
when MODE_MOVER
refresh_move(1)
when MODE_MOVEL
refresh_move(0)
end
rect = Rect.new(@cx - 272, @cy + 24, self.contents.width-32, 32)
self.contents.draw_text(rect, @commands[@index],1)
end

def refresh_start
d1 = 2.0 * Math::PI / @item_max
d2 = 1.0 * Math::PI / STARTUP_FRAMES
r = RING_R - 1.0 * RING_R * @steps / STARTUP_FRAMES
for i in 0...@item_max
j = i - @index
d = d1 * j + d2 * @steps
x = @cx + ( r * Math.sin( d ) ).to_i
y = @cy - ( r * Math.cos( d ) ).to_i
draw_item(x, y, i)
end
@steps -= 1
if @steps < 1
@mode = MODE_WAIT
end
end

def refresh_wait
d = 2.0 * Math::PI / @item_max
for i in 0...@item_max
j = i - @index
x = @cx + ( RING_R * Math.sin( d * j ) ).to_i
y = @cy - ( RING_R * Math.cos( d * j ) ).to_i
draw_item(x, y, i)
end
end

def refresh_move( mode )
d1 = 2.0 * Math::PI / @item_max
d2 = d1 / MOVING_FRAMES
d2 *= -1 if mode != 0
for i in 0...@item_max
j = i - @index
d = d1 * j + d2 * @steps
x = @cx + ( RING_R * Math.sin( d ) ).to_i
y = @cy - ( RING_R * Math.cos( d ) ).to_i
draw_item(x, y, i)
end
@steps -= 1
if @steps < 1
@mode = MODE_WAIT
end
end

def draw_item(x, y, i)
rect = Rect.new(0, 0, @items[i].width, @items[i].height)
if @index == i
self.contents.blt( x, y, @items[i], rect )
if @disabled[@index]
self.contents.blt( x, y, ICON_DISABLE, rect )
end
else
self.contents.blt( x, y, @items[i], rect, 128 )
if @disabled[@index]
self.contents.blt( x, y, ICON_DISABLE, rect, 128 )
end
end
end

def disable_item(index)
@disabled[index] = true
end

def setup_move_start
@mode = MODE_START
@steps = STARTUP_FRAMES
if  SE_STARTUP != nil and SE_STARTUP != ""
Audio.se_play("Audio/SE/" + SE_STARTUP, 80, 100)
end
end

def setup_move_move(mode)
if mode == MODE_MOVER
@index -= 1
@index = @items.size - 1 if @index < 0
elsif mode == MODE_MOVEL
@index += 1
@index = 0 if @index >= @items.size
else
return
end
@mode = mode
@steps = MOVING_FRAMES
end

def animation?
return @mode != MODE_WAIT
end
end

class Window_RingMenuStatus < Window_Selectable

def initialize
super(204, 64, 232, 352)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.size = $chara_select[5]
refresh
self.active = false
self.index = -1
end

def refresh
self.contents.clear
self.windowskin = RPG::Cache.windowskin($chara_select[4])
self.contents.font.name = $chara_select[0]
self.contents.font.color = text_color($chara_select[1])
@item_max = $game_party.actors.size
for i in 0...$game_party.actors.size
x = 80
y = 80 * i
actor = $game_party.actors[i]
draw_actor_graphic(actor, x - 60, y + 65)
draw_actor_name(actor, x, y + 2)
draw_actor_hp(actor, x - 40, y + 26)
draw_actor_sp(actor, x - 40, y + 50)
end
end

def update_cursor_rect
if @index < 0
self.cursor_rect.empty
else
self.cursor_rect.set(0, @index * 80, self.width - 32, 80)
end
end
end

class Game_Map

def name
$map_infos[@map_id]
end
end

class Scene_Title
$map_infos = load_data("Data/MapInfos.rxdata")
for key in $map_infos.keys
$map_infos[key] = $map_infos[key].name
end
end

class Window_Location < Window_Base

def initialize
super(0, 0, $window_size[0], $window_size[1])
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = $location_text[0]
self.contents.font.size = $location_text[1]
refresh
end

def refresh
self.contents.clear
self.windowskin = RPG::Cache.windowskin($window_location_skin)
self.contents.font.color = text_color($location_text[2])
self.contents.draw_text(4, 0, 120, 32, $location_text[3])
self.contents.font.color = text_color($location_text[4])
self.contents.draw_text(4, 32, 120, 32, $game_map.name, 2)
end
end

class Window_MenuGold < Window_Base

def initialize
super(0, 0, $window_size[0], $window_size[1])
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = $gold_text[0]
self.contents.font.size = $gold_text[1]
refresh
end

def refresh
self.contents.clear
self.windowskin = RPG::Cache.windowskin($window_gold_skin)
self.contents.font.color = text_color($gold_text[2])
self.contents.draw_text(4, 0, 120, 32, $gold_text[4])
self.contents.font.color = text_color($gold_text[3])
self.contents.draw_text(4, 32, 120, 32, $game_party.gold.to_s, 2)
end
end
# www.ultimateam.pl



Pozdrawiam!

Malian - Nie 17 Sty, 2010 10:03

A ja mam pytanie:
Czy da się dopasować ring menu do windowskina. W mojej grze są one zmienne.

[ Dodano: Nie 17 Sty, 2010 10:48 ]
Już znalazłem rozwiązanie w linijce 51 można zmienić Windowskin na jaki chcecie pod warunkiem że go macie w Graphics\Windowskins.

Inverse - Pon 18 Sty, 2010 16:18

Eh.. Mam zdaje się problem kombatybilnościowy tego skryptu z SBS... Mianowicie... Skrypt działa pięknie do pierwszej walki... Po tej następuje error o komunikacie :
Script 'New menu' line 329:RGSSError occured. Disposed bitmap.
Niestety linjka 329 wygląda następująco : rect = Rect.new(0, 0, @items[i].width, @items[i].height)... Nie ma tu słowa o pozycji grafiki czy czegoś w ten deseń więc nie za bardzo wiem jak to zreperować... Jakieś sugestie ?

Ayene - Pon 18 Sty, 2010 16:47

Jest pozycja grafiki - w tej linijce tworzy się nową bitmapę (Rect od rectangle, czyli prostokąt), dwa pierwsze argumenty to położenie, a dwa kolejne to wymiary. Wina musi leżeć po stronie SBS (to SideView Battle System?!). Czasami wyskakiwał mi tego typu błąd, gdy skrypt próbował stworzyć coś, co było mniejsze od standardowego 32-pikselowego formatu. Niestety nie jestem w stanie Tobie pomóc - nie wiem, jakiego SBS używasz.
Inverse - Pon 18 Sty, 2010 20:47

Tak sideview battle system... Używam tłumaczenia systemu Tankentai'a (z portugalskiego/japońskiego na angielski) (nie wiem czy to nie problem :D) Link : http://www.rpgrevolution....opic=25504&st=0 (bardzo fajny battle system... polecam...).

Nie wiem gdzie leży problem bo obydwa skrypty... osobno działają... Menu działa dopóki nie ma miejsca pierwsza walka (może problem przy umieszczaniu aktorów/resizie ikonek/etc...)

Jeśli tłumaczenia/translacje skryptów na forum coś dają/są mile widziane... To ja chętnie pare zaoferuje/zaproponuje/przetłumaczę <mały offtop przepraszam>

[ Dodano: Wto 19 Sty, 2010 11:07 ]
Zero rezultatu :< Inne sugestie ? :< Myślę ,że będzie trzeba jednak pobabrać w skrypcie :< Tylko nie mam pojęcia od czego zacząć...

Skrypty <komentarze do nich> przetłumaczone na poski ? ;P

Ayene - Wto 19 Sty, 2010 11:18

A spróbuj w skrypcie 'Ring Menu' linijkę:
Kod:
ICON_EQUIP  = RPG::Cache.icon("001-Weapon01")

zmienić na:
Kod:
ICON_EQUIP  = RPG::Cache.icon("002-Weapon02")


Co do offtopu :-) Bylibyśmy bardzo wdzięczni za wszelkie nowe materiały na forum :->

Inverse - Wto 19 Sty, 2010 11:27

Ayene jesteś genialna ;P Chodzi o ikony ;P Jak jakaś postać używa tej broni ,która jest jako domyślna ikonka w menu... To robi się crash :D Bardzo dziękuje :>
HESEE - Sob 01 Maj, 2010 11:28

Mam problem taki nie wiem od czego ale jeśli wybiore np:
czary to jest error
script 'ring menu xp' line 202 :nomethoderror occurred
undefided method 'restriction' for nil:nilclass

A jak ekwipunek to to samo ale inny komunikat jeszcze tak samo stan.
Mam podejrzenia że mi może się to kolizować z systemem myszki.

Ayene - Sob 01 Maj, 2010 11:49

A masz w ogóle kogoś w drużynie?
HESEE - Sob 01 Maj, 2010 11:50

nie
Ayene - Sob 01 Maj, 2010 11:53

No to dlatego Tobie nie działa. Ustaw chociaż jedną osobę.
HESEE - Sob 01 Maj, 2010 11:58

Dodałem do drużyny nawet 4 osoby i to samo.
Ayene - Sob 01 Maj, 2010 12:03

W takim razie masz kolizję z innym skryptem. A spróbuj usunąć fragment:
Kod:
if $game_party.actors[@status_window.index].restriction >= 2
$game_system.se_play($data_system.buzzer_se)
return
end

HESEE - Sob 01 Maj, 2010 12:12

Chyba zrezygnuje z ring menu
to samo tylko inny błąd.

Ayene - Sob 01 Maj, 2010 12:15

Jaki błąd? Masz jakiś skrypt, który zmienia menu w grze?
HESEE - Sob 01 Maj, 2010 12:38

Mam błąd script 'windows_base' line 123 :nomethoderror occurred undefided method 'name' for nil:nilclass.
A skryptu na menu żadnego nie mam bo nawet zrobiłem tak że do nowego projektu skopiowałem te skrypty i dalej jest błąd.

Ayene - Sob 01 Maj, 2010 12:41

Bo program nie może wyświetlić imienia dla pustej klasy. Najwyraźniej nie czyta Tobie, że masz w ogóle kogoś w drużynie. Jak chcesz możesz wysłać mi swój projekt na PW. Wtedy może coś zaradzę.

@edit
Problem został rozwiązany na PW :->

Shadi - Pon 12 Lip, 2010 12:22

Ja mam błąd Linijka 322 "Undefined Method width for Nil:nil class
PaKiTos - Pon 12 Lip, 2010 17:07

A jakie masz skrypty? Masz twierdzówkę i nie dodałeś pliku?
Zazombik - Czw 08 Wrz, 2011 10:19

Jakiego pliku ? A poza tym witam wszystkich :jupi:
mic2311 - Nie 11 Wrz, 2011 13:04

Dobry skrypt, może użyję w następnym projekcie.
Ayene, ile ty uczyłaś się programować w ruby i RPG Maker'ach?

RedCode12 - Czw 03 Lis, 2011 21:48

Podoba mi się ten skrypt . :D . a i Ayene fajna ta gra system . :D
MajorLechu - Pią 02 Gru, 2011 20:04

Dalibyście jakiegoś SS :D
Melvin - Pią 02 Gru, 2011 20:08

Proszę:
Spoiler:


Pepczak - Czw 01 Lis, 2012 19:30
Temat postu: inny klawisz
Czy da się coś zrobić żeby to menu nie otwierało się escapem tylko np. "i" albo innym klawiszem?
kamix928 - Pią 02 Lis, 2012 14:51

super
Kerdian - Pon 03 Gru, 2012 22:18

Mógłby ktoś miły powiedzieć mi jak sprawić, aby zamiast okna statusu pojawiało się okno rozdawania statystyk? (---> To okno <---)
ka0909 - Wto 04 Gru, 2012 17:10

No to musisz przerobić skrypt Ring Menu i zamienić aby uruchamiał:
$scene = Scene_Points.new
Jak nie umiesz to mogę ci pomóc w tym tylko zbytnio czasu nie mam.

Kerdian - Wto 04 Gru, 2012 17:13

Sam to robiłem, ale podmienianie status na points nic nie daje :P Errory mam (Angielska wersja ofkors, żeby nie było)
ka0909 - Wto 04 Gru, 2012 18:07

Trzeba bardziej przerobić. Może jak znajdę dziś czas to przerobię ale wątpię.
Avara - Nie 09 Gru, 2012 19:37



Powered by phpBB modified by Przemo © 2003 phpBB Group