UltimaForum

Wprowadzenie do RGSS/RGSS2 - Przydatne zmienne globalne/komendy "draw"

pw115 - Pią 26 Lut, 2010 17:06
Temat postu: Przydatne zmienne globalne/komendy "draw"
W poradniku "okno w Ruby" nauczyłem was jak tworzyć okna i wypełniać je tekstem
dzisiaj pokaże wam jak w oknie wyświetlić zmienną, przełącznik, złoto drużyny itd.
W linijce
Kod:
    self.contents.draw_text(0, 0, 288, 32, "Losowy tekst służący do zapełnienia okna", 1)

zamiast "losowy tekst służ.... możemy napisać:
Kod:
$game_variables[N] - pokazuje wartość zmiennej nr N.
$game_switches[N] - pokazuje wartość przełącznika nr N (True lub False)
$game_system.save_count - pokazuje ilość zapisów gry
$data_system.words.hp - pokazuje słowo 'HP' zapisane w bazie danych
$data_system.words.sp - pokazuje słowo 'SP' zapisane w bazie danych
$data_system.words.atk - pokazuje słowo "Atk" zapisane w bazie danych
$data_system.words.pdef - pokazuje słowo "Pdef" zapisane w bazie danych
$data_system.words.mdef - pokazuje słowo "Mdef" zapisane w bazie danych
$data_system.words.str - pokazuje słowo "Str" zapisane w bazie danych
$data_system.words.dex - pokazuje słowo "Dex" zapisane w bazie danych
$data_system.words.agi - pokazuje słowo "Agi" zapisane w bazie danych
$data_system.words.int - pokazuje słowo "Int" zapisane w bazie danych
$data_actors[N].final_level - ostateczny poziom postaci o numerze N
$data_actors[N].name - imię bohatera o numerze N
$data_actors[N].level - poziom postaci o numerze N
$data_actors[N].class_name - nazwa klasy bohatera o numerze N
$data_actors[N].exp_s - doświadczenie postaci o numerze N
$data_actors[N].next_exp_s - doświadczenie potrzebne do następnego poziomu dla postaci o numerze N
$data_actors[N].hp - pokazuje ilość HP postaci o numerze N
$data_actors[N].maxhp - pokazuje MaxHP postaci o numerze N
$data_actors[N].sp - pokazuje ilość HP postaci o numerze N
$data_actors[N].maxsp - pokazuje MaxSP postaci o numerze N
$data_actors[N].skills.size - ilość umiejętności jakie posiada postać o numerze N
$data_actors[N].item.size - ilość przedmiotów jakie posiada postać o numerze N
$data_actors[N].str  - ilość str postaci o numerze N
$data_actors[N].dex - ilość dex postaci o numerze N
$data_actors[N].agi - ilość agi postaci o numerze N
$data_actors[N].int - ilość int postaci o numerze N
$data_actors[N].atk - ilość atk postaci o numerze N
$data_actors[N].pdef - ilość pdef postaci o numerze N
$data_actors[N].mdef - ilość mdef postaci o numerze N
$data_actors[N].eva - ilość eva postaci o numerze N

a zamiast
self.contents.draw_text(0, 0, 288, 32, "Losowy tekst służący do zapełnienia okna", 1)
możemy napisać:
Kod:
draw_actor_graphic - pokazuje character jaki posiada postać
draw_actor_name - pokazuje imię bohatera
draw_actor_class - pokazuję klasę postaci
draw_actor_level - pokazuje level bohatera
draw_actor_state - pokazuje postaci
draw_actor_exp - pokazuje doświadczenie bohatera
draw_actor_hp - pokazuje hit points postaci
draw_actor_sp - pokazuje skill points bohatera
draw_actor_parameter (actor, x, y, type) - pokazuje parametry postaci (dla type: 0 - atak, 1 - obrona fizyczna, 2 - obrona magiczna, 3 - siła, 4 - zręczność, 5 - zwinność, 6 - inteligencja.


Dużo tego nie ? ale pomyślcie jakie to stwarza możliwości !!

Asantos - Pią 26 Lut, 2010 18:40

super nie wiedziałem że się znasz na RUBY - kiedy będę miał wolny czas to poszperam trochę i pouczę się tego wszystkiego :)
Unnamed - Pon 01 Mar, 2010 17:44

Widze ze powieliles temat... na co dwa tematy ze zmiennymi?
pw115 - Pon 01 Mar, 2010 17:57

Tak ale Ayene napisała zastosowanie zmiennych a ja wypisałem same zmienne
Czeliosss - Wto 06 Kwi, 2010 17:26

