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

Project1

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

庸懒菜鸟之新手修改脚本教程-双倍经验和经验均分

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2007-8-6
帖子
8
跳转到指定楼层
1
发表于 2007-8-7 00:04:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
    大家好!本人闲暇之余,写了这个东东,全为菜鸟和懒人着想,高手可无视(其实本人也很懒,呵呵,自己觉得写脚本太麻烦,所以大部分是直接修改现有脚本。其实话说回来了,自己动手,丰衣足食嘛。)
    好了,现在进入正题。
    首先,要想把脚本修改成自己想要的,起码先要明白自己想要的脚本功能是什么,
就像这个双倍时间,要实现这个功能就得先考虑一下,从哪几方面入手。
    其实双倍时间就是控制一个开关,当这个开关打开的时候,在一定时间内,战斗后得到的经验为平时的双倍。那好,我们就先在脚本中定义一个双倍开关Two_Switches。
首先在Game_Enemy里,在class Game_Enemy < Game_Battler这条上面定义:Two_Switches == 1,这里面的“1”是第一号开关,可以自己随意更改。至于为什么要在Game_Enemy中定义,接着往下看。
    开关已经定义好了,那么就要设置双倍经验的效果了。在主程序里,每建立一个敌人角色,都会有相应的数值,既然建立敌人的时候,经验是我们自己输入的固定数值,那我们就应该在脚本中找到敌人全数值获取的脚本,而Game_Enemy这个脚本就是处理敌人的类。现在我们就要修改双倍经验了。
    在这个脚本中的172行我们能看到
  #--------------------------------------------------------------------------
  # ● 获取 EXP
  #--------------------------------------------------------------------------
  def exp
    return $data_enemies[@enemy_id].exp
    end
  end
这段脚本记录的就是单个敌人的经验,我们从这里入手。把刚才的双倍开关加到这里面来。改成以下的脚本文件。
  #--------------------------------------------------------------------------
  # ● 获取 EXP
  #--------------------------------------------------------------------------
  def exp
    if $game_switches[Two_Switches]
    return $data_enemies[@enemy_id].exp / $game_party.actors.size * 2
  else
    return $data_enemies[@enemy_id].exp / $game_party.actors.size
    end
  end
这个脚本里,if $game_switches[Two_Switches]这一条脚本的意思是如果当双倍经验开关为ON时。
return $data_enemies[@enemy_id].exp / $game_party.actors.size * 2 这条脚本的意思是输出战斗后,杀敌所得的经验== 敌人本身经验÷队伍人数×2,在这里顺便把经验均分也带入了,如果不想要经验均分的话,把return $data_enemies[@enemy_id].exp / $game_party.actors.size * 2改成return $data_enemies[@enemy_id].exp * 2就行,$game_party.actors.size就是队伍里的人物数量。
else是否则的意思,和前面的if构成if循环。
else下面的就是双倍经验开关为OFF的时候,经验为正常经验。同样,如果不想要经验均分的话,把 / $game_party.actors.size这条去掉就行了。
    好了,到这里我们设置的双倍经验就算基本完成了,如过想试试效果,可以去游戏中建立一个事件,把双倍经验开关打开,然后看看打开前和后的经验所得情况。
  好了,下面就让我们顺着上面的思路往下走,刚才我们修改了战斗后获取经验的脚本,但是却不能很好的控制,如果像上面那样,把开关开开,就会不分时间,一直有双倍效果,难道非得人为的拿事件控制吗?
  其实,我们的脚本还只是修改了一部分,剩下的还没完成。
  游戏里面的双倍经验都是用时间控制的,这个大家都知道,当时间为0秒的时候,双倍经验停止。
  那我们就可以用计时器控制。但是软件中的计时器并不是很好用,如果用过的应该有这样的感受,就是控制不是很方便。那我们就自己修改一下计时器脚本,来达到我们自己想要的效果。
  首先,对于一个游戏的双倍时间来说,最少领取时间为一小时,但是软件中的计时器却最多是一个小时,当计时器运行的时候显示为59:00,也就是说,领2小时的双倍经验也只能是一个小时的时间,我们就先把计时器显示这个脚本改一下,使它从00:00变成
00:00:00这个样子。
    首先在Sprite_Timer这个脚本中,找到
# 生成计时器显示用字符串
      min = @total_sec / 60
      sec = @total_sec % 60
      text = sprintf("%02d:%02d", min, sec)
这条脚本只有分min和秒sec却没有小时hour这个数值,那我们把它修改一下,改成下面的样子。
# 生成计时器显示用字符串
      hour = @total_sec / 60 / 60
      min = @total_sec / 60 % 60
      sec = @total_sec % 60
      text = sprintf("%2d:%02d:%02d", hour, min, sec)
