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

Project1

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

[已经过期] 3D旋转菜单脚本查看特技报错(追加悬赏200经验)

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
120 小时
注册时间
2011-9-25
帖子
11
跳转到指定楼层
1
发表于 2011-10-19 10:37:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 我卡了 于 2011-10-19 13:17 编辑

在站上找到一个关于3D旋转的菜单脚本,但是当点击查看特技是就出现了错误,希望高手帮忙修改下,
脚本分为3部分,就是分别放在3个脚本页面里
第一部分:3D旋转
  1. module Math2
  2.   #角度转弧度
  3.   def angleToRadian(angle)
  4.     return angle*(Math::PI/180)
  5.   end

  6.   #弧度转角度
  7.   def radianToAngle(radian)
  8.     return radian*(180/Math::PI)
  9.   end
  10.   
  11.   #计算正弦值
  12.   def sinD(angle)
  13.     return Math.sin(angleToRadian(angle))
  14.   end
  15.   
  16.   #计算余弦值
  17.   def cosD(angle)
  18.     return Math.cos(angleToRadian(angle))
  19.   end

  20.   #计算反正切
  21.   def atan2D(y, x)
  22.     return radianToAngle(Math.atan2(y, x))
  23.   end
  24. end


  25. class RotateMenu_3D
  26.   include Math2
  27.   
  28.   attr_accessor :menu_x
  29.   attr_accessor :menu_y
  30.   attr_accessor :disx
  31.   attr_accessor :disy
  32.   attr_accessor :speed
  33.   attr_accessor :active
  34.   attr_accessor :index

  35.   def initialize
  36.     @active=false
  37.     @menu_x=400
  38.     @menu_y=240
  39.    
  40.     @disx=180
  41.     @disy=10
  42.     @speed=0
  43.    
  44.     @endAngle=90
  45.     @tempAngle=0
  46.     @isRotating=true
  47.    
  48.     backImage=RPG::Cache.picture("back")
  49.    
  50.     @child_num=$game_party.actors.size
  51.     @menu_sprite=[]
  52.     @menu_bitmap=[]
  53.     @index=[]
  54.     for i in 0...$game_party.actors.size
  55.       @menu_bitmap[i]=Bitmap.new(backImage.width,backImage.height)
  56.       @menu_bitmap[i].blt(0,0,backImage,Rect.new(0,0,backImage.width,backImage.height))
  57.       
  58.       sprite=Sprite.new
  59.       sprite.bitmap=@menu_bitmap[i]
  60.       
  61.       sprite.ox=@menu_bitmap[i].width/2
  62.       sprite.oy=@menu_bitmap[i].height/2
  63.       sprite.visible=false
  64.       sprite.z=i+9990
  65.       
  66.       set_actor($game_party.actors[i],sprite)
  67.       
  68.       @menu_sprite.push([sprite,0,0]) #angle, y
  69.       
  70.       @index[i]=i
  71.       
  72.     end
  73.   end
  74.   
  75.   def update
  76.     if @isRotating == true
  77.       depthArray=[] #临时的
  78.       angle = 360 / @child_num
  79.       for z in 0...@child_num
  80.         mc=@menu_sprite[z][0]
  81.         mc.bitmap=@menu_bitmap[z]
  82.         
  83.         @menu_sprite[z][1] = @tempAngle + @speed + angle * z
  84.         @menu_sprite[z][2] = sinD(@menu_sprite[z][1]) * @disy
  85.         mc.x = (cosD(@menu_sprite[z][1]) * @disx + @menu_x).round
  86.         mc.y = @menu_sprite[z][2] + @menu_y
  87.         mc.visible=true
  88.         
  89.         depthArray[z] = [mc,@menu_sprite[z][2]] #mc, y
  90.         setProp(mc,"alpha",@menu_sprite[z][2])
  91.         setProp(mc,"scaleX",@menu_sprite[z][2],0.2,1)
  92.         setProp(mc,"scaleY",@menu_sprite[z][2],0.2,1)
  93.       end
  94.       
  95.       arrange(depthArray);  
  96.       ########
  97.       @speed += (@endAngle-@speed) * 0.2;  ######此处修改旋转速度
  98.       if ((@speed - @endAngle).abs < 0.1)
  99.         initAngle(false)
  100.         
  101.         if @moveDir==-1
  102.           [email protected]
  103.           @index.insert(0,last)
  104.         elsif @moveDir==1
  105.           [email protected]
  106.           @index.push(frist)
  107.         end
  108.         
  109.         @menu_sprite[@index[0]][0].flash(Color.new(255,255,255,255),40)
  110.         @frame=0
  111.       end
  112.     end
  113.     if @isRotating == false
  114.       @menu_sprite[@index[0]][0].update
  115.       
  116.       return if @active==false
  117.       
  118.       @frame+=1
  119.       return if @frame<=40
  120.       
  121.       if Input.trigger?(Input::LEFT)
  122.         @moveDir=-1
  123.         startRotation(@index[3]) #索引3
  124.       end
  125.       
  126.       if Input.trigger?(Input::RIGHT)
  127.         @moveDir=1
  128.         startRotation(@index[1]) #索引1
  129.       end
  130.     end
  131.   end
  132.   
  133. def startRotation(index)
  134.   currentIcon = @menu_sprite[index]
  135.   @endAngle = atan2D(currentIcon[2],cosD(currentIcon[1])*@disy)
  136. @endAngle = (@endAngle> -180 && @endAngle < -90)? -270 - @endAngle:90 - @endAngle
  137. initAngle(true)
  138. end

  139.   def dispose
  140.     for i in 0...@child_num
  141.       @menu_sprite[i][0].bitmap.dispose
  142.       @menu_sprite[i][0].dispose
  143.     end
  144.   end
  145.   
  146.   def active=(active)
  147.     @active=active
  148.     if @active==true
  149.       @menu_sprite[@index[0]][0].flash(Color.new(255,255,255,255),40)
  150.       @frame=0
  151.     end
  152.   end
  153.   
  154.   def initAngle(b)  
  155.           if (@isRotating)
  156.                   @tempAngle += @speed
  157.     end
  158.     @speed = 0
  159.     @isRotating = b
  160.   end

  161.   def arrange(depthArray)
  162.     depthArray.sort!{|a,b|a[1]<=>b[1]}
  163.     i = depthArray.size
  164.     while i>0
  165.       i-=1
  166.       depthArray[i][0].z=i+9990
  167.     end
  168.   end

  169.   def setProp(mc,prop,sy,n1=0.5,n2=1)
  170.     if prop=="alpha"
  171.       opacity = ((sy + 2 * @disy) / @disy - 1) / 2 * (n2 - n1) + n1
  172.       mc.opacity=opacity*255
  173.     elsif prop=="scaleX"
  174.       mc.zoom_x = ((sy + 2 * @disy) / @disy - 1) / 2 * (n2 - n1) + n1
  175.     elsif prop=="scaleY"
  176.       mc.zoom_y = ((sy + 2 * @disy) / @disy - 1) / 2 * (n2 - n1) + n1
  177.     end
  178.   end

  179.   def index
  180.     return @index[0]
  181.   end
  182.   
  183.   def set_actor(actor,sprite)
  184.    
  185.     bitmap = RPG::Cache.battler(actor.battler_name, actor.battler_hue)
  186.     src_rect=Rect.new(0,0,bitmap.width,bitmap.height)
  187.     sprite.bitmap.blt(10, 10, bitmap, src_rect)
  188.     sprite.bitmap.font.size=18
  189.    
  190.     sprite.bitmap.font.color = Color.new(192, 224, 255, 255)
  191.     sprite.bitmap.draw_text(128, 10, 24, 24, "Lv")
  192.     sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
  193.     sprite.bitmap.draw_text(128 + 24, 10, 24, 24, actor.level.to_s, 2)
  194.    
  195.     sprite.bitmap.draw_text(128, 36, 120, 24, actor.name)
  196.    
  197.     sprite.bitmap.draw_text(128, 62, 120, 24, actor.class_name)
  198.    
  199.    
  200.     text = make_battler_state_text(actor, 120, true)
  201.     if actor.hp == 0
  202.       sprite.bitmap.font.color = Color.new(255, 64, 0)
  203.     else
  204.       sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
  205.     end
  206.     sprite.bitmap.draw_text(128, 88, 120, 24, text)
  207.    
  208.    
  209.     sprite.bitmap.draw_text(16, 190, 24, 24, $data_system.words.hp)
  210.     if actor.hp == 0
  211.       sprite.bitmap.font.color = Color.new(255, 64, 0)
  212.     elsif actor.hp <= actor.maxhp / 4
  213.       sprite.bitmap.font.color = Color.new(255, 255, 64, 255)
  214.     else
  215.       sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
  216.     end
  217.     sprite.bitmap.draw_text(64,190,48,24,actor.hp.to_s, 2)
  218.     sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
  219.     sprite.bitmap.draw_text(64 + 48, 190, 12, 24, "/", 1)
  220.     sprite.bitmap.draw_text(64 + 60, 190, 48, 24, actor.maxhp.to_s)
  221.    
  222.    
  223.     sprite.bitmap.draw_text(16, 216, 24, 24, $data_system.words.sp)
  224.     if actor.sp == 0
  225.       sprite.bitmap.font.color = Color.new(255, 64, 0)
  226.     elsif actor.sp <= actor.maxsp / 4
  227.       sprite.bitmap.font.color = Color.new(255, 255, 64, 255)
  228.     else
  229.       sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
  230.     end
  231.     sprite.bitmap.draw_text(64,216,48,24,actor.sp.to_s, 2)
  232.     sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
  233.     sprite.bitmap.draw_text(64 + 48, 216, 12, 24, "/", 1)
  234.     sprite.bitmap.draw_text(64 + 60, 216, 48, 24, actor.maxsp.to_s)
  235.       
  236.   end
  237.   
  238.   def make_battler_state_text(battler, width, need_normal)
  239.     # 生成状态名字符串
  240.     text = ""
  241.     for i in battler.states
  242.       if $data_states[i].rating >= 1
  243.         if text == ""
  244.           text = $data_states[i].name
  245.         else
  246.           text = text + "/" + $data_states[i].name
  247.         end
  248.       end
  249.     end
  250.     # 状态名空的字符串是 "[正常]" 的情况下
  251.     if text == ""
  252.       if need_normal
  253.         text = "[正常]"
  254.       end
  255.     else
  256.       # 加上括号
  257.       text = "[" + text + "]"
  258.     end
  259.     # 返回完成后的文字类
  260.     return text
  261.   end
  262.   
  263. end
