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

Project1

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

[有事请教] 脚本里面的参数传递

[复制链接]

Lv3.寻梦者

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

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

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

x
module Mercenaries
  class Window_Shopcommand < ::Window_Selectable
    def initialize
      super(0,0,480,64)
      self.contents=Bitmap.new(self.width-32,self.height-32)
      @command=["雇佣","解雇","取消"]
      @item_max = 3
      @column_max = 3
      refresh
      self.index=0
    end
    def refresh
      for i in [email protected]
        x=i%@command.size*160
        self.contents.draw_text(x,0,self.width-32,32,@command[i])
      end
    end
  end #Window_Shopcommand
  class Window_MenuStatus < ::Window_Selectable
    attr_reader :actors
  #--------------------------------------------------------------------------
  # ● 初始化目标
  #--------------------------------------------------------------------------
  def initialize
    super(320, 64, 320, 480-64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @column_max=1
    refresh   
    self.active = false
    self.index = 0
  end
  def id
    @actors[self.index]
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @actors=[]
    for actor in $game_party.actors
      @actors.push(actor.id)
    end
   
    @item_max = $game_party.actors.size
    #$game_party.actors和@actors是不同的
    for i in 0...$game_party.actors.size
      x = 64
      y = i * 116
      actor = $game_party.actors[i]
      draw_actor_graphic(actor, x - 40, y + 80)
      draw_actor_name(actor, x, y)
      draw_actor_class(actor, x + 144, y)
      draw_actor_level(actor, x, y + 32)
      draw_actor_state(actor, x + 90, y + 32)
      draw_actor_exp(actor, x, y + 64)
      draw_actor_hp(actor, x + 236, y + 32)
      draw_actor_sp(actor, x + 236, y + 64)
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新光标矩形
  #--------------------------------------------------------------------------
  def update_cursor_rect
    if @index < 0
      self.cursor_rect.empty
    else
      self.cursor_rect.set(0, @index * 116, self.width - 32, 96)
    end
  end
  end#Window_MenuStatus
  class Window_Mercenaries < ::Window_Selectable
    attr_reader :column_max
    attr_reader :mercenaries
    def initialize(mercenaries)
      super(0,64,320,480-64)
      self.contents = Bitmap.new(width - 32, height - 32)
      @column_max=1
      @mercenaries=mercenaries
      refresh
      self.index=0
    end
    def id
      @actors[self.index]
    end
    def refresh
      self.contents.clear
      @actors=[]
      for actor in $game_party.actors_1
        @actors.push(actor.id)
      end

      @item_max = $game_party.actors_1.size
      #$game_party.actors和@actors是不同的
      for i in 0...$game_party.actors_1.size
        x = 64
        y = i * 116
        actor = $game_party.actors_1[i]
        draw_actor_graphic(actor, x - 40, y + 80)
        draw_actor_name(actor, x, y)
        draw_actor_class(actor, x + 144, y)
        draw_actor_level(actor, x, y + 32)
        draw_actor_state(actor, x + 90, y + 32)
        draw_actor_exp(actor, x, y + 64)
        draw_actor_hp(actor, x + 236, y + 32)
        draw_actor_sp(actor, x + 236, y + 64)
      end
    end

  #--------------------------------------------------------------------------
  # ● 刷新光标矩形
  #--------------------------------------------------------------------------
  def update_cursor_rect
    if @index < 0
      self.cursor_rect.empty
    else
      self.cursor_rect.set(0, @index * 116, self.width - 32, 96)
    end
  end
  end #Window_Mercenaries
  class Scene_Mercenaries
    def initialize(mercenaries)
      @mercenaries=mercenaries

    end
    def main
      @window_shopcommand=Window_Shopcommand.new  #最上左角窗口
      @window_gold=Window_Gold.new  #最上右角窗口
      @window_gold.x=480
      @window_gold.y=0
      @window_mercenaries=Window_Mercenaries.new(@mercenaries)#左下角窗口

      @window_mercenaries.active = false
      @window_menustatus=Window_MenuStatus.new#右下角窗口
      @window_help=Window_Help.new
      @window_help.visible=false
      Graphics.transition
      loop do
        Graphics.update
        Input.update
        update
        if self != $scene
          break
        end
      end
      @window_mercenaries.dispose
    end
    def update
      @window_shopcommand.update
      @window_mercenaries.update
      @window_menustatus.update
      if @window_shopcommand.active #商店操作界面
        w_s_update
        return
      end
      if @window_mercenaries.active #雇佣操作界面
        w_merc_update
        return
      end
      if @window_menustatus.active #解雇操作界面
        w_menu_update
      end
    end#update
    def w_s_update
      if Input.trigger?(Input::B)
        @window_mercenaries.active=false
        @window_menustatus.active=false
        @window_shopcommand.active=true
        @window_mercenaries.index=-1
        @window_menustatus.index=-1
      end
      if Input.trigger?(Input::C)
        case @window_shopcommand.index
        when 0 #雇佣
          @window_mercenaries.active=true
          @window_menustatus.active=false
          @window_shopcommand.active=false
          @window_menustatus.index=-1
          @window_mercenaries.index=0
          return
        when 1 #解雇
          @window_mercenaries.active=false
          @window_menustatus.active=true
          @window_shopcommand.active=false
          @window_mercenaries.index=-1
          @window_menustatus.index=0
          return
        when 2 #取消
          $scene=Scene_Map.new
          return
        end
      end
    end#w_s_update
    def w_merc_update
      if Input.trigger?(Input::B)
        @window_shopcommand.active=true
        @window_mercenaries.active=false
      end
      if Input.trigger?(Input::C)
        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)
            #雇佣
            @tmp=@window_mercenaries.id
            $game_party.remove_actor_1(@window_mercenaries.id)#左窗口
            @window_mercenaries.refresh
            $game_party.add_actor(@tmp)#右窗口
            @window_menustatus.refresh
          end
        end
      end
      @window_gold.refresh
    end#w_merc_update
    def w_menu_update
      if Input.trigger?(Input::B)
        @window_shopcommand.active=true
        @window_menustatus.active=false
      end
      if Input.trigger?(Input::C)
        if @window_menustatus.id !=1
          $game_party.gain_gold($game_actors[@window_mercenaries.id].price/2)
          #解雇
          @tmp_1=@window_menustatus.id
          $game_party.remove_actor(@window_menustatus.id)#右窗口
          @window_menustatus.refresh
          $game_party.add_actor_1(@tmp_1)#左窗口
          @window_mercenaries.refresh

        end
      end
    @window_gold.refresh
    end#w_menu_update
  end #Scene_Mercenaries


