设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 654|回复: 2
打印 上一主题 下一主题

[有事请教] 把方法放进模块,结果显示错误

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4169
在线时间
258 小时
注册时间
2013-10-13
帖子
815
跳转到指定楼层
1
发表于 2023-11-19 21:00:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 kvkv97 于 2023-11-21 21:17 编辑

module Mercenaries
   class Window_Help < ::Window_Base
     def initialize
       super(0, 0, 196, 256)
       self.contents = Bitmap.new(width - 32, height - 32)
       self.z += 10
     end
     def draw_actor(actor)
       self.contents.clear
       bitmap=RPG::Cache.battler(actor.battler_name, actor.battler_hue)
       self.contents.blt(0,0,bitmap,bitmap.rect)
       self.contents.draw_text(0,0,64,32,actor.price.to_s)
       self.contents.draw_text(0,32,64,32,actor.name)
       self.contents.draw_text(0,64,64,32,actor.class_name)
       self.contents.draw_text(0,96,64,32,"武器:#{$data_weapons[actor.weapon_id].name}")
       self.contents.draw_text(0,128,64,32,"铠甲:#{$data_armors[actor.armor3_id].name}")
       self.contents.draw_text(0,160,64,32,"攻击力:#{actor.atk}")
       self.contents.draw_text(0,192,64,32,"防御力:#{actor.pdef}")
       self.contents.draw_text(0,224,64,32,"魔御力:#{actor.mdef}")
     end
   end #帮助窗口
  class Window_ShopCommand<Window_Selectable
     def initialize
       super(80, 90 - 64, 480, 64)
       self.contents = Bitmap.new(width - 32, height - 32)
       @item_max = 3
       @column_max = 3
       @commands = ["雇佣", "解除", "取消"]
       refresh
       self.index = 0
     end
     def refresh
       for i in [email protected]
         x=i*160
         self.contents.draw_text(x,0,128,32,@commands)
       end
     end
   end#买卖指令窗口
  class Window_Mercenaries<::Window_Selectable
     attr_reader :mercenaries
     attr_reader :column_max
     def initialize(mercenaries)
       super(80, 90, 480, 320)
       @mercenaries = mercenaries
       @column_max = 7
       refresh
       self.index = 0
     end
     def id
       @mercenaries[self.index]
     end
     def set_mercenaries(mercenaries)
       @mercenaries=mercenaries
       refresh
     end
     def refresh
       @[email protected]
       if @item_max>0
         self.contents=Bitmap.new(width-32,row_max*80)
         for i in 0...@item_max
           draw_actor(i)
         end
       end
     end
     def draw_actor(index)
       x=index%@column_max*64
       y=index/@column_max*80
       actor=$game_actors[@mercenaries[index]]
       bitmap=RPG::Cache.character(actor.character_name, actor.character_hue)
       rect=bitmap.rect
       rect.width /=4
       rect.height/=4
       self.contents.blt(x,y,bitmap,rect)
       self.contents.draw_text(x,y+48,64,32,actor.name)
       self.contents.draw_text(x,y+32,64,32,"Lv"+sprintf("%03d",actor.level))
     end
     #--------------------------------------------------------------------------
     # ● 更新光标举行
    #--------------------------------------------------------------------------
    def update_cursor_rect
       # 光标位置不满 0 的情况下
      if @index < 0
         self.cursor_rect.empty
         return
       end
       # 获取当前的行
      row = @index / @column_max
       # 当前行被显示开头行前面的情况下
      if row < self.top_row
         # 从当前行向开头行滚动
        self.top_row = row
       end
       # 当前行被显示末尾行之后的情况下
      if row > self.top_row + (self.page_row_max - 1)
         # 从当前行向末尾滚动
        self.top_row = row - (self.page_row_max - 1)
       end
       # 计算光标的宽
      cursor_width = self.width / @column_max - 32
       # 计算光标坐标
      x = @index % @column_max * 64
       y = @index / @column_max * 80 - self.oy
       # 更新国标矩形
       self.cursor_rect.set(x, y, 64, 80)
     end
   end#描绘雇佣与解雇窗口

  class Scene_Mercenaries
     def initialize(mercenaries)
       @mercenaries = mercenaries
       @windows = []
       @temp = @mercenaries.dup
     end
     def main
       main_start
       Graphics.transition
       main_loop
       Graphics.freeze
       main_end
     end
     def main_start
       @window_shopcommand = Window_ShopCommand.new #最上面的窗口
      @window_help = Window_Help.new               #帮助窗口
      @window_mercenaries = Window_Mercenaries.new(@mercenaries)#下面的窗口
      @window_mercenaries.active = false
       @window_mercenaries.index = -1

       @window_gold = Window_Gold.new
       @window_gold.x = 640 - @window_gold.width - 32    #右下角窗口
      @window_gold.y = 480 - @window_gold.height - 32
       @windows << @window_gold << @window_shopcommand << @window_mercenaries << @window_help
       @window_help.visible = false
       @spriteset = Spriteset_Map.new
     end
     def main_loop
       while $scene == self
         rm_update
         update_window
         input_update
      end
     end
     def main_end
       @windows.each{ |window|window.dispose }
       @spriteset.dispose
     end
     def rm_update
       Graphics.update
       Input.update
     end
     def update_window
       @windows.each{ |window|window.update }
       update_help
     end
     def update_help
       if @window_mercenaries.active
         @window_help.visible=true
         cw=@window_mercenaries.index%@window_mercenaries.column_max*64
         ch=@window_mercenaries.index/@window_mercenaries.column_max*80
         @window_help.x=cw+@window_mercenaries.x+64
         @window_help.y=ch+@window_mercenaries.y+80
         if @window_help.x+@window_help.width>640
           @window_help.x=640-@window_help.width
         end
         if @window_help.y+@window_help.height>480
           @window_help.y=480-@window_help.height
         end
         @window_help.draw_actor($game_actors[@window_mercenaries.id])
       else
         @window_help.visible=false
       end
     end
     def input_update
       if Input.trigger?(Input::B)
         @window_shopcommand.active=true
         @window_mercenaries.active=true
         @window_mercenaries.index=-1
       end
       if Input.trigger?(Input::C)
         if @window_shopcommand.active
           case @window_shopcommand.index
           when 0
             @window_mercenaries.set_mercenaries(@temp)
             @type=0
             @window_shopcommand.active=false
             @window_mercenaries.active=true
             @window_mercenaries.index=0
             return
           when 1
             actors=[]
             for actor in $game_party.actors
               actors<<actor.id
             end
             @window_mercenaries.set_mercenaries(actors)
             @type=1
             @window_shopcommand.active=false
             @window_mercenaries.active=true
             @window_mercenaries.index=0
             return
           when 2
             $scene=Scene_Menu.new
           end
         end#@window_shopcommand.active
         case @type
         when 0
           if $game_party.gold>=$game_actors[@window_mercenaries.id].price
             if $game_party.actors.size<4
               $game_party.lose_gold($game_actors[@window_mercenaries.id].price)
               $game_party.add_actor(@window_mercenaries.id)
               @window_mercenaries.mercenaries.delete(@window_mercenaries.id)
               @window_mercenaries.refresh
               if @window_mercenaries.index>@window_mercenaries.mercenaries.size-1
                 @window_mercenaries.index=@window_mercenaries.mercenaries.size-1
               end
             end
           end
         when 1
           if @window_mercenaries.id !=1#$game_party.actors != 1
             $game_party.gain_gold($game_actors[@window_mercenaries.id].price/2)
             $game_party.remove_actor(@window_mercenaries.id)
             @temp<<@window_mercenaries.id
             @window_mercenaries.mercenaries.delete(@window_mercenaries.id)
             @window_mercenaries.refresh
             if @window_mercenaries.index>@window_mercenaries.mercenaries.size-1
               @window_mercenaries.index=@window_mercenaries.mercenaries.size-1
             end
           end
         end#case @type
         @window_gold.refresh
       end#Input::C
     end#input_update
   end#场景类