No fajne. Można tak zrobić jakiegoś Huda.
Pzdr.

SaE - Wto 27 Kwi, 2010 10:38

Jest pewna nieścisłość bo
Cytat:
$data_actors[N].hp - pokazuje ilość HP postaci o numerze N

N to nie numer postaci, tylko jej ID w bazie danych.

A tak na prawdę to w grze rzadko przydaje się tego typu zmienna, gdyż nie można przewidzieć jaką postać będzie miał w drużynie gracz dlatego używa się zmiennej przystosowanej do indeksu postaci:
$game_party.actors[N].hp - gdzie N to indeks postaci (od 0)
a w VX'e
$game_party.members[N].hp - gdzie N to indeks postaci (od 0)

ziomalek - Nie 02 Maj, 2010 09:12

a dałby ktoś przykład skryptu jak wyświetlić lvl boha i aby nietrzeba było wstawiac nic do scene_map :?: :?: :?:
Ayene - Nie 02 Maj, 2010 09:26

Jeżeli korzystasz z VX'a możesz wejść w edytor skryptów, przejść do klasy 'Window_Message', znaleźć:
Kod:
@text.gsub!(/\\N\[([0-9]+)\]/i) { $game_actors[$1.to_i].name }

po czym dodać:
Kod:
@text.gsub!(/\\L\[([0-9]+)\]/i) { $game_actors[$1.to_i].level }


Dzięki temu wpisując w treści wiadomości \L[nr] wyświetlisz poziom postaci o id = nr
(dlatego nr zamień na jakieś id) :->

ziomalek - Nie 02 Maj, 2010 09:36

Dzięki Ayne, jesteś BOSKA :!:

A jak zrobić to bez dodawania tych koment do Windows_Message, Scene_Map...???

[ Dodano: Nie 09 Maj, 2010 12:56 ]
to powie ktoś???

erienus - Pią 21 Maj, 2010 12:10

przy próbowaniu sobie coś zryłem chyba bo:

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_actor_name
end
end

taki mam kod, chciałem by wyświetlało imię bohatera, więc dodałem

self.contents.draw_actor_name

ale wywala mi grę ;/

Ayene - Pią 21 Maj, 2010 12:25

Bo co to jest w ogóle za komenda 'self.contents.draw_actor_name'. I kogo ma podać imię?
Po pierwsze 'draw_actor_name' to zadeklarowana już definicja, która sama w sobie powoduje wyświetlenie imienia bohatera, jednak - co jest ważne - należy wskazać, którego bohatera imię chcesz wyświetlić?

czyli linijka z:
Kod:
self.contents.draw_actor_name

powinna wyglądać przykładowo tak:
Kod:
draw_actor_name($game_party.actors[0], x, y)

za x i y podstaw współrzędne.
Wówczas wyświetli się imię pierwszego bohatera w drużynie.

erienus - Sob 22 Maj, 2010 09:01

ok, dzięki ayene ;p
a jak zrobić by ukazać 2 lub 3 okienka? bo jak dałem 2 oddzielne skrypty z 2 okienkami to tylko jedno pokazało
EDIT: wiem już chyba, ale mam pytanie bo robię HUDa i jak zrobić by podstawić grafiki pod pasek HP MP i EXP?

Ayene - Sob 22 Maj, 2010 11:46

Trzeba skorzystać ze skryptu, najlepiej będzie jak podejrzysz, jak wstawić takie paski do Menu:
Spoiler:

Kod:
# Paski HP i SP

module Ayene
    SZEROKOŚĆ_PASKÓW = 144
    KOLOR_HP = Color.new(128, 128, 255, 255)
    KOLOR_SP = Color.new(255, 64, 0)
end

class Window_Base < Window
  def draw_actor_hp_gauge(actor, x, y, width = Ayene::SZEROKOŚĆ_PASKÓW)
    gw = width * actor.hp / actor.maxhp
    self.contents.fill_rect(x, y + 24, width, 6, Color.new(255, 255, 255, 255))
    self.contents.fill_rect(x, y + 24, gw, 6, Ayene::KOLOR_HP)
  end 
 
  def draw_actor_sp_gauge(actor, x, y, width = Ayene::SZEROKOŚĆ_PASKÓW)
    gw = width * actor.sp / actor.maxsp
    self.contents.fill_rect(x, y + 24, width, 6, Color.new(255, 255, 255, 255))
    self.contents.fill_rect(x, y + 24, gw, 6, Ayene::KOLOR_SP)
  end 
 
  alias ayene_draw_actor_hp draw_actor_hp
  def draw_actor_hp(*arg)
    ayene_draw_actor_hp(*arg)
    draw_actor_hp_gauge(*arg)
  end 
 
  alias ayene_draw_actor_sp draw_actor_sp
  def draw_actor_sp(*arg)
    ayene_draw_actor_sp(*arg)
    draw_actor_sp_gauge(*arg)
  end 
