Project1
标题:
3D旋转菜单脚本查看特技报错(追加悬赏200经验)
[打印本页]
作者:
我卡了
时间:
2011-10-19 10:37
标题:
3D旋转菜单脚本查看特技报错(追加悬赏200经验)
本帖最后由 我卡了 于 2011-10-19 13:17 编辑
在站上找到一个关于3D旋转的菜单脚本,但是当点击查看特技是就出现了错误,希望高手帮忙修改下,
脚本分为3部分,就是分别放在3个脚本页面里
第一部分:3D旋转
module Math2
#角度转弧度
def angleToRadian(angle)
return angle*(Math::PI/180)
end
#弧度转角度
def radianToAngle(radian)
return radian*(180/Math::PI)
end
#计算正弦值
def sinD(angle)
return Math.sin(angleToRadian(angle))
end
#计算余弦值
def cosD(angle)
return Math.cos(angleToRadian(angle))
end
#计算反正切
def atan2D(y, x)
return radianToAngle(Math.atan2(y, x))
end
end
class RotateMenu_3D
include Math2
attr_accessor :menu_x
attr_accessor :menu_y
attr_accessor :disx
attr_accessor :disy
attr_accessor :speed
attr_accessor :active
attr_accessor :index
def initialize
@active=false
@menu_x=400
@menu_y=240
@disx=180
@disy=10
@speed=0
@endAngle=90
@tempAngle=0
@isRotating=true
backImage=RPG::Cache.picture("back")
@child_num=$game_party.actors.size
@menu_sprite=[]
@menu_bitmap=[]
@index=[]
for i in 0...$game_party.actors.size
@menu_bitmap[i]=Bitmap.new(backImage.width,backImage.height)
@menu_bitmap[i].blt(0,0,backImage,Rect.new(0,0,backImage.width,backImage.height))
sprite=Sprite.new
sprite.bitmap=@menu_bitmap[i]
sprite.ox=@menu_bitmap[i].width/2
sprite.oy=@menu_bitmap[i].height/2
sprite.visible=false
sprite.z=i+9990
set_actor($game_party.actors[i],sprite)
@menu_sprite.push([sprite,0,0]) #angle, y
@index[i]=i
end
end
def update
if @isRotating == true
depthArray=[] #临时的
angle = 360 / @child_num
for z in 0...@child_num
mc=@menu_sprite[z][0]
mc.bitmap=@menu_bitmap[z]
@menu_sprite[z][1] = @tempAngle + @speed + angle * z
@menu_sprite[z][2] = sinD(@menu_sprite[z][1]) * @disy
mc.x = (cosD(@menu_sprite[z][1]) * @disx + @menu_x).round
mc.y = @menu_sprite[z][2] + @menu_y
mc.visible=true
depthArray[z] = [mc,@menu_sprite[z][2]] #mc, y
setProp(mc,"alpha",@menu_sprite[z][2])
setProp(mc,"scaleX",@menu_sprite[z][2],0.2,1)
setProp(mc,"scaleY",@menu_sprite[z][2],0.2,1)
end
arrange(depthArray);
########
@speed += (@endAngle-@speed) * 0.2; ######此处修改旋转速度
if ((@speed - @endAngle).abs < 0.1)
initAngle(false)
if @moveDir==-1
[email protected]
@index.insert(0,last)
elsif @moveDir==1
[email protected]
@index.push(frist)
end
@menu_sprite[@index[0]][0].flash(Color.new(255,255,255,255),40)
@frame=0
end
end
if @isRotating == false
@menu_sprite[@index[0]][0].update
return if @active==false
@frame+=1
return if @frame<=40
if Input.trigger?(Input::LEFT)
@moveDir=-1
startRotation(@index[3]) #索引3
end
if Input.trigger?(Input::RIGHT)
@moveDir=1
startRotation(@index[1]) #索引1
end
end
end
def startRotation(index)
currentIcon = @menu_sprite[index]
@endAngle = atan2D(currentIcon[2],cosD(currentIcon[1])*@disy)
@endAngle = (@endAngle> -180 && @endAngle < -90)? -270 - @endAngle:90 - @endAngle
initAngle(true)
end
def dispose
for i in 0...@child_num
@menu_sprite[i][0].bitmap.dispose
@menu_sprite[i][0].dispose
end
end
def active=(active)
@active=active
if @active==true
@menu_sprite[@index[0]][0].flash(Color.new(255,255,255,255),40)
@frame=0
end
end
def initAngle(b)
if (@isRotating)
@tempAngle += @speed
end
@speed = 0
@isRotating = b
end
def arrange(depthArray)
depthArray.sort!{|a,b|a[1]<=>b[1]}
i = depthArray.size
while i>0
i-=1
depthArray[i][0].z=i+9990
end
end
def setProp(mc,prop,sy,n1=0.5,n2=1)
if prop=="alpha"
opacity = ((sy + 2 * @disy) / @disy - 1) / 2 * (n2 - n1) + n1
mc.opacity=opacity*255
elsif prop=="scaleX"
mc.zoom_x = ((sy + 2 * @disy) / @disy - 1) / 2 * (n2 - n1) + n1
elsif prop=="scaleY"
mc.zoom_y = ((sy + 2 * @disy) / @disy - 1) / 2 * (n2 - n1) + n1
end
end
def index
return @index[0]
end
def set_actor(actor,sprite)
bitmap = RPG::Cache.battler(actor.battler_name, actor.battler_hue)
src_rect=Rect.new(0,0,bitmap.width,bitmap.height)
sprite.bitmap.blt(10, 10, bitmap, src_rect)
sprite.bitmap.font.size=18
sprite.bitmap.font.color = Color.new(192, 224, 255, 255)
sprite.bitmap.draw_text(128, 10, 24, 24, "Lv")
sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
sprite.bitmap.draw_text(128 + 24, 10, 24, 24, actor.level.to_s, 2)
sprite.bitmap.draw_text(128, 36, 120, 24, actor.name)
sprite.bitmap.draw_text(128, 62, 120, 24, actor.class_name)
text = make_battler_state_text(actor, 120, true)
if actor.hp == 0
sprite.bitmap.font.color = Color.new(255, 64, 0)
else
sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
end
sprite.bitmap.draw_text(128, 88, 120, 24, text)
sprite.bitmap.draw_text(16, 190, 24, 24, $data_system.words.hp)
if actor.hp == 0
sprite.bitmap.font.color = Color.new(255, 64, 0)
elsif actor.hp <= actor.maxhp / 4
sprite.bitmap.font.color = Color.new(255, 255, 64, 255)
else
sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
end
sprite.bitmap.draw_text(64,190,48,24,actor.hp.to_s, 2)
sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
sprite.bitmap.draw_text(64 + 48, 190, 12, 24, "/", 1)
sprite.bitmap.draw_text(64 + 60, 190, 48, 24, actor.maxhp.to_s)
sprite.bitmap.draw_text(16, 216, 24, 24, $data_system.words.sp)
if actor.sp == 0
sprite.bitmap.font.color = Color.new(255, 64, 0)
elsif actor.sp <= actor.maxsp / 4
sprite.bitmap.font.color = Color.new(255, 255, 64, 255)
else
sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
end
sprite.bitmap.draw_text(64,216,48,24,actor.sp.to_s, 2)
sprite.bitmap.font.color = Color.new(255, 255, 255, 255)
sprite.bitmap.draw_text(64 + 48, 216, 12, 24, "/", 1)
sprite.bitmap.draw_text(64 + 60, 216, 48, 24, actor.maxsp.to_s)
end
def make_battler_state_text(battler, width, need_normal)
# 生成状态名字符串
text = ""
for i in battler.states
if $data_states[i].rating >= 1
if text == ""
text = $data_states[i].name
else
text = text + "/" + $data_states[i].name
end
end
end
# 状态名空的字符串是 "[正常]" 的情况下
if text == ""
if need_normal
text = "[正常]"
end
else
# 加上括号
text = "[" + text + "]"
end
# 返回完成后的文字类
return text
end
end
复制代码
#################################################
第二部分:★Window_MenuStatus
class Window_MenuStatus < Window_Base
def initialize
super(0, 0, 480, 480)
self.contents = Bitmap.new(width - 32, height - 32)
self.active = false
end
end
复制代码
#################################################
第三部分:★Scene_Menu
#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
# 处理菜单画面的类。
#==============================================================================
class Scene_Menu
#--------------------------------------------------------------------------
# ● 初始化对像
# menu_index : 命令光标的初期位置
#--------------------------------------------------------------------------
def initialize(menu_index = 0)
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
# 生成命令窗口
s1 = $data_system.words.item
s2 = $data_system.words.skill
s3 = $data_system.words.equip
s4 = "状态"
s5 = "存档"
s6 = "结束游戏"
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
@command_window.index = @menu_index
# 同伴人数为 0 的情况下
if $game_party.actors.size == 0
# 物品、特技、装备、状态无效化
@command_window.disable_item(0)
@command_window.disable_item(1)
@command_window.disable_item(2)
@command_window.disable_item(3)
end
# 禁止存档的情况下
if $game_system.save_disabled
# 存档无效
@command_window.disable_item(4)
end
# 生成游戏时间窗口
@playtime_window = Window_PlayTime.new
@playtime_window.x = 0
@playtime_window.y = 224
# 生成步数窗口
@steps_window = Window_Steps.new
@steps_window.x = 0
@steps_window.y = 320
# 生成金钱窗口
@gold_window = Window_Gold.new
@gold_window.x = 0
@gold_window.y = 416
# 生成状态窗口
@status_window = Window_MenuStatus.new
@status_window.x = 160
@status_window.y = 0
# 生成3D Menu
@menu3D=RotateMenu_3D.new
# 执行过渡
Graphics.transition
# 主循环
loop do
# 刷新游戏画面
Graphics.update
# 刷新输入信息
Input.update
# 刷新画面
update
# 如果切换画面就中断循环
if $scene != self
break
end
end
# 准备过渡
Graphics.freeze
# 释放窗口
@command_window.dispose
@playtime_window.dispose
@steps_window.dispose
@gold_window.dispose
@status_window.dispose
@menu3D.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
# 刷新窗口
@command_window.update
@playtime_window.update
@steps_window.update
@gold_window.update
@menu3D.update
# 命令窗口被激活的情况下: 调用 update_command
if @command_window.active
update_command
return
end
# 状态窗口被激活的情况下: 调用 update_status
if @menu3D.active
update_status
return
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (命令窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_command
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 切换的地图画面
$scene = Scene_Map.new
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 同伴人数为 0、存档、游戏结束以外的场合
if $game_party.actors.size == 0 and @command_window.index < 4
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 命令窗口的光标位置分支
case @command_window.index
when 0 # 物品
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到物品画面
$scene = Scene_Item.new
when 1 # 特技
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 激活状态窗口
@command_window.active = false
@menu3D.active = true
when 2 # 装备
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 激活状态窗口
@command_window.active = false
@menu3D.active = true
when 3 # 状态
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 激活状态窗口
@command_window.active = false
@menu3D.active = true
when 4 # 存档
# 禁止存档的情况下
if $game_system.save_disabled
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到存档画面
$scene = Scene_Save.new
when 5 # 游戏结束
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到游戏结束画面
$scene = Scene_End.new
end
return
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (状态窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_status
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 激活命令窗口
@command_window.active = true
@menu3D.active = false
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 命令窗口的光标位置分支
case @command_window.index
#############
when 1 # 特技
# 本角色的行动限制在 2 以上的情况下
if $game_party.actors[@status_window.index].restriction >= 2
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到特技画面
$scene = Scene_Skill.new(@menu3D.index)
#############
when 2 # 装备
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换的装备画面
$scene = Scene_Equip.new(@menu3D.index)
when 3 # 状态
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到状态画面
$scene = Scene_Status.new(@menu3D.index)
end
return
end
end
end
复制代码
另外,这篇脚本原来所在的帖子链接是
http://rpg.blue/thread-207859-1-6.html
dsu_plus_rewardpost_czw
我卡了于2011-10-19 12:16补充以下内容:
脚本在粘贴过来后,出现了表情图。。汗。。。请版主进来编辑一下吧。。。~~o(>_<)o ~~ dsu_plus_rewardpost_czw
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1