end

class Game_Actor
   def price
     [email protected](/,/)[1].nil? ? 0 : @name.split(/,/)[1]
     return price*self.level
   end
   def name
     [email protected](/,/)[0]
   end
end
在地图上建一事件,用脚本:
a=[2,3]
$scene=\
Mercenaries::\
Scene_Mercenaries.new(a)
Game_Actor本来在模块Mercenaries的外部,我把Game_Actor移进Mercenaries内部,怎么显示price
调用错误了?

Lv3.寻梦者

梦石
0
星屑
4169
在线时间
258 小时
注册时间
2013-10-13
帖子
815
2
 楼主| 发表于 2023-11-21 21:20:28 | 只看该作者
不好意思,我把文本弄错了,重新贴出来一个。
我把格式写成Mercenaries::Game_Actor,结果显示找不到@name,不知道为什么?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4721
在线时间
387 小时
注册时间
2012-11-8
帖子
276
3
发表于 2023-11-23 08:18:51 | 只看该作者
  1. module A
  2.   class B
  3.     def c
  4.       print "a"
  5.     end
  6.   end
  7. end
  8. class B
  9.   def b
  10.     print "b"
  11.   end
  12. end
  13. a=B.new
  14. A::B.new.c   #显示a
  15. a.c          #出错,方法未定义
复制代码

移到模块内部就等于单独在模块内的一个类了,跟外面的Game_Actor除了名字一样外毫不相干
所以移到内部@name没定义
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 00:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表