end


Wystarczy, że w miejsce, gdzie chcesz wstawić paski podasz kod:
Kod:
draw_actor_hp_gauge(actor, x, y, width)

i
Kod:
draw_actor_sp_gauge(actor, x, y, width)

erienus - Sob 22 Maj, 2010 15:34

ok, może mi się uda
FilipsO - Pią 23 Lip, 2010 14:32

Mam wielki problem!
Stworzyłem coś takiego:
Spoiler:


Skrypt:
class Window_okno < Window_Base
def initialize(x = 7, y = 16, width = 320, height = 60)
super(x, y, width, height)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = "HP:"$data_actors[N].hp
self.contents.font.size = 18
self.back_opacity = 160
refresh
end
def refresh
self.contents.clear
self.contents.draw_text(0, 0, 288, 32, "", 1)
end
end


Scene_Map
class Window_okno < Window_Base
def initialize(x = 7, y = 16, width = 320, height = 60)
super(x, y, width, height)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = "Book Antiqua"
self.contents.font.size = 18
self.back_opacity = 160
refresh
end
def refresh
self.contents.clear
self.contents.draw_text(0, 0, 288, 32, "HP:"$data_actors[N].hp, 1)
end
end

class Scene_Map
def main
@spriteset = Spriteset_Map.new
@message_window = Window_Message.new
@okienko = Window_okno.new
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@spriteset.dispose
@message_window.dispose
@okienko.dispose
if $scene.is_a?(Scene_Title)
Graphics.transition
Graphics.freeze
end
end

def update
loop do
$game_map.update
$game_system.map_interpreter.update
$game_player.update
$game_system.update
$game_screen.update
unless $game_temp.player_transferring
break
end
transfer_player
if $game_temp.transition_processing
break
end
end
@spriteset.update
@message_window.update
@okienko.refresh
if $game_temp.gameover
$scene = Scene_Gameover.new
return
end
if $game_temp.to_title
$scene = Scene_Title.new
return
end
if $game_temp.transition_processing
$game_temp.transition_processing = false
if $game_temp.transition_name == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$game_temp.transition_name)
end
end
if $game_temp.message_window_showing
return
end
if $game_player.encounter_count == 0 and $game_map.encounter_list != []
unless $game_system.map_interpreter.running? or
$game_system.encounter_disabled
n = rand($game_map.encounter_list.size)
troop_id = $game_map.encounter_list[n]
if $data_troops[troop_id] != nil
$game_temp.battle_calling = true
$game_temp.battle_troop_id = troop_id
$game_temp.battle_can_escape = true
$game_temp.battle_can_lose = false
$game_temp.battle_proc = nil
end
end
end
if Input.trigger?(Input::B)
unless $game_system.map_interpreter.running? or
$game_system.menu_disabled
$game_temp.menu_calling = true
$game_temp.menu_beep = true
end
end
if $DEBUG and Input.press?(Input::F9)
$game_temp.debug_calling = true
end
unless $game_player.moving?
if $game_temp.battle_calling
call_battle
elsif $game_temp.shop_calling
call_shop
elsif $game_temp.name_calling
call_name
elsif $game_temp.menu_calling
call_menu
elsif $game_temp.save_calling
call_save
elsif $game_temp.debug_calling
call_debug
end
end
end

def call_battle
$game_temp.battle_calling = false
$game_temp.menu_calling = false
$game_temp.menu_beep = false
$game_player.make_encounter_count
$game_temp.map_bgm = $game_system.playing_bgm
$game_system.bgm_stop
$game_system.se_play($data_system.battle_start_se)
$game_system.bgm_play($game_system.battle_bgm)
$game_player.straighten
$scene = Scene_Battle.new
end

def call_shop
$game_temp.shop_calling = false
$game_player.straighten
$scene = Scene_Shop.new
end

def call_name
$game_temp.name_calling = false
$game_player.straighten
$scene = Scene_Name.new
end

def call_menu
$game_temp.menu_calling = false
if $game_temp.menu_beep
$game_system.se_play($data_system.decision_se)
$game_temp.menu_beep = false
end
$game_player.straighten
$scene = Scene_Menu.new
end