改成这样就可以了,这样在游戏中显示的计时器就是00:00:00这个样子。
    但是这样还是不行的。在主程序中,设置计时器的时间最多也是60分,不能设为更多,那怎么才能叫它变成我们想要的呢?
    我们在Interpreter 4这个脚本中,找到190行,这个就是计时器在输出端的输出数值。内容如下:
  #--------------------------------------------------------------------------
  # ● 计时器操作
  #--------------------------------------------------------------------------
  def command_124
    # 开始的情况
    if @parameters[0] == 0
      $game_system.timer = @parameters[1] * Graphics.frame_rate
      $game_system.timer_working = true
    end
    # 停止的情况
    if @parameters[0] == 1
      $game_system.timer_working = false
    end
    # 继续
    return true
  end
我们把它改成下面这个样子就可以了:
  #--------------------------------------------------------------------------
  # ● 计时器操作
  #--------------------------------------------------------------------------
  def command_124
    # 开始的情况
    if @parameters[0] == 0
      $game_system.timer = @parameters[1] * Graphics.frame_rate * 10
      $game_system.timer_working = true
    end
    # 停止的情况
    if @parameters[0] == 1
      $game_system.timer_working = false
    end
    # 继续
    return true
  end
为什么要在设定的时间上乘10呢?因为这样就可以突破60分钟上限的限制了,如果你想领取1个小时的双,用计时器显示的话,可以在计时器设置的时候用6分钟就是一个小时,因为改完以后的脚本是你输入的数值乘10,如果2个小时,你只需要设置12分钟就可以,怎么样,很简单吧!
    像上面的修改应该算是已经完成了,但是有一个问题,不知道你们试完了发现没?
就是自己设置完计时器开启双倍了以后,当计时器的时间为0秒的时候,双倍却没有停止。而且为了一个双倍还占用一个公共事件,确实不是很好的办法。那有什么办法能叫它在0秒的时候自动停止呢?其实还真有一个办法能作到这一点。俗话说:羊毛出在羊身上,既然是计时器控制双倍时间,那我们还的从计时器脚本入手。
    在Sprite_Timer脚本里我们修改完的计时器显示脚本下面,也就是在:
      # 生成计时器显示用字符串
      hour = @total_sec / 60 / 60
      min = @total_sec / 60 % 60
      sec = @total_sec % 60
      text = sprintf("%2d:%02d:%02d", hour, min, sec)
      # 描绘计时器
下面,我们加上两行脚本,用来控制双倍时间的自动取消。内容如下:
        if $game_system.timer == 0
        # 更改双倍经验时间开关为OFF
        $game_switches[Two_Switches] = false
       end
这条脚本的意思就是当计时器秒数为0的时候,自动关闭双倍开关,这样我们就不用拿事件控制双倍时间的关闭了。去试一下效果吧!
    到这里,我们的双倍时间就修改完毕了。其实并不难,主要就是靠自己的思考和实践,其实同类的脚本修改还很多,比如在脚本中加变量控制什么的,大家自己多努力一下,很快就可以自己修改了。大家多多努力哦:)不会写脚本或者和鄙人一样懒的写脚本的同志们,就用这个方法自己改脚本吧:)不过改之前也要尊重一下脚本的作者,不要把人家的拿来改一下就说是自己的哦。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2007-8-6
帖子
8
2
 楼主| 发表于 2007-8-7 00:04:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
    大家好!本人闲暇之余,写了这个东东,全为菜鸟和懒人着想,高手可无视(其实本人也很懒,呵呵,自己觉得写脚本太麻烦,所以大部分是直接修改现有脚本。其实话说回来了,自己动手,丰衣足食嘛。)
    好了,现在进入正题。
    首先,要想把脚本修改成自己想要的,起码先要明白自己想要的脚本功能是什么,
就像这个双倍时间,要实现这个功能就得先考虑一下,从哪几方面入手。
    其实双倍时间就是控制一个开关,当这个开关打开的时候,在一定时间内,战斗后得到的经验为平时的双倍。那好,我们就先在脚本中定义一个双倍开关Two_Switches。
首先在Game_Enemy里,在class Game_Enemy < Game_Battler这条上面定义:Two_Switches == 1,这里面的“1”是第一号开关,可以自己随意更改。至于为什么要在Game_Enemy中定义,接着往下看。
    开关已经定义好了,那么就要设置双倍经验的效果了。在主程序里,每建立一个敌人角色,都会有相应的数值,既然建立敌人的时候,经验是我们自己输入的固定数值,那我们就应该在脚本中找到敌人全数值获取的脚本,而Game_Enemy这个脚本就是处理敌人的类。现在我们就要修改双倍经验了。
    在这个脚本中的172行我们能看到
  #--------------------------------------------------------------------------
  # ● 获取 EXP
  #--------------------------------------------------------------------------
  def exp
    return $data_enemies[@enemy_id].exp
    end
  end
