flang3r - Pon 02 Sty, 2012 17:51 Temat postu: Victory screenWitam.
Mam prośbę do skrypterów. Potrzebuję tzw victory screen (coś jak z final fantasy).
Co powinien zawierać? W zasadzie podstawy:)
- avatar i nazwę bohatera (paski hp i mp niekoniecznie) Ułożenie bohaterów podobnie jak w screenie opcji, czyli w pionie.
- pasek exp - miło by było gdyby był image based, czyli że wrzucam swoją grafikę, w ostateczności defaultowy gauge z vx
- informację o aktualnym poziomie
- dodatkowo jeśli jest wykonalne to miłoby było gdyby pokazywał otrzymane przedmioty wraz z ikonką przedmiotu.Ayene - Pon 02 Sty, 2012 17:54 Jak mniej więcej ma wyglądać? Skoro z FF...
http://images.wikia.com/f...esults_ffix.png http://images.wikia.com/f...ults_ffviii.png http://images.wikia.com/f...sults_ffvii.pngflang3r - Pon 02 Sty, 2012 18:03 Ten z 7 (ostatni) najlepszy byłby. Najtrudniej chyba będzie te paski image based zaimplementować.Ayene - Pon 02 Sty, 2012 23:36 Nie dało rady tak ułożyć okienek, bo nie byłoby miejsca na otrzymane przedmioty. Zrobiłam tak, ale w razie czego można poprawić.
Wrzuć to tymczasowo do Pictures (jako 'hp_mp_bar'). W razie jak będziesz miał inną grafikę to się później jakoś dopasuje.
def wait_for_result
close = false
loop do
update_basic
if Input.trigger?(Input::C)
close = true
end
if close
@battle_result.opacity -= 10
@battle_result.contents_opacity -= 10
@item_result.opacity -= 10
@item_result.contents_opacity -= 10
end
break if @battle_result.opacity == 0
end
end
end
class Window_Battle_Result < Window_Base
include Ayene
def initialize(exp, level_up)
super(0, 0, 544, 224 + WLH)
@exp = exp
@level_up = level_up
refresh
end
def refresh
self.contents.clear
@item_max = $game_party.members.size
for actor in $game_party.members
draw_actor_face(actor, actor.index % 2 * 260, actor.index / 2 * 96 + WLH / 2, 92)
x = 114 + actor.index % 2 * 260
y = 10 + actor.index / 2 * 96 + WLH / 2
draw_actor_name(actor, x, y)
draw_actor_level(actor, x, y + WLH * 1)
draw_actor_graphic_exp(actor, x, 10 + y + WLH * 2)
if @level_up.include?(actor)
draw_icon(LEVEL_UP_ICON, 100 + x, y + WLH)
end
end
end
class Window_Result_Item < Window_Base
include Ayene
def initialize(gold, items, exp, skills)
super(0, 248, 544, 144 + WLH)
@items = items
@gold = gold
@exp = exp
@skills = skills
refresh
end
def refresh
self.contents.clear
@skills.each_with_index {|tab, i|
actor = tab[1]
skill = tab[0]
text = sprintf("%s poznał - %s", actor.name, skill.name)
self.contents.draw_text(250, i * WLH, self.width, WLH, text)
break if i == 4
}
self.contents.draw_text(0, 0, self.width, WLH, DROP_TEXT)
draw_icon(EXP_ICON, 26, WLH)
self.contents.draw_text(50, WLH, self.width, WLH, @exp.to_s)
draw_icon(GOLD_ICON, 26, WLH * 2)
self.contents.draw_text(50, WLH * 2, self.width, WLH, @gold.to_s)
for i in 0...@items.size
draw_item_name(@items[i], 26, WLH * 3 + i * WLH)
end
end
end
class Game_Actor < Game_Battler
def gained_exp(current_level, current_exp)
return (current_exp - @exp_list[current_level])
end
def needed_exp(current_level)
return (@exp_list[current_level + 1] - @exp_list[current_level])
end
end
flang3r - Wto 03 Sty, 2012 01:04 Aye, póki co nie chciało mi zadziałać. Coś mi się stało z projektem że nie potrafi importowanych grafik ani dżwięków znaleść. Zawsze coś zgubi. Nie wiem ock.
edit:
problem rozwiązany, nie wiem co było przyczyną, już się wszystko naprawiło. Jutro potestuję własne grafiki, fajnie byłoby jakbym te obrazki mógł wrzucać do foldeu graphics/system, bo wszystkie obrazkowe modyfikacje umieściłem tam, także byłoby mi po prostu wygodniej;)
Ale screen jak najbardziej mi się podoba:)Ayene - Wto 03 Sty, 2012 08:03 Wystarczy, że zamienisz fragment:
Kod:
bitmap = Cache.picture("hp_mp_bar")
na:
Kod:
bitmap = Cache.system("hp_mp_bar")
W razie problemów, daj znać flang3r - Wto 03 Sty, 2012 16:48
Cytat:
Wystarczy, że zamienisz fragment:
Kod:
bitmap = Cache.picture("hp_mp_bar")
na:
Kod:
bitmap = Cache.system("hp_mp_bar")
W razie problemów, daj znać
Tak się właśnie domyślałem, że to ta linijka, ale wolałem niczego nie ruszać na ślepo;) A dałoby radę, żeby ten pasek nie był statyczny tylko dynamiczny, tzn że nabija zdobyte doświadczenie na tym screenie?? Coś jak w ff??
Ja posprawdzam z innych victory screenów linijki i może sobie z tym jakoś poradzę, ale jeśli byłabyś w stanie mnie chociaż nakierować jak to zrobić to będę wdzięczny;)Ayene - Wto 03 Sty, 2012 20:40 Sprawdź teraz:
def wait_for_result
close = false
loop do
update_basic
@battle_result.update
break if @battle_result.stop
end
loop do
update_basic
if Input.trigger?(Input::C)
close = true
end
if close
@battle_result.opacity -= 10
@battle_result.contents_opacity -= 10
@item_result.opacity -= 10
@item_result.contents_opacity -= 10
end
break if @battle_result.opacity == 0
end
end
end
class Window_Battle_Result < Window_Base
attr_accessor :stop
include Ayene
def initialize(exp, level_up)
super(0, 0, 544, 224 + WLH)
@exp = exp
@level_up = level_up
@rate = {}
@max = []
for actor in $game_party.members
lv = actor.level - @level_up[actor]
s1 = actor.gained_exp(lv, actor.exp - @exp)
s2 = actor.needed_exp(lv)
gw = [s1 * WIDTH / s2, WIDTH].min
@rate[actor] = gw
end
@stop = false
refresh
end
def refresh
self.contents.clear
for actor in $game_party.members
draw_actor_face(actor, actor.index % 2 * 260, actor.index / 2 * 96 + WLH / 2, 92)
x = 114 + actor.index % 2 * 260
y = 10 + actor.index / 2 * 96 + WLH / 2
draw_actor_name(actor, x, y)
draw_actor_level(actor, x, y + WLH * 1)
draw_actor_graphic_exp(actor, x, 10 + y + WLH * 2)
end
end
def update_bars
for actor in $game_party.members
x = 114 + actor.index % 2 * 260
y = 10 + actor.index / 2 * 96 + WLH / 2
draw_actor_graphic_exp(actor, x, 10 + y + WLH * 2)
end
end
def draw_actor_graphic_exp(actor, x, y, width = WIDTH)
bitmap = Cache.system("hp_mp_bar")
src_rect = Rect.new(0, 0, bitmap.width, bitmap.height)
self.contents.blt(x, y, bitmap, src_rect)
s1 = actor.gained_exp(actor.level, actor.exp)
s2 = actor.needed_exp(actor.level)
gw = [s1 * WIDTH / s2, WIDTH].min
gc1 = Color.new(38,101,131)
gc2 = Color.new(45,121,157)
@max.push(gw)
if @level_up[actor] > 0
w = [@rate[actor], width].min
if @rate[actor] == width
@level_up[actor] -= 1
@rate[actor] = 0
draw_icon(LEVEL_UP_ICON, 100 + x, y - WLH * 2)
self.contents.clear_rect(x, y - WLH * 1 - 10, 64, WLH)
draw_actor_level(actor, x, y - WLH * 1 - 10)
end
else
w = [@rate[actor], gw].min
if @rate[actor] == @max.max
@stop = true
end
end
self.contents.gradient_fill_rect(x+8, y+3, w, 6, gc1, gc2)
bitmap.dispose
end
def draw_actor_level(actor, x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y, 32, WLH, Vocab::level_a)
self.contents.font.color = normal_color
self.contents.draw_text(x + 32, y, 24, WLH, actor.level - @level_up[actor], 2)
end
def update
for actor in $game_party.members
@rate[actor] += 1
end
update_bars
end
end
class Window_Result_Item < Window_Base
include Ayene
def initialize(gold, items, exp, skills)
super(0, 248, 544, 144 + WLH)
@items = items
@gold = gold
@exp = exp
@skills = skills
refresh
end
def refresh
self.contents.clear
@skills.each_with_index {|tab, i|
actor = tab[1]
skill = tab[0]
text = sprintf("%s poznał - %s", actor.name, skill.name)
self.contents.draw_text(230, i * WLH, self.width, WLH, text)
break if i == 4
}
self.contents.draw_text(0, 0, self.width, WLH, DROP_TEXT)
draw_icon(EXP_ICON, 26, WLH)
self.contents.draw_text(50, WLH, self.width, WLH, @exp.to_s)
draw_icon(GOLD_ICON, 26, WLH * 2)
self.contents.draw_text(50, WLH * 2, self.width, WLH, @gold.to_s)
for i in 0...@items.size
draw_item_name(@items[i], 26, WLH * 3 + i * WLH)
end
end
end
class Game_Actor < Game_Battler
def gained_exp(current_level, current_exp)
return (current_exp - @exp_list[current_level])
end
def needed_exp(current_level)
return (@exp_list[current_level + 1] - @exp_list[current_level])
end
end
Zalecane dokładne testy, bo nie wiem, czy animacja dobrze 'nabija exp' AI-RPG - Wto 03 Sty, 2012 21:03 Gratuluje skilla. Przez was chyba zdradzę 2k3 XD
To się może przydać. Mi się podoba.Rouch - Sro 04 Sty, 2012 11:17 Bajerancka animacja. mogę też tego użyć? :*
@edit
A dało by radę dać jakiś SE, gdy wchodzi poziom?Ayene - Sro 04 Sty, 2012 11:37 Nikt przecież Tobie nie zabroni Cieszę się, że przypadła do gustu.
Co do dźwięku, znajdź linijkę:
Kod:
WIDTH = 104
i dodaj po niej:
Kod:
LEVEL_UP_SE = "Decision2"
następnie znajdź:
Kod:
draw_actor_level(actor, x, y - WLH * 1 - 10)
i po niej dodaj:
Kod:
RPG::SE.new(LEVEL_UP_SE, 100, 100).play
flang3r - Sro 04 Sty, 2012 20:02 Animacja działą bardzo fajnie, zaimplementowałem sobie nawet też te dodatki dźwiękowe;)
Ale...., za drugim razem, kiedy pojawia się screen, to nie można nic zrobić. Nie wychodzi z walki. Testuję dalej...Ayene - Sro 04 Sty, 2012 20:08 A jaki masz system walki?flang3r - Sro 04 Sty, 2012 20:25 Domyślny, mam tylko paski hp i mp przeciwnika ozzmy, image based hp i burst gauge, czyli taki dodatkowy pasek ala overdrive. Może być wina tego dźwięku level up. Dzieje się tak kiedy wyskoczy mi level up.
edit:
Przeprowadziłęm kilkadziesiąt walk testowych i zjawisko występuje losowo, tzn raz na kilka odpaleń gry takie coś ma miejsce a czasem działa bez zarzutu.Ayene - Sro 04 Sty, 2012 20:35 A sprawdzałeś na czystym projekcie? Może wrzuć jakieś demko z tym problemem np. na mediafire.com. Wtedy zobaczę, co może powodować problem.flang3r - Sro 04 Sty, 2012 22:24 jutro sprawdzę wszystko na czystym projekcie. Póki co ustaliłem że dzieje się tak, kiedy na jakimś obszarze trafisz na walkę z tym samym przeciwnikiem co poprzednio. Wtedy kiedy jest level up to przycina grę...Ayene - Sro 04 Sty, 2012 22:43 A spróbuj zrobić jeszcze jedną rzecz. Znajdź fragment:
Kod:
if @rate[actor] == @max.max
i zamień go na:
Kod:
if @rate[actor] >= @max.max
flang3r - Czw 05 Sty, 2012 00:43 Problem tkwi chyba w naliczaniu EXP. Zauważyłęm jedną rzecz. Mam ustawiony level 2 na 40 exp a wroga na 20 exp. Dlatego za drugim razem się wieszało. Pasek nie zatrzymuje się tuż przy początku,tylko sobie jakoś rośnie do 1/3. Chyba to jest przyczyną. Testowałem ze zmianami doświadczenia i zmiana wartości w potworach pomogła.Ayene - Czw 05 Sty, 2012 00:52 To w takim razie nie wiem. Nie zauważyłam u siebie żadnego błędu Czyli pozostaje albo demo, albo test na czystym projekcie.flang3r - Czw 05 Sty, 2012 00:57 jutro spróbuję potestować na czystym projekcie. Demo będzie mi ciężko podesłać bez obróbki bo zajmie pareset mega:PAyene - Czw 05 Sty, 2012 00:58 Jeszcze można spróbować poprawić to:
Kod:
if @rate[actor] == width
na
Kod:
if @rate[actor] >= width
Behemoth - Pią 06 Sty, 2012 13:54 Boskie, mi działa bez problemu. Jeśli pozwolisz użyć mi tego w projekcie, będzie ekstra flang3r - Pią 06 Sty, 2012 15:38 Ayene, podziałało;)
Zmieniłem w dwóch miejscach i teraz bezproblemowo wszystko śmiga.Ayene - Pią 06 Sty, 2012 15:55 Na to wychodzi, że miałeś lagi i czasami program gubił klatki. Teraz nawet jak nie naliczy zmiennej @rate poprawnie to i tak się wyłączy, bo zwiększony został przedział z 'równego' do 'większego od'. Pozdrawiam.