def call_save
$game_player.straighten
$scene = Scene_Save.new
end

def call_debug
$game_temp.debug_calling = false
$game_system.se_play($data_system.decision_se)
$game_player.straighten
$scene = Scene_Debug.new
end

def transfer_player
$game_temp.player_transferring = false
if $game_map.map_id != $game_temp.player_new_map_id
$game_map.setup($game_temp.player_new_map_id)
end
$game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
case $game_temp.player_new_direction
when 2
$game_player.turn_down
when 4
$game_player.turn_left
when 6
$game_player.turn_right
when 8
$game_player.turn_up
end
$game_player.straighten
$game_map.update
@spriteset.dispose
@spriteset = Spriteset_Map.new
if $game_temp.transition_processing
$game_temp.transition_processing = false
Graphics.transition(20)
end
$game_map.autoplay
Graphics.frame_reset
Input.update
end
end


I wyskakuje mi syntax error a ja chcialem HP w rogu :-/

Sabikku - Pią 23 Lip, 2010 14:43

W ruby blok ma taką postać:
Kod:
begin
end

Każdy blok rozpoczyna się jakimś słowem kluczowym (begin, def, if, case i tak dalej) i kończy end'em. Policz liczbę słów kluczowych (w RMie są ładnie pokolorowane) i endów i zastanów się, gdzie się przeliczyłeś. Tak się dzieje jak nie używasz tabulatorów (wcięć w każdym bloku).

Kod:
class Costam
    def costam
        if costam
        end
    end
    def costam
        if costam
        end
    end
    def costam
        if costam
        end
    end
end

radek02 - Wto 03 Sie, 2010 18:59

a jaki jest odnośnik do menu ? ( takie coś jak Scene_Map itp. )
Sabikku - Wto 03 Sie, 2010 20:23

Odnośnik? Przeniesienie do Scene_Menu:
Kod:
$scene = Scene_Menu.new

O to ci chodzi?

radek02 - Wto 03 Sie, 2010 21:22

Sabikku, dzięki . to już mam pierwszą linijkę ;-) .
maciek1520 - Czw 23 Gru, 2010 01:10

Cytat:
[quote="Ayene"]Bo co to jest w ogóle za komenda 'self.contents.draw_actor_name'. I kogo ma podać imię?
Po pierwsze 'draw_actor_name' to zadeklarowana już definicja, która sama w sobie powoduje wyświetlenie imienia bohatera, jednak - co jest ważne - należy wskazać, którego bohatera imię chcesz wyświetlić?

czyli linijka z:
Kod:
self.contents.draw_actor_name

powinna wyglądać przykładowo tak:
Kod:
draw_actor_name($game_party.actors[0], x, y)

za x i y podstaw współrzędne.
Wówczas wyświetli się imię pierwszego bohatera w drużynie.

jak wklejam to co ayene napisala tutaj czyli to
Cytat:
draw_actor_name($game_party.actors[0], x, y)

to podczas wlaczania nowej gry w grze to wyskakuje mi blad i pokazuje ze jest cos zlego z ta linijka

co moge na to poradzic ???
caly moj kod wyglada tak :
Cytat:
class Window_okno < Window_Base
def initialize(x = 0, y = 0, width = 160, height = 120)
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
draw_actor_name($game_party.actors[0], 0, 0)
end
end


Prosze o pomoc

Sabikku - Czw 23 Gru, 2010 01:51

Myśl, nie przeklejaj.
Kod:

class Window_okno < Window_Base
  def initialize(x = 0, y = 0, width = 160, height = 120)
    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_actor_name($game_party.actors[0], 0, 0)
  end
end

maciek1520 - Czw 23 Gru, 2010 12:10

dalej nie dziala tylko wyskakuje mi taki oto blad :
Cytat:
Script 'Windows_okno' line 12: NoMethodError occurred .
undefined method ' actors' for #<gameparty:0x1506878

i to jest ta lininijka
Cytat:
self.contents.draw_actor_name($game_party.actors[0], 0, 0)


co mam z tym zrobic ??

edit;
coz zrobilem juz tego bledu niemam ale mam inny
w Windows_Base
linijka 206
Cytat:
return knockout_color if actor.hp == 0


jak moze byc blad z ta linijka skoro ona jest orginalna

pomoze ktos mi ??

Sabikku - Czw 23 Gru, 2010 23:01

Jeśli używasz RMVX, zamiast $game_party.actors używaj $game_party.members

Powered by phpBB modified by Przemo © 2003 phpBB Group