这段脚本记录的就是单个敌人的经验,我们从这里入手。把刚才的双倍开关加到这里面来。改成以下的脚本文件。
  #--------------------------------------------------------------------------
  # ● 获取 EXP
  #--------------------------------------------------------------------------
  def exp
    if $game_switches[Two_Switches]
    return $data_enemies[@enemy_id].exp / $game_party.actors.size * 2
  else
    return $data_enemies[@enemy_id].exp / $game_party.actors.size
    end
  end
这个脚本里,if $game_switches[Two_Switches]这一条脚本的意思是如果当双倍经验开关为ON时。
return $data_enemies[@enemy_id].exp / $game_party.actors.size * 2 这条脚本的意思是输出战斗后,杀敌所得的经验== 敌人本身经验÷队伍人数×2,在这里顺便把经验均分也带入了,如果不想要经验均分的话,把return $data_enemies[@enemy_id].exp / $game_party.actors.size * 2改成return $data_enemies[@enemy_id].exp * 2就行,$game_party.actors.size就是队伍里的人物数量。
else是否则的意思,和前面的if构成if循环。
else下面的就是双倍经验开关为OFF的时候,经验为正常经验。同样,如果不想要经验均分的话,把 / $game_party.actors.size这条去掉就行了。
    好了,到这里我们设置的双倍经验就算基本完成了,如过想试试效果,可以去游戏中建立一个事件,把双倍经验开关打开,然后看看打开前和后的经验所得情况。
  好了,下面就让我们顺着上面的思路往下走,刚才我们修改了战斗后获取经验的脚本,但是却不能很好的控制,如果像上面那样,把开关开开,就会不分时间,一直有双倍效果,难道非得人为的拿事件控制吗?
  其实,我们的脚本还只是修改了一部分,剩下的还没完成。
  游戏里面的双倍经验都是用时间控制的,这个大家都知道,当时间为0秒的时候,双倍经验停止。
  那我们就可以用计时器控制。但是软件中的计时器并不是很好用,如果用过的应该有这样的感受,就是控制不是很方便。那我们就自己修改一下计时器脚本,来达到我们自己想要的效果。
  首先,对于一个游戏的双倍时间来说,最少领取时间为一小时,但是软件中的计时器却最多是一个小时,当计时器运行的时候显示为59:00,也就是说,领2小时的双倍经验也只能是一个小时的时间,我们就先把计时器显示这个脚本改一下,使它从00:00变成
00:00:00这个样子。
    首先在Sprite_Timer这个脚本中,找到
# 生成计时器显示用字符串
      min = @total_sec / 60
      sec = @total_sec % 60
      text = sprintf("%02d:%02d", min, sec)
这条脚本只有分min和秒sec却没有小时hour这个数值,那我们把它修改一下,改成下面的样子。
# 生成计时器显示用字符串
      hour = @total_sec / 60 / 60
      min = @total_sec / 60 % 60
      sec = @total_sec % 60
      text = sprintf("%2d:%02d:%02d", hour, min, sec)
改成这样就可以了,这样在游戏中显示的计时器就是00:00:00这个样子。
    但是这样还是不行的。在主程序中,设置计时器的时间最多也是60分,不能设为更多,那怎么才能叫它变成我们想要的呢?
    我们在Interpreter 4这个脚本中,找到190行,这个就是计时器在输出端的输出数值。内容如下:
  #--------------------------------------------------------------------------
  # ● 计时器操作
  #--------------------------------------------------------------------------
  def command_124
    # 开始的情况
    if @parameters[0] == 0
      $game_system.timer = @parameters[1] * Graphics.frame_rate
      $game_system.timer_working = true
    end
    # 停止的情况
    if @parameters[0] == 1
      $game_system.timer_working = false
    end
    # 继续
    return true
  end
我们把它改成下面这个样子就可以了:
  #--------------------------------------------------------------------------
  # ● 计时器操作
  #--------------------------------------------------------------------------
  def command_124
    # 开始的情况
    if @parameters[0] == 0
      $game_system.timer = @parameters[1] * Graphics.frame_rate * 10
      $game_system.timer_working = true
    end
    # 停止的情况
    if @parameters[0] == 1
      $game_system.timer_working = false
    end
    # 继续
    return true
  end
为什么要在设定的时间上乘10呢?因为这样就可以突破60分钟上限的限制了,如果你想领取1个小时的双,用计时器显示的话,可以在计时器设置的时候用6分钟就是一个小时,因为改完以后的脚本是你输入的数值乘10,如果2个小时,你只需要设置12分钟就可以,怎么样,很简单吧!
    像上面的修改应该算是已经完成了,但是有一个问题,不知道你们试完了发现没?