end #module Mercenaries
class Game_Party
  attr_reader :actors_1
  #--------------------------------------------------------------------------
  # ● 设置初期角色
  #--------------------------------------------------------------------------
  def setup_starting_members_1
    @actors_1 = []
    @window_mercenaries=Mercenaries::Window_Mercenaries.new(@mercenaries)
   
    for i in @mercenaries#●●●●
      @actors_1.push($game_actors[i])
    end
  end

  #--------------------------------------------------------------------------
  # ● 加入同伴
  #     actor_id : 角色 ID
  #--------------------------------------------------------------------------
  def add_actor_1(actor_id)
    # 获取角色
    actor = $game_actors[actor_id]
    # 同伴人数未满 4 人、本角色不在队伍中的情况下
    if @actors.size < 4 and not @actors.include?(actor)
      # 添加角色
      @actors_1.push(actor)
    end
  end
  #--------------------------------------------------------------------------
  # ● 角色离开
  #     actor_id : 角色 ID
  #--------------------------------------------------------------------------
  def remove_actor_1(actor_id)
    # 删除角色
    @actors_1.delete($game_actors[actor_id])
  end

end
class Scene_Title
  alias command_new_game_old command_new_game
  def command_new_game
    command_new_game_old
    $game_party.setup_starting_members_1
  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)
我在#●●●●@window_mercenaries=Mercenaries::Window_Mercenaries.new(@mercenaries)
里面参数传递了上面的参数,为什么下面的@mercenaries的值是nil?应该如何改?

Lv4.逐梦者

梦石
0
星屑
5680
在线时间
782 小时
注册时间
2019-1-20
帖子
191
2
发表于 2023-11-18 13:32:56 | 只看该作者
本帖最后由 srwjrevenger 于 2023-11-18 14:20 编辑
  1.   #--------------------------------------------------------------------------
  2.   # ● 设置初期角色
  3.   #--------------------------------------------------------------------------
  4.   def setup_starting_members_1
  5.     @actors_1 = []
  6.    
  7. # @window_mercenaries=Mercenaries::Window_Mercenaries.new(@mercenaries)
  8.   return if @mercenaries ==nil
  9.       
  10.    for i in @mercenaries #●●●●
  11.       @actors_1.push($game_actors[i])
  12.     end
  13.   end
复制代码
开始新游戏就会 设置初期角色 , 但是这里
Mercenaries::Window_Mercenaries.new(@mercenaries) 不但直接进入场景,
而且@mercenaries根本没有赋值,
而地图那个根本读不到... ...
其它地方的调用也没有考虑 $game_party.actors_1 或者  @mercenaries 是 空/nil 的情况,
会频繁报错,改一改吧... ...

因为不同类的变量默认是受保护,无法读写的,
@mercenaries 只在它的相关窗口/场景使用,
所以想用还得 attr_reader 或者 attr_accessor

点评

谢谢你,小熊哥哥  发表于 2023-11-18 21:25

提高解答机会的方法:
看一下对应版本的帮助文件 看天气预报说今天不下雨
改变问题为更有可能的或常见的 如:天气自动变化下雨→天气系统 果然不准呀~
使用论坛的搜索功能查找相关问题 好丧啊... ...想看女装
清楚说明实际上你想解决的问题  想看坛友的女装  
脚本自己有改过的地方要标明  不要遮脸的
脚本有问题但不是默认的要全部贴出来 大胆点,尽情发
三包原则:包有BUG,包甩锅,包咕咕
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-30 10:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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