复制代码
#################################################
第二部分:★Window_MenuStatus
  1. class Window_MenuStatus < Window_Base
  2.   def initialize
  3.     super(0, 0, 480, 480)
  4.     self.contents = Bitmap.new(width - 32, height - 32)
  5.     self.active = false
  6.   end
  7. end
复制代码
#################################################
第三部分:★Scene_Menu
  1. #==============================================================================
  2. # ■ Scene_Menu
  3. #------------------------------------------------------------------------------
  4. #  处理菜单画面的类。
  5. #==============================================================================

  6. class Scene_Menu
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始化对像
  9.   #     menu_index : 命令光标的初期位置
  10.   #--------------------------------------------------------------------------
  11.   def initialize(menu_index = 0)
  12.     @menu_index = menu_index
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 主处理
  16.   #--------------------------------------------------------------------------
  17.   def main
  18.     # 生成命令窗口
  19.     s1 = $data_system.words.item
  20.     s2 = $data_system.words.skill
  21.     s3 = $data_system.words.equip
  22.     s4 = "状态"
  23.     s5 = "存档"
  24.     s6 = "结束游戏"
  25.     @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
  26.     @command_window.index = @menu_index
  27.     # 同伴人数为 0 的情况下
  28.     if $game_party.actors.size == 0
  29.       # 物品、特技、装备、状态无效化
  30.       @command_window.disable_item(0)
  31.       @command_window.disable_item(1)
  32.       @command_window.disable_item(2)
  33.       @command_window.disable_item(3)
  34.     end
  35.     # 禁止存档的情况下
  36.     if $game_system.save_disabled
  37.       # 存档无效
  38.       @command_window.disable_item(4)
  39.     end
  40.     # 生成游戏时间窗口
  41.     @playtime_window = Window_PlayTime.new
  42.     @playtime_window.x = 0
  43.     @playtime_window.y = 224
  44.     # 生成步数窗口
  45.     @steps_window = Window_Steps.new
  46.     @steps_window.x = 0
  47.     @steps_window.y = 320
  48.     # 生成金钱窗口
  49.     @gold_window = Window_Gold.new
  50.     @gold_window.x = 0
  51.     @gold_window.y = 416
  52.     # 生成状态窗口
  53.     @status_window = Window_MenuStatus.new
  54.     @status_window.x = 160
  55.     @status_window.y = 0
  56.    
  57.     # 生成3D Menu
  58.     @menu3D=RotateMenu_3D.new
  59.    
  60.     # 执行过渡
  61.    
  62.    Graphics.transition
  63.     # 主循环
  64.     loop do
  65.       # 刷新游戏画面
  66.       Graphics.update
  67.       # 刷新输入信息
  68.       Input.update
  69.       # 刷新画面
  70.       update
  71.       # 如果切换画面就中断循环
  72.       if $scene != self
  73.         break
  74.       end
  75.     end
  76.     # 准备过渡
  77.     Graphics.freeze
  78.     # 释放窗口
  79.     @command_window.dispose
  80.     @playtime_window.dispose
  81.     @steps_window.dispose
  82.     @gold_window.dispose
  83.     @status_window.dispose
  84.     @menu3D.dispose
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # ● 刷新画面
  88.   #--------------------------------------------------------------------------
  89.   def update
  90.     # 刷新窗口
  91.     @command_window.update
  92.     @playtime_window.update
  93.     @steps_window.update
  94.     @gold_window.update
  95.     @menu3D.update
  96.     # 命令窗口被激活的情况下: 调用 update_command
  97.     if @command_window.active
  98.       update_command
  99.       return
  100.     end
  101.     # 状态窗口被激活的情况下: 调用 update_status
  102.     if @menu3D.active
  103.       update_status
  104.       return
  105.     end
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # ● 刷新画面 (命令窗口被激活的情况下)
  109.   #--------------------------------------------------------------------------
  110.   def update_command
  111.     # 按下 B 键的情况下
  112.     if Input.trigger?(Input::B)
  113.       # 演奏取消 SE
  114.       $game_system.se_play($data_system.cancel_se)
  115.       # 切换的地图画面
  116.       $scene = Scene_Map.new
  117.       return
  118.     end
  119.     # 按下 C 键的情况下
  120.     if Input.trigger?(Input::C)
  121.       # 同伴人数为 0、存档、游戏结束以外的场合
  122.       if $game_party.actors.size == 0 and @command_window.index < 4
  123.         # 演奏冻结 SE
  124.         $game_system.se_play($data_system.buzzer_se)
  125.         return
  126.       end
  127.       # 命令窗口的光标位置分支
  128.       case @command_window.index
  129.       when 0  # 物品
  130.         # 演奏确定 SE
  131.         $game_system.se_play($data_system.decision_se)
  132.         # 切换到物品画面
  133.         $scene = Scene_Item.new
  134.       when 1  # 特技
  135.         # 演奏确定 SE
  136.         $game_system.se_play($data_system.decision_se)
  137.         # 激活状态窗口
  138.         @command_window.active = false
  139.         @menu3D.active = true
  140.       when 2  # 装备
  141.         # 演奏确定 SE
  142.         $game_system.se_play($data_system.decision_se)
  143.         # 激活状态窗口
  144.         @command_window.active = false
  145.         @menu3D.active = true
  146.       when 3  # 状态
  147.         # 演奏确定 SE
  148.         $game_system.se_play($data_system.decision_se)
  149.         # 激活状态窗口
  150.         @command_window.active = false
  151.         @menu3D.active = true
  152.       when 4  # 存档
  153.         # 禁止存档的情况下
  154.         if $game_system.save_disabled
  155.           # 演奏冻结 SE
  156.           $game_system.se_play($data_system.buzzer_se)
  157.           return
  158.         end
  159.         # 演奏确定 SE
  160.         $game_system.se_play($data_system.decision_se)
  161.         # 切换到存档画面
  162.         $scene = Scene_Save.new
  163.       when 5  # 游戏结束
  164.         # 演奏确定 SE
  165.         $game_system.se_play($data_system.decision_se)
  166.         # 切换到游戏结束画面
  167.         $scene = Scene_End.new
  168.       end
  169.       return
  170.     end
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # ● 刷新画面 (状态窗口被激活的情况下)
  174.   #--------------------------------------------------------------------------
  175.   def update_status
  176.     # 按下 B 键的情况下
  177.     if Input.trigger?(Input::B)
  178.       # 演奏取消 SE
  179.       $game_system.se_play($data_system.cancel_se)
  180.       # 激活命令窗口
  181.       @command_window.active = true
  182.       @menu3D.active = false
  183.       
  184.       return
  185.     end
  186.     # 按下 C 键的情况下
  187.     if Input.trigger?(Input::C)
  188.       # 命令窗口的光标位置分支
  189.       case @command_window.index
  190.    #############
  191.       when 1  # 特技
  192.       # 本角色的行动限制在 2 以上的情况下
  193.         if $game_party.actors[@status_window.index].restriction >= 2
  194.           # 演奏冻结 SE
  195.           $game_system.se_play($data_system.buzzer_se)
  196.          return
  197.      end
  198.        # 演奏确定 SE
  199.       $game_system.se_play($data_system.decision_se)
  200.         # 切换到特技画面
  201.         $scene = Scene_Skill.new(@menu3D.index)
  202.       #############
  203.         when 2  # 装备
  204.         # 演奏确定 SE
  205.         $game_system.se_play($data_system.decision_se)
  206.         # 切换的装备画面
  207.         $scene = Scene_Equip.new(@menu3D.index)
  208.       when 3  # 状态
  209.         # 演奏确定 SE
  210.         $game_system.se_play($data_system.decision_se)
  211.         # 切换到状态画面
  212.         $scene = Scene_Status.new(@menu3D.index)
  213.       end
  214.       return
  215.     end
  216.   end
  217. end
复制代码
另外,这篇脚本原来所在的帖子链接是http://rpg.blue/thread-207859-1-6.html
   dsu_plus_rewardpost_czw


我卡了于2011-10-19 12:16补充以下内容:
脚本在粘贴过来后,出现了表情图。。汗。。。请版主进来编辑一下吧。。。~~o(>_<)o ~~
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-11-27 14:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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