就是自己设置完计时器开启双倍了以后,当计时器的时间为0秒的时候,双倍却没有停止。而且为了一个双倍还占用一个公共事件,确实不是很好的办法。那有什么办法能叫它在0秒的时候自动停止呢?其实还真有一个办法能作到这一点。俗话说:羊毛出在羊身上,既然是计时器控制双倍时间,那我们还的从计时器脚本入手。
    在Sprite_Timer脚本里我们修改完的计时器显示脚本下面,也就是在:
      # 生成计时器显示用字符串
      hour = @total_sec / 60 / 60
      min = @total_sec / 60 % 60
      sec = @total_sec % 60
      text = sprintf("%2d:%02d:%02d", hour, min, sec)
      # 描绘计时器
下面,我们加上两行脚本,用来控制双倍时间的自动取消。内容如下:
        if $game_system.timer == 0
        # 更改双倍经验时间开关为OFF
        $game_switches[Two_Switches] = false
       end
这条脚本的意思就是当计时器秒数为0的时候,自动关闭双倍开关,这样我们就不用拿事件控制双倍时间的关闭了。去试一下效果吧!
    到这里,我们的双倍时间就修改完毕了。其实并不难,主要就是靠自己的思考和实践,其实同类的脚本修改还很多,比如在脚本中加变量控制什么的,大家自己多努力一下,很快就可以自己修改了。大家多多努力哦:)不会写脚本或者和鄙人一样懒的写脚本的同志们,就用这个方法自己改脚本吧:)不过改之前也要尊重一下脚本的作者,不要把人家的拿来改一下就说是自己的哦。

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3427
在线时间
3629 小时
注册时间
2006-9-6
帖子
37402

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2007-8-7 17:54:24 | 只看该作者
LZ满用心的,
很常,
我帮你整理一下改成直接插入就可以用。


  1. #--------------------------------------------------------------------------
  2. #        本脚本来源于66RPG 970029432制作 请保留此信息——BU 小柯
  3. #--------------------------------------------------------------------------
  4. # ● 获取 EXP
  5. #--------------------------------------------------------------------------
  6. def exp
  7.    return $data_enemies[@enemy_id].exp
  8.    end
  9. end
  10. #读取敌人经验
  11. #--------------------------------------------------------------------------
  12. # ● 获取 EXP
  13. #--------------------------------------------------------------------------
  14. def exp
  15.    if $game_switches[Two_Switches]
  16.    return $data_enemies[@enemy_id].exp / $game_party.actors.size * 2
  17. else
  18.    return $data_enemies[@enemy_id].exp / $game_party.actors.size
  19.    end
  20. end
  21. #-----------------------------------------------------------------------------
  22. #脚本里,if $game_switches[Two_Switches]#一条脚本的意思是如果当双倍经验开关为ON
  23. #turn $data_enemies[@enemy_id].exp / $game_party.actors.size * 2 #双倍经验
  24. #se下面的就是双倍经验开关为OFF的时候,经验为正常经验。同样,如果不想要经$ame_party.
  25. #actors.size这条去掉就行了。
  26. # 好了,到这里我们设置的双倍经验就算基本完成了,如过想试试效果,可以去游戏中建立一
  27. #事件,把双倍经验开关打开,然后看看打开前和后的经验所得情况。
  28. #了,下面就让我们顺着上面的思路往下走,刚才我们修改了战斗后获取经验的脚本,但是
  29. #--------------------------------------------------------------------------
  30. #        本脚本来源于66RPG 970029432制作 请保留此信息——BU 小柯
  31. #--------------------------------------------------------------------------
复制代码

我只把双倍经验的写出来。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2007-8-6
帖子
8
4
 楼主| 发表于 2007-8-8 05:15:37 | 只看该作者
呵呵,谢了,我这么写主要是给新手看的,呵呵,这样写能解释的清楚一点。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

冰の红苹果的小狗狗

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-15
帖子
2539
5
发表于 2008-1-9 01:50:21 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

心无天使

梦石
0
星屑
49
在线时间
0 小时
注册时间
2007-12-15
帖子
1016
6
发表于 2008-1-9 03:34:56 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

7
发表于 2008-1-9 19:38:52 | 只看该作者
BU 小柯?
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

8
发表于 2008-1-9 19:40:06 | 只看该作者
为了保险起见把Two_Switches == 1修改成$two_Switches == 1
定义为全局变量
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
55
在线时间
0 小时
注册时间
2008-1-3
帖子
1512
9
发表于 2008-1-9 19:42:56 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

青天

梦石
0
星屑
86
在线时间
232 小时
注册时间
2007-12-15
帖子
2091

开拓者

10
发表于 2008-1-13 18:06:53 | 只看该作者

    哇哇,可以的哦,抱走了。{/bz}
开坑准备中
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-7-22 19:55

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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