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

Project1

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

一起学脚本(1)

 关闭 [复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

跳转到指定楼层
1
发表于 2008-6-19 20:15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本文不是针对太新的脚本新手哦~~~~{/hx}

教学内容:
    制作属于你的合成系统
教学目的:
    对数组的初步认识
教学内容:
既然要合成,那么就必须有一个合成的数据库,既什么+什么+什么=什么
这里我们使用数组:

  1. $hecheng = []
  2. $hecheng.push([7,1,2,3]) #这里的意思是7号物品通过1、2、3号物品合成
  3. $hecheng.push([6,2,5,5])
复制代码

窗口的绘制,我就不再说了,参考Window_Shop做一个吧(明显想偷懒)从数组里获取合成列表,传递给MK方法就OK了
这里,我们主要制作一个方法——合成

  1. def mk(use)
  2. ok = true
  3.   for i in 1...use.size
  4.      if $game_party.item_number(use[i]) == 0
  5.        ok = false
  6.      end
  7.   end
  8.   if ok
  9.      for i in 1...use.size
  10.         $game_party.lose_item(use[i], 1)
  11.      end
  12.      $game_party.gain_item(use[0],1)
  13.   else
  14.      return false
  15.   end
  16.   return true
  17. end
复制代码

完整代码(含制作窗口)
  1. def mk(use)
  2. ok = true
  3.   for i in 1...use.size
  4.      if $game_party.item_number(use[i]) == 0
  5.        ok = false
  6.      end
  7.   end
  8.   if ok
  9.      for i in 1...use.size
  10.         $game_party.lose_item(use[i], 1)
  11.      end
  12.      $game_party.gain_item(use[0],1)
  13.   else
  14.      return false
  15.   end
  16.   return true
  17. end


  18. $hecheng = []
  19. $hecheng.push([7,1,2,3])
  20. $hecheng.push([6,2,5,5])
  21. #==============================================================================
  22. # ■ Window_ShopCommand1
  23. #------------------------------------------------------------------------------
  24. #  商店画面、选择要做的事的窗口
  25. #==============================================================================

  26. class Window_ShopCommand1 < Window_Selectable
  27.   #--------------------------------------------------------------------------
  28.   # ● 初始化对像
  29.   #--------------------------------------------------------------------------
  30.   def initialize
  31.     super(0, 64, 480, 64)
  32.     self.contents = Bitmap.new(width - 32, height - 32)
  33.     @item_max = 2
  34.     @column_max = 3
  35.     @commands = ["制作","取消"]
  36.     refresh
  37.     self.index = 0
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● 刷新
  41.   #--------------------------------------------------------------------------
  42.   def refresh
  43.     self.contents.clear
  44.     for i in 0...@item_max
  45.       draw_item(i)
  46.     end
  47.   end
  48.   #--------------------------------------------------------------------------
  49.   # ● 描绘项目
  50.   #     index : 项目编号
  51.   #--------------------------------------------------------------------------
  52.   def draw_item(index)
  53.     x = 4 + index * 160
  54.     self.contents.draw_text(x, 0, 128, 32, @commands[index])
  55.   end
  56. end


  57. #==============================================================================
  58. # ■ Scene_Shop
  59. #------------------------------------------------------------------------------
  60. #  处理商店画面的类。
  61. #==============================================================================

  62. class Scene_Shop1
  63.   #--------------------------------------------------------------------------
  64.   # ● 主处理
  65.   #--------------------------------------------------------------------------
  66.   def main
  67.     # 生成帮助窗口
  68.     @help_window = Window_Help.new
  69.     # 生成指令窗口
  70.     @command_window = Window_ShopCommand1.new
  71.     # 生成金钱窗口
  72.     @gold_window = Window_Gold.new
  73.     @gold_window.x = 480
  74.     @gold_window.y = 64
  75.     # 生成时间窗口
  76.     @dummy_window = Window_Base.new(0, 128, 640, 352)
  77.     # 生成购买窗口
  78.     a = []
  79.     for i in $hecheng
  80.       a.push([0,i[0]])
  81.     end
  82.     @buy_window = Window_ShopBuy.new(a)
  83.     @buy_window.active = false
  84.     @buy_window.visible = false
  85.     @buy_window.help_window = @help_window
  86.     # 生成数量输入窗口
  87.     @number_window = Window_ShopNumber.new
  88.     @number_window.active = false
  89.     @number_window.visible = false
  90.     # 生成状态窗口
  91.     @status_window = Window_ShopStatus.new
  92.     @status_window.visible = false
  93.     # 执行过渡
  94.     Graphics.transition
  95.     # 主循环
  96.     loop do
  97.       # 刷新游戏画面
  98.       Graphics.update
  99.       # 刷新输入信息
  100.       Input.update
  101.       # 刷新画面
  102.       update
  103.       # 如果画面切换的话就中断循环
  104.       if $scene != self
  105.         break
  106.       end
  107.     end
  108.     # 准备过渡
  109.     Graphics.freeze
  110.     # 释放窗口
  111.     @help_window.dispose
  112.     @command_window.dispose
  113.     @gold_window.dispose
  114.     @dummy_window.dispose
  115.     @buy_window.dispose
  116.     @status_window.dispose
  117.   end
  118.   #--------------------------------------------------------------------------
  119.   # ● 刷新画面
  120.   #--------------------------------------------------------------------------
  121.   def update
  122.     # 刷新窗口
  123.     @help_window.update
  124.     @command_window.update
  125.     @gold_window.update
  126.     @dummy_window.update
  127.     @buy_window.update
  128.    # @number_window.update
  129.     @status_window.update
  130.     # 指令窗口激活的情况下: 调用 update_command
  131.     if @command_window.active
  132.       update_command
  133.       return
  134.     end
  135.     # 购买窗口激活的情况下: 调用 update_buy
  136.     if @buy_window.active
  137.       update_buy
  138.       return
  139.     end
  140.     # 个数输入窗口激活的情况下: 调用 update_number
  141.     if @number_window.active
  142.       #update_number
  143.       return
  144.     end
  145.   end
  146.   #--------------------------------------------------------------------------
  147.   # ● 刷新画面 (指令窗口激活的情况下)
  148.   #--------------------------------------------------------------------------
  149.   def update_command
  150.     # 按下 B 键的情况下
  151.     if Input.trigger?(Input::B)
  152.       # 演奏取消 SE
  153.       $game_system.se_play($data_system.cancel_se)
  154.       # 切换到地图画面
  155.       $scene = Scene_Map.new
  156.       return
  157.     end
  158.     # 按下 C 键的情况下
  159.     if Input.trigger?(Input::C)
  160.       # 命令窗口光标位置分支
  161.       case @command_window.index
  162.       when 0  # 购买
  163.         # 演奏确定 SE
  164.         $game_system.se_play($data_system.decision_se)
  165.         # 窗口状态转向购买模式
  166.         @command_window.active = false
  167.         @dummy_window.visible = false
  168.         @buy_window.active = true
  169.         @buy_window.visible = true
  170.         @buy_window.refresh
  171.         @status_window.visible = true
  172.       when 1  # 卖出
  173.         # 演奏确定 SE
  174.         $game_system.se_play($data_system.decision_se)
  175.         # 切换到地图画面
  176.         $scene = Scene_Map.new
  177.       end
  178.       return
  179.     end
  180.   end
  181.   #--------------------------------------------------------------------------
  182.   # ● 刷新画面 (购买窗口激活的情况下)
  183.   #--------------------------------------------------------------------------
  184.   def update_buy
  185.     # 设置状态窗口的物品
  186.     @status_window.item = @buy_window.item
  187.     # 按下 B 键的情况下
  188.     if Input.trigger?(Input::B)
  189.       # 演奏取消 SE
  190.       $game_system.se_play($data_system.cancel_se)
  191.       # 窗口状态转向初期模式
  192.       @command_window.active = true
  193.       @dummy_window.visible = true
  194.       @buy_window.active = false
  195.       @buy_window.visible = false
  196.       @status_window.visible = false
  197.       @status_window.item = nil
  198.       # 删除帮助文本
  199.       @help_window.set_text("")
  200.       return
  201.     end
  202.     # 按下 C 键的情况下
  203.     if Input.trigger?(Input::C)
  204.       # 获取物品
  205.       @item = @buy_window.item
  206.       # 物品无效的情况下、或者价格在所持金以上的情况下
  207.       # 获取物品所持数
  208.       case @item
  209.       when RPG::Item
  210.         number = $game_party.item_number(@item.id)
  211.       when RPG::Weapon
  212.         number = $game_party.weapon_number(@item.id)
  213.       when RPG::Armor
  214.         number = $game_party.armor_number(@item.id)
  215.       end
  216.       # 如果已经拥有了 99 个情况下
  217.       if number == 99
  218.         # 演奏冻结 SE
  219.         $game_system.se_play($data_system.buzzer_se)
  220.         return
  221.       end
  222.       # 演奏确定 SE
  223.       $game_system.se_play($data_system.decision_se)

  224.       for i in $hecheng
  225.         if @buy_window.item.id == i[0]
  226.           mk(i)
  227.           # 刷新各窗口
  228.           @gold_window.refresh
  229.           @buy_window.refresh
  230.           @status_window.refresh
  231.           # 窗口状态转向购买模式
  232.           @buy_window.active = true
  233.           @buy_window.visible = true
  234.           @help_window.set_text("成功制作了" + @buy_window.item.name)
  235.           return
  236.         end
  237.       end
  238.     end
  239.   end
  240. end
复制代码
哎呀,蛋疼什么的最有爱了

Lv2.观梦者

龙骑

梦石
0
星屑
525
在线时间
10 小时
注册时间
2007-12-31
帖子
2030
2
发表于 2008-6-19 20:16:18 | 只看该作者
SF,加油{/qiang}!一起学~……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
54 小时
注册时间
2008-5-12
帖子
129
3
发表于 2008-6-19 20:17:31 | 只看该作者
腳本2少了 break
= =
你是個好人>////<
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

4
 楼主| 发表于 2008-6-19 20:26:04 | 只看该作者
以下引用Quarcy于2008-6-19 12:17:31的发言:

腳本2少了 break
= =

for不需要break
更何况已经return了
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
275
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

5
发表于 2008-6-19 21:41:25 | 只看该作者
以下引用Quarcy于2008-6-19 12:17:31的发言:

腳本2少了 break
= =

这个应该属于误区了吧,for不同于while或者do while,在for循环的开始就已经定义了循环结束的条件,而不必像while 或者 do while 要另外定义一个循环出口
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
54 小时
注册时间
2008-5-12
帖子
129
6
发表于 2008-6-19 21:42:41 | 只看该作者
  for i in 1...use.size
     if $game_party.item_number(use) == 0
       ok = false
       break
     end
  end
你是個好人>////<
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
275
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

7
发表于 2008-6-19 21:54:52 | 只看该作者
以下引用Quarcy于2008-6-19 13:42:41的发言:

for i in 1...use.size
    if $game_party.item_number(use) == 0
      ok = false
      break
    end
end

原来你是说他算法的问题啊,没错,有一项不满足就不必继续了。

那么看看换成下面这个方法还对么?
def mk(use)
  for i in 1...use.size
     if $game_party.item_number(use) == 0
       return false
     end
  end
  for i in 1...use.size
    $game_party.lose_item(use, 1)
  end
  $game_party.gain_item(use[0],1)
  return true
end
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
54 小时
注册时间
2008-5-12
帖子
129
8
发表于 2008-6-19 21:59:39 | 只看该作者
突然發覺爲甚麼不用 Hash  = =
你是個好人>////<
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
275
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

9
发表于 2008-6-19 22:02:39 | 只看该作者
以下引用Quarcy于2008-6-19 13:59:39的发言:

突然發覺爲甚麼不用 Hash  = =


[本贴由作者于 2008-6-19 14:00:31 最后编辑]

可能是考虑到实现1号物品可以用2+3合成,也能用4+5+6合成的这种情况
但其实还是用hash更合适
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
54 小时
注册时间
2008-5-12
帖子
129
10
发表于 2008-6-19 22:06:13 | 只看该作者
{[2,3]=>1,[4,5,6]=>1}
還是你想一樣的材料合成幾樣東西 = =a
{
[2,3]=>{50=>1,50=>2}
[4,5,6]=>{100=>1}
}
你是個好人>////<
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 16:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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