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

Project1

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

[原创发布] 仿3D旋转菜单

[复制链接]

Lv1.梦旅人

梦石
0
星屑
60
在线时间
66 小时
注册时间
2011-5-25
帖子
73
跳转到指定楼层
1
发表于 2011-9-2 13:34:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
3D游戏大家也见过很多了,机品飞车,孤岛危机这些游戏都是,
这种效果是通过使用复杂的数学公式来产生的一种透视的效果。
由于RMXP是2D游戏引擎,因此无法做出真实的3D效果,但是通
过一些简单的数学公式也可以产生比较简单的3D透视感觉。
本人做了个仿3D的旋转菜单,以供参考:
如图:




核心代码:
  1. #--------------------------------------------------------------------------

  2. # ● 仿3D旋转菜单效果

  3. # 制作者  小飞侠_shoed
  4. #---------------------------------------------------------------------------

  5. module Math2
  6.   #角度转弧度
  7.   def angleToRadian(angle)
  8.     return angle*(Math::PI/180)
  9.   end

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

  24.   #计算反正切
  25.   def atan2D(y, x)
  26.     return radianToAngle(Math.atan2(y, x))
  27.   end
  28. end


  29. class RotateMenu_3D
  30.   include Math2
  31.   
  32.   attr_accessor :menu_x
  33.   attr_accessor :menu_y
  34.   attr_accessor :disx
  35.   attr_accessor :disy
  36.   attr_accessor :speed
  37.   attr_accessor :active
  38.   attr_accessor :index

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

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

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

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

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

评分

参与人数 1星屑 +14 收起 理由
各种压力的猫君 + 14 机品飞车 &gt;V&lt;

查看全部评分

Lv4.逐梦者

梦石
8
星屑
2779
在线时间
1605 小时
注册时间
2010-10-22
帖子
1059

极短25获奖

2
发表于 2011-9-2 14:26:56 | 只看该作者
如此,在下便厚着脸皮收下了。
【2022.06.03】原本以为已经不可能再找回来的东西重新找回来了,原本一直念念不忘的坑终于再一次拿起铲子了。一别竟近10年,你好,我的世界我的梦。
【不可阻挡】异元-地劫黎明
回复 支持 反对

使用道具 举报

Lv4.逐梦者

永久原子

梦石
18
星屑
175
在线时间
2054 小时
注册时间
2010-10-25
帖子
4226

开拓者

3
发表于 2011-9-2 15:54:43 | 只看该作者
不得不顶,的确很好,不过MS缺陷很多,我点特技就发生脚本错误
人不在了,有事烧纸。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
152 小时
注册时间
2011-2-2
帖子
195
4
发表于 2011-9-2 16:35:49 | 只看该作者
感觉不美观 而且反操作起来不方便 希望LZ能弄出更好的
资源论坛←点击进入游戏讨论欢迎你的加入 中秋论坛活动欢迎大家加入
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
135 小时
注册时间
2011-8-1
帖子
188
5
发表于 2011-9-2 16:45:48 | 只看该作者
同意LS,而且觉得太小了,大点更好,最好像iPhone一样,可以斜着。这样很省空间

세상은 너무 미쳐있다
回复 支持 反对

使用道具 举报

Lv2.观梦者

(?????)

梦石
0
星屑
729
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

6
发表于 2011-9-2 17:39:14 | 只看该作者

↑类似这样?(=3= 吐槽我涂鸦水平的都去死一万次)

点评

我死一万次去……  发表于 2011-9-2 18:29
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

7
发表于 2011-9-2 18:36:33 | 只看该作者
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
139 小时
注册时间
2011-7-18
帖子
208
8
发表于 2011-9-11 22:19:25 | 只看该作者
卡着费时,不顺手……
比如换个角色闪一下,要等待,不够流畅。
比如装备、状态等,要点击之后才能更换角色……,然后后退才能换菜单,不够流畅。
效果是做出来了,玩家玩起来没那么爽快啊……
半途而废的游戏,等于0。

令人怀念的新手处女作《梦之祭1.01》,挂着跑……
http://rpg.blue/thread-194089-1-1.html
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

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

9
发表于 2011-9-11 22:39:32 | 只看该作者
我一直不明白换装备选择人显示HP和SP什么的干嘛……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
123 小时
注册时间
2012-2-12
帖子
73
10
发表于 2012-4-7 14:27:31 | 只看该作者
怎么取消选人是的闪烁和等待啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 06:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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