Project1

标题: 〓 转盘抽奖 〓 [打印本页]

作者: 芯☆淡茹水    时间: 2018-11-19 23:11
标题: 〓 转盘抽奖 〓
本帖最后由 芯☆淡茹水 于 2018-11-19 23:51 编辑

   很久没冒泡了,就拿这个来水一贴。

   以前写的 转盘抽奖 ,觉得不是很好,老早就全部推翻重新写了,但搁在那儿都快忘了。
今天偶然发现了,正好,加上说明就拿出来水咯。

〓 说明 〓
1,抽奖物品全部编辑在公共事件里。
2,游戏中可随时增/减随机的转盘物品。
3,可随时更改抽奖所消耗的东西(金钱/物品)。
4,素材来源=>网络

〓 用法 〓
1,将下面的 脚本 复制到工程 main 前。
2,将下面的 UI图片 下载后,复制到 Graphics\Pictures 文件夹里。
3,参照脚本说明,进行操作。
4,嫌麻烦的同学,可以直接下载下面的范例工程。

〓 演示截图 〓



〓 UI图片 〓



〓 脚本 〓
RUBY 代码复制
  1. #==============================================================================
  2. # 〓 转盘抽奖 (Lottery draw) 〓            Author: 芯☆淡茹水
  3. #==============================================================================
  4. # ■ 说明 ■
  5. #--------------------------------------------------------------------------
  6. # 1,  该转盘抽奖利用公共事件储存抽奖物品,分为 基本物品(设置项设置) 和
  7. #    动态物品(脚本命令添加/删除)两种。
  8. #      转盘上能够随机的物品为以上两种相加。
  9. #--------------------------------------------------------------------------
  10. # 2,  公共事件里编辑 增减物品,增减武器 或 增减防具 。当这个公共事件在物品
  11. #    事件里时,里面的这些项目物品都将添加到转盘的随机物品中。
  12. #--------------------------------------------------------------------------
  13. # 3,  如果总共的随机物品当中有 珍贵物品 时,随机时至少有一件会是 珍贵物品 。
  14. #    其它出现 珍贵物品 概率,依照设置项所设置的概率百分比。
  15. #--------------------------------------------------------------------------
  16. # 4,  进入抽奖场景,而未进行抽奖的,系统将储存当前转盘物品,防止进出抽奖场景
  17. #    刷物品。
  18. #--------------------------------------------------------------------------
  19. # 5,  初始抽奖消耗为 金钱=>100 ,可用脚本命令适时更改。
  20. #==============================================================================
  21. # ■ 脚本命令 ■
  22. #--------------------------------------------------------------------------
  23. # 1,开始转盘抽奖 => XdRs_Ld.start_lottery_draw
  24. #--------------------------------------------------------------------------
  25. # 2,添加公共事件(设置有随机物品)里的所有物品到随机物品 =>
  26. #    XdRs_Ld.add_ld_event(event_id, type)
  27. #    参数  event_id: 公共事件ID。
  28. #          type    : 添加的类型(0:添加到普通物品; 1:添加到珍贵物品)
  29. #    例:将 22 号公共事件里编辑的所有物品,添加到普通的随机物品中 =>
  30. #        XdRs_Ld.add_ld_event(22, 0)
  31. #        将 15 号公共事件里编辑的所有物品,添加到珍贵的随机物品中 =>
  32. #        XdRs_Ld.add_ld_event(15, 1)
  33. #--------------------------------------------------------------------------
  34. # 3,将添加的公共事件里的所有物品从随机物品中删除 =>
  35. #    XdRs_Ld.del_ld_event(event_id, type)
  36. #    参数同第 2 条。
  37. #--------------------------------------------------------------------------
  38. # 4,清空所有第 2 条添加的公共事件 => XdRs_Ld.clear_ld_events
  39. #--------------------------------------------------------------------------
  40. # 5,清除系统所记忆的转盘物品 =>  XdRs_Ld.clear_ld_data
  41. #--------------------------------------------------------------------------
  42. # 6,更改抽奖所需的消耗品 => XdRs_Ld.change_consume(type, num1, num2)
  43. #    参数  type: 消耗类型(0:金钱;1:物品)
  44. #          num1: 数值1,消耗类型为 0(金钱)时,写所需的金钱数;
  45. #                       消耗类型为 1(物品)时,写物品ID。
  46. #          num2: 数值2,消耗类型为 0(金钱)时,省略不写;
  47. #                       消耗类型为 1(物品)时,写所需的数量。
  48. #    例:设置抽奖消耗金钱 500 => XdRs_Ld.change_consume(0, 500)
  49. #        设置抽奖消耗 10 号物品 3 个 => XdRs_Ld.change_consume(1, 10, 3)
  50. #==============================================================================
  51. #==============================================================================
  52. module XdRs_Ld
  53. #==============================================================================
  54. # ■ 设置项 ■
  55. #==============================================================================
  56. #--------------------------------------------------------------------------
  57. # 游戏分辨率宽。
  58. Graphics_Width = 640
  59.  
  60. #--------------------------------------------------------------------------
  61. # 游戏分辨率高。
  62. Graphics_Height = 480
  63.  
  64. #--------------------------------------------------------------------------
  65. # 基本普通抽奖物品的公共事件ID。
  66. Base_Ordinary = 10
  67.  
  68. #--------------------------------------------------------------------------
  69. # 基本珍贵抽奖物品的公共事件ID。
  70. Base_Precious = 11
  71.  
  72. #--------------------------------------------------------------------------
  73. # 转盘出现珍贵物品的概率百分比。
  74. Precious_Rate = 10
  75.  
  76. #--------------------------------------------------------------------------
  77. # 金钱图标名。
  78. Gold_Icon = "035-Item04"
  79.  
  80. #--------------------------------------------------------------------------
  81. # 得到奖品时播放的动画ID。
  82. Award_Anm = 46
  83.  
  84. #--------------------------------------------------------------------------
  85. # 指针转动时,播放的SE。
  86. Needle_Se = "041-Knock02"
  87.  
  88. #--------------------------------------------------------------------------
  89. end
  90. #==============================================================================
  91. # ■ 脚本正文 ■
  92. #==============================================================================
  93. module XdRs_Ld
  94.   #--------------------------------------------------------------------------
  95.   def self.ui_name
  96.     return "Ui_LotteryDraw"    #UI图片名
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # 闪烁灯位置
  100.   #--------------------------------------------------------------------------
  101.   def self.lamp_place(index)
  102.     return [[201,21],[264,70],[289,156],[263,234],[196,283],[101,282],
  103.     [31,222],[11,144],[39,67],[103,18]][index]
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # 物品图标位置
  107.   #--------------------------------------------------------------------------
  108.   def self.item_place(index)
  109.     return [[182,52],[230,92],[250,150],[230,210],[182,248],[120,248],
  110.     [68,210],[46,150],[68,92],[120,52]][index]
  111.   end
  112.   #--------------------------------------------------------------------------
  113.   def self.has_ld_items
  114.     data = [[Base_Ordinary], [Base_Precious]]
  115.     data[0] += $game_system.ld_data[0]
  116.     data[1] += $game_system.ld_data[1]
  117.     return data.any?{|d| self.type_has_ld_items(d)}
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   def self.type_has_ld_items(data)
  121.     return data.any?{|id| self.ld_list(id).size > 0}
  122.   end
  123.   #--------------------------------------------------------------------------
  124.   def self.ld_items
  125.     data = []
  126.     base = [[Base_Ordinary], [Base_Precious]]
  127.     data[0] = self.type_items(0, base) + self.type_items(0, $game_system.ld_data)
  128.     data[1] = self.type_items(1, base) + self.type_items(1, $game_system.ld_data)
  129.     return data
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   def self.type_items(type, data)
  133.     items = []
  134.     data[type].size.times do |i|
  135.       list = self.ld_list(data[type][i])
  136.       list.each{|l| items << Ld_Item.new(self.item_obj(l))}
  137.     end
  138.     return items
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   def self.ld_list(eventId)
  142.     event = $data_common_events[eventId]
  143.     return event.list.find_all{|l| [126,127,128].include?(l.code)}
  144.   end
  145.   #--------------------------------------------------------------------------
  146.   def self.item_obj(list)
  147.     case list.code
  148.     when 126; return $data_items[list.parameters[0]]
  149.     when 127; return $data_weapons[list.parameters[0]]
  150.     when 128; return $data_armors[list.parameters[0]]
  151.     end
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   def self.lnitial_consumption
  155.     return ["gold", [100]]    #初始抽奖消耗:金钱=>100
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   def self.can_ld_start
  159.     cst = $game_system.consumption_data
  160.     return $game_party.gold >= cst[1][0] if cst[0] == "gold"
  161.     return $game_party.item_number(cst[1][0]) >= cst[1][1]
  162.   end
  163.   #--------------------------------------------------------------------------
  164.   def self.deductible
  165.     cst = $game_system.consumption_data
  166.     tp = cst[0]; d = cst[1][0]; n = cst[1][1]
  167.     tp == "gold" ? $game_party.lose_gold(d) : $game_party.gain_item(d, -n)
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   def self.start_lottery_draw
  171.     unless self.has_ld_items
  172.       $game_temp.message_text = "没有抽奖物品,暂时无法抽奖!"
  173.       return
  174.     end
  175.     $scene = Lottery_Draw.new
  176.   end
  177.   #--------------------------------------------------------------------------
  178.   def self.add_ld_event(event_id, type=0)
  179.     return if type > 1
  180.     $game_system.set_ld_events(event_id, "add", type)
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   def self.del_ld_event(event_id, type=0)
  184.     return if type > 1
  185.     $game_system.set_ld_events(event_id, "del", type)
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   def self.clear_ld_data
  189.     $game_system.save_ld_items([])
  190.   end
  191.   #--------------------------------------------------------------------------
  192.   def self.clear_ld_events
  193.     $game_system.clear_all_ld_events
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   def self.change_consume(type, num1, num2=0)
  197.     return if type == 0 && num1 <= 0
  198.     return if type == 1 && (!$data_items[num1] || num2 <= 0)
  199.     $game_system.set_consumption(type == 0 ? "gold" : "item", [num1,num2])
  200.   end
  201. end
  202. #==============================================================================
  203. # 转换物品实例,减少数据容量
  204. #==============================================================================
  205. class Ld_Item
  206.   #--------------------------------------------------------------------------
  207.   def initialize(item)
  208.     @data_id = item.id
  209.     set_type(item)
  210.   end
  211.   #--------------------------------------------------------------------------
  212.   def set_type(item)
  213.     @item_type = case item
  214.     when RPG::Item   ;"item"
  215.     when RPG::Weapon ;"weapon"
  216.     when RPG::Armor  ;"armor"
  217.     end
  218.   end
  219.   #--------------------------------------------------------------------------
  220.   def obj
  221.     case @item_type
  222.     when "item";   return $data_items[@data_id]
  223.     when "weapon"; return $data_weapons[@data_id]
  224.     when "armor";  return $data_armors[@data_id]
  225.     end
  226.   end
  227. end
  228. #==============================================================================
  229. # 添加抽奖所需的各种记录
  230. #==============================================================================
  231. class Game_System
  232.   #--------------------------------------------------------------------------
  233.   def ld_data;         return @ld_data  || [[],[]];  end
  234.   #--------------------------------------------------------------------------
  235.   def ld_items;        return @ld_items || [];       end
  236.   #--------------------------------------------------------------------------
  237.   def has_ld_item;     return ld_items.size > 0;     end
  238.   #--------------------------------------------------------------------------
  239.   def save_ld_items(items); @ld_items = items;       end
  240.   #--------------------------------------------------------------------------
  241.   def set_ld_events(event_id, type, n)
  242.     @ld_data ||= [[],[]]
  243.     return if type == "add" && @ld_data[n].include?(event_id)
  244.     return if type == "del" && !@ld_data[n].include?(event_id)
  245.     type == "add" && @ld_data[n].push(event_id)
  246.     type == "del" && @ld_data[n].delete(event_id)
  247.     save_ld_items([])
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   def consumption_data
  251.     return @consumption_data || XdRs_Ld.lnitial_consumption
  252.   end
  253.   #--------------------------------------------------------------------------
  254.   def set_consumption(type, data)
  255.     @consumption_data = [type, data]
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   def clear_all_ld_events
  259.     @ld_data = nil
  260.   end
  261. end
  262. #==============================================================================
  263. # 图片窗口
  264. #==============================================================================
  265. class XdRs_UiBase < RPG::Sprite
  266.   #--------------------------------------------------------------------------
  267.   def initialize(x, y, ui_name, rect, viewport=nil)
  268.     super(viewport)
  269.     @ui_name = ui_name
  270.     create_all(rect)
  271.     set_rect(rect)
  272.     move(x, y)
  273.   end
  274.   #--------------------------------------------------------------------------
  275.   def dispose
  276.     @drawing_board.bitmap.dispose
  277.     @drawing_board.dispose
  278.     self.bitmap.dispose
  279.     super
  280.   end
  281.   #--------------------------------------------------------------------------
  282.   def create_all(rect)
  283.     self.bitmap = @ui_name == "" ? Bitmap.new(rect.width, rect.height) :
  284.     RPG::Cache.picture(@ui_name)
  285.     @drawing_board = Sprite.new
  286.   end
  287.   #--------------------------------------------------------------------------
  288.   def set_rect(rect)
  289.     if @rect != rect
  290.       @rect = rect
  291.       refresh_rect
  292.     end
  293.   end
  294.   #--------------------------------------------------------------------------
  295.   def refresh_rect
  296.     self.src_rect.set(@rect.x, @rect.y, @rect.width, @rect.height)
  297.     @drawing_board.bitmap && @drawing_board.bitmap.dispose
  298.     @drawing_board.bitmap = Bitmap.new(@rect.width, @rect.height)
  299.     @drawing_board.bitmap.font.bold = true
  300.   end
  301.   #--------------------------------------------------------------------------
  302.   def move(x, y, z=nil)
  303.     self.x = @drawing_board.x = x
  304.     self.y = @drawing_board.y = y
  305.     return unless z
  306.     self.z = z; @drawing_board.z = z + 1
  307.   end
  308.   #--------------------------------------------------------------------------
  309.   def hide;  self.visible = @drawing_board.visible = false;    end
  310.   #--------------------------------------------------------------------------
  311.   def show;  self.visible = @drawing_board.visible = true;     end
  312.   #--------------------------------------------------------------------------
  313.   # 文字描边宽度
  314.   #--------------------------------------------------------------------------
  315.   def out_line_width;    return 2;                             end
  316.   #--------------------------------------------------------------------------
  317.   # 图标尺寸(宽与高)
  318.   #--------------------------------------------------------------------------
  319.   def icon_size;         return 24;                            end
  320.   #--------------------------------------------------------------------------
  321.   def clear;             @drawing_board.bitmap.clear;          end
  322.   #--------------------------------------------------------------------------
  323.   def set_font_size(n);  @drawing_board.bitmap.font.size = n;  end
  324.   #--------------------------------------------------------------------------
  325.   def set_font_color(c); @drawing_board.bitmap.font.color = c; end
  326.   #--------------------------------------------------------------------------
  327.   def draw_text(x, y, w, h, text, a=0)
  328.     last_color = @drawing_board.bitmap.font.color.clone
  329.     ow = out_line_width
  330.     set_font_color(Color.new(0,0,0,160))
  331.     @drawing_board.bitmap.draw_text(x+ow, y, w, h, text, a)
  332.     @drawing_board.bitmap.draw_text(x-ow, y, w, h, text, a)
  333.     @drawing_board.bitmap.draw_text(x, y+ow, w, h, text, a)
  334.     @drawing_board.bitmap.draw_text(x, y-ow, w, h, text, a)
  335.     set_font_color(last_color)
  336.     @drawing_board.bitmap.draw_text(x, y, w, h, text, a)
  337.   end
  338.   #--------------------------------------------------------------------------
  339.   def draw_icon(x, y, icon_name)
  340.     size = icon_size
  341.     blt_image(x, y, Rect.new(0, 0, size, size), RPG::Cache.icon(icon_name))
  342.   end
  343.   #--------------------------------------------------------------------------
  344.   def blt(x, y, rect, image_name=nil)
  345.     blt_image(x, y, rect, RPG::Cache.picture(image_name || @ui_name))
  346.   end
  347.   #--------------------------------------------------------------------------
  348.   def blt_image(x, y, rect, image)
  349.     @drawing_board.bitmap.blt(x, y, image, rect)
  350.   end
  351.   #--------------------------------------------------------------------------
  352.   def draw_item(x, y, item)
  353.     draw_icon(x, y, item.icon_name)
  354.     cw = @drawing_board.bitmap.text_size(item.name).width
  355.     ch = @drawing_board.bitmap.font.size
  356.     draw_text(x+icon_size+2, y, cw, ch, item.name)
  357.   end
  358.   #--------------------------------------------------------------------------
  359.   def play_se(se_name)
  360.     Audio.se_play("Audio/SE/" + se_name, 100, 100) if se_name != ""
  361.   end
  362.   #--------------------------------------------------------------------------
  363.   def play_anm(anm_id)
  364.     anm = $data_animations[anm_id]
  365.     anm && animation(anm, true)
  366.   end
  367. end
  368. #==============================================================================
  369. # 图片按钮
  370. #==============================================================================
  371. class XdRs_Button < XdRs_UiBase
  372.   #--------------------------------------------------------------------------
  373.   def initialize(x, y, ui_name, rect, n_rect, viewport=nil)
  374.     super(x, y, ui_name, rect, viewport)
  375.     @c_rect = rect
  376.     @n_rect = n_rect
  377.     @is_current = true
  378.     @press_count = 0
  379.   end
  380.   #--------------------------------------------------------------------------
  381.   def refresh_rect
  382.     super
  383.     self.ox = @rect.width / 2
  384.     self.oy = @rect.height / 2
  385.   end
  386.   #--------------------------------------------------------------------------
  387.   def refresh_current(state)
  388.     if @is_current != state
  389.       @is_current = state
  390.       set_rect(@is_current ? @c_rect : @n_rect)
  391.     end
  392.   end
  393.   #--------------------------------------------------------------------------
  394.   def press
  395.     self.zoom_x = self.zoom_y = 0.9
  396.     @press_count = 3
  397.   end
  398.   #--------------------------------------------------------------------------
  399.   def reduction
  400.     self.zoom_x = self.zoom_y = 1
  401.   end
  402.   #--------------------------------------------------------------------------
  403.   def update
  404.     super
  405.     update_press
  406.   end
  407.   #--------------------------------------------------------------------------
  408.   def update_press
  409.     return if @press_count == 0
  410.     @press_count -= 1
  411.     @press_count == 0 && reduction
  412.   end
  413. end
  414. #==============================================================================
  415. # 闪烁灯
  416. #==============================================================================
  417. class XdRs_LdLamp < XdRs_Button
  418.   #--------------------------------------------------------------------------
  419.   def initialize(index, x, y)
  420.     rect0 = Rect.new(300, 206, 16, 16)
  421.     rect1 = Rect.new(300, 222, 28, 28)
  422.     place = XdRs_Ld.lamp_place(index)
  423.     super(x+place[0], y+place[1], XdRs_Ld.ui_name, rect0, rect1)
  424.     @twinkle_type = index % 2
  425.     @count = 20
  426.     refresh_current(@twinkle_type == 0)
  427.   end
  428.   #--------------------------------------------------------------------------
  429.   def start_twinkle
  430.     @twinkle_type = (@twinkle_type+1)%2
  431.     refresh_current(@twinkle_type == 0)
  432.     @count = 20
  433.   end
  434.   #--------------------------------------------------------------------------
  435.   def update
  436.     super
  437.     update_twinkle
  438.   end
  439.   #--------------------------------------------------------------------------
  440.   def update_twinkle
  441.     return unless self.visible
  442.     @count > 0 ? @count -= 1 : start_twinkle
  443.   end
  444. end
  445. #==============================================================================
  446. # 白色转幕
  447. #==============================================================================
  448. class XdRs_LdCurtain < XdRs_UiBase
  449.   #--------------------------------------------------------------------------
  450.   def initialize(x, y)
  451.     super(x, y, XdRs_Ld.ui_name, Rect.new(495,48,78,128))
  452.     self.ox = @rect.width / 2
  453.     self.oy = @rect.height
  454.     @index = rand 10
  455.     start_turn
  456.   end
  457.   #--------------------------------------------------------------------------
  458.   def start_turn
  459.     @count = 0
  460.     self.angle = 360 - (@index * 36 + 18)
  461.     @index = (@index+1) % 10
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   def update
  465.     super
  466.     update_turn
  467.   end
  468.   #--------------------------------------------------------------------------
  469.   def update_turn
  470.     return unless self.visible
  471.     @count < 10 ? @count += 1 : start_turn
  472.   end
  473. end
  474. #==============================================================================
  475. # 转针
  476. #==============================================================================
  477. class XdRs_LdNeedle < XdRs_UiBase
  478.   #--------------------------------------------------------------------------
  479.   def initialize(x, y)
  480.     super(x, y, XdRs_Ld.ui_name, Rect.new(381,48,114,150))
  481.     self.ox = @rect.width / 2
  482.     self.oy = 93
  483.     @index = rand 10
  484.     @count = @speed = 0
  485.     @is_start = false
  486.     self.angle = 360 - (@index * 36 + 18)
  487.   end
  488.   #--------------------------------------------------------------------------
  489.   def start
  490.     return if @is_start
  491.     add = rand 100
  492.     @count = (rand(2) == 0 ? add : -add) + 200
  493.     @is_start = true
  494.   end
  495.   #--------------------------------------------------------------------------
  496.   def index;        return @index;     end
  497.   #--------------------------------------------------------------------------
  498.   def in_rotation;  return @is_start;  end
  499.   #--------------------------------------------------------------------------
  500.   def refresh_angle
  501.     play_se(XdRs_Ld::Needle_Se)
  502.     @index = (@index+1) % 10
  503.     self.angle = 360 - (@index * 36 + 18)
  504.     @speed = [(300 - @count) / 50, 1].max
  505.   end
  506.   #--------------------------------------------------------------------------
  507.   def update
  508.     super
  509.     update_turn
  510.   end
  511.   #--------------------------------------------------------------------------
  512.   def update_turn
  513.     return if !self.visible || !@is_start
  514.     @count -= 1 if @count > 0
  515.     @speed -= 1 if @speed > 0
  516.     @speed == 0 && refresh_angle
  517.     @is_start = false if @count == 0
  518.   end
  519. end
  520. #==============================================================================
  521. # 奖品显示
  522. #==============================================================================
  523. class XdRs_LdPrize < XdRs_UiBase
  524.   #--------------------------------------------------------------------------
  525.   def initialize
  526.     x = XdRs_Ld::Graphics_Width / 2
  527.     y = XdRs_Ld::Graphics_Height / 2
  528.     super(x, y, "", Rect.new(0,0,300,300))
  529.     self.ox = @drawing_board.ox = 150
  530.     self.oy = @drawing_board.oy = 150
  531.     show_prize
  532.   end
  533.   #--------------------------------------------------------------------------
  534.   def show_prize(prize=nil)
  535.     hide; clear
  536.     return if !prize
  537.     play_anm(XdRs_Ld::Award_Anm)
  538.     image = XdRs_Ld.ui_name
  539.     blt(50, 80, Rect.new(300, 255, 200, 45), image)
  540.     blt(125, 140, Rect.new(381, 198, 50, 50), image)
  541.     ix = (50 - icon_size) / 2
  542.     draw_icon(125+ix, 140+ix, prize.icon_name)
  543.     draw_text(0, 200, 300, 24, prize.name, 1)
  544.     show
  545.   end
  546. end
  547. #==============================================================================
  548. # 抽奖场景
  549. #==============================================================================
  550. class Lottery_Draw
  551.   #--------------------------------------------------------------------------
  552.   def main
  553.     init_data
  554.     create_all
  555.     start
  556.     Graphics.transition
  557.     loop do
  558.       Graphics.update; Input.update; update
  559.       break if $scene != self
  560.     end
  561.     Graphics.freeze
  562.     dispose_all
  563.   end
  564.   #--------------------------------------------------------------------------
  565.   def init_data
  566.     @process = 0
  567.     @all_items = XdRs_Ld.ld_items
  568.   end
  569.   #--------------------------------------------------------------------------
  570.   def create_all
  571.     @lamps = []
  572.     x = (XdRs_Ld::Graphics_Width - 300) / 2
  573.     y = (XdRs_Ld::Graphics_Height - 300) / 2
  574.     cy = y + 304; hx = x + 150; hy = y + 150
  575.     rect1 = Rect.new(300,48,81,79); rect2 = Rect.new(300,127,81,79)
  576.     @map_bg     = Spriteset_Map.new
  577.     @turntable  = XdRs_UiBase.new(x, y, XdRs_Ld.ui_name,Rect.new(0,0,300,300))
  578.     @consume    = XdRs_UiBase.new(x, cy, XdRs_Ld.ui_name,Rect.new(300,0,300,48))
  579.     @curtain    = XdRs_LdCurtain.new(hx, hy)
  580.     @needle     = XdRs_LdNeedle.new(hx, hy)
  581.     @button     = XdRs_Button.new(hx, hy, XdRs_Ld.ui_name, rect1, rect2)
  582.     @prize_show = XdRs_LdPrize.new
  583.     10.times{|i| @lamps << XdRs_LdLamp.new(i, x, y)}
  584.   end
  585.   #--------------------------------------------------------------------------
  586.   def dispose_all
  587.     @map_bg.dispose
  588.     @button.dispose
  589.     @needle.dispose
  590.     @curtain.dispose
  591.     @consume.dispose
  592.     @turntable.dispose
  593.     @prize_show.dispose
  594.     @lamps.each{|l| l.dispose}
  595.   end
  596.   #--------------------------------------------------------------------------
  597.   def start
  598.     refresh_items
  599.     refresh_demand
  600.     refresh_button
  601.   end
  602.   #--------------------------------------------------------------------------
  603.   def refresh_items
  604.     @now_items = $game_system.has_ld_item ? $game_system.ld_items : create_new_items
  605.     draw_now_items
  606.   end
  607.   #--------------------------------------------------------------------------
  608.   def refresh_demand
  609.     @consume.clear
  610.     data = $game_system.consumption_data
  611.     x = 80; y = (48 - @consume.icon_size) / 2 + 2
  612.     @consume.set_font_color(Color.new(255,255,255))
  613.     if data[0] == "gold"
  614.       @consume.draw_icon(x, y, XdRs_Ld::Gold_Icon)
  615.       x += @consume.icon_size + 2
  616.       @consume.draw_text(x, y, 200, 24, $data_system.words.gold)
  617.     else
  618.       @consume.draw_item(x, y, $data_items[data[1][0]])
  619.     end
  620.     color = XdRs_Ld.can_ld_start ? Color.new(255,255,255) : Color.new(200,0,0)
  621.     @consume.set_font_color(color)
  622.     @consume.draw_text(0, y, 284, 24, num_text(data), 2)
  623.   end
  624.   #--------------------------------------------------------------------------
  625.   def refresh_button
  626.     @button.refresh_current(XdRs_Ld.can_ld_start)
  627.   end
  628.   #--------------------------------------------------------------------------
  629.   def create_new_items
  630.     data = []
  631.     p_index = @all_items[1].size > 0 ? rand(10) : nil
  632.     can_repeat = (@all_items[0] + @all_items[1]).size < 10
  633.     while data.size < 10
  634.       item = rand_item(is_precious(p_index, data) ? 1 : 0)
  635.       item && (can_repeat || !data.include?(item)) && data.push(item)
  636.     end
  637.     $game_system.save_ld_items(data)
  638.     return data
  639.   end
  640.   #--------------------------------------------------------------------------
  641.   def is_precious(index, data)
  642.     return rand(100) < XdRs_Ld::Precious_Rate || index && index == data.size
  643.   end
  644.   #--------------------------------------------------------------------------
  645.   def rand_item(type)
  646.     obj = @all_items[type]
  647.     return obj[rand(obj.size)]
  648.   end
  649.   #--------------------------------------------------------------------------
  650.   def draw_now_items
  651.     @turntable.clear
  652.     10.times do |i|
  653.       next unless @now_items[i]
  654.       place = XdRs_Ld.item_place(i)
  655.       x = place[0] - @turntable.icon_size / 2
  656.       y = place[1] - @turntable.icon_size / 2
  657.       @turntable.draw_icon(x,y,@now_items[i].obj.icon_name)
  658.     end
  659.   end
  660.   #--------------------------------------------------------------------------
  661.   def num_text(d)
  662.     num1 = d[0] == "gold" ? $game_party.gold : $game_party.item_number(d[1][0])
  663.     num2 = d[0] == "gold" ? d[1][0] : d[1][1]
  664.     return num2.to_s + "/" + num1.to_s
  665.   end
  666.   #--------------------------------------------------------------------------
  667.   def prize
  668.     return @now_items[@needle.index].obj
  669.   end
  670.   #--------------------------------------------------------------------------
  671.   def get_prize
  672.     case prize
  673.     when RPG::Item   ;$game_party.gain_item(prize.id, 1)
  674.     when RPG::Weapon ;$game_party.gain_weapon(prize.id, 1)
  675.     when RPG::Armor  ;$game_party.gain_armor(prize.id, 1)
  676.     end
  677.   end
  678.   #--------------------------------------------------------------------------
  679.   def update
  680.     update_windows
  681.     send("process"+@process.to_s)
  682.   end
  683.   #--------------------------------------------------------------------------
  684.   def update_windows
  685.     @button.update
  686.     @needle.update
  687.     @curtain.update
  688.     @prize_show.update
  689.     @lamps.each{|l| l.update}
  690.   end
  691.   #--------------------------------------------------------------------------
  692.   def process0
  693.     Input.trigger?(Input::C) && ready_start
  694.     Input.trigger?(Input::B) && return_to_map
  695.   end
  696.   #--------------------------------------------------------------------------
  697.   def process1
  698.     !@needle.in_rotation && end_rotation
  699.   end
  700.   #--------------------------------------------------------------------------
  701.   def process2
  702.     Input.trigger?(Input::C) && come_again
  703.   end
  704.   #--------------------------------------------------------------------------
  705.   def ready_start
  706.     @button.press
  707.     if !XdRs_Ld.can_ld_start
  708.       $game_system.se_play($data_system.buzzer_se)
  709.       return
  710.     end
  711.     $game_system.se_play($data_system.decision_se)
  712.     $game_system.save_ld_items([])
  713.     XdRs_Ld.deductible
  714.     refresh_demand
  715.     @needle.start
  716.     @curtain.hide
  717.     @lamps.each{|l| l.hide}
  718.     @process = 1
  719.   end
  720.   #--------------------------------------------------------------------------
  721.   def end_rotation
  722.     @prize_show.show_prize(prize)
  723.     get_prize
  724.     refresh_demand
  725.     refresh_button
  726.     @process = 2
  727.   end
  728.   #--------------------------------------------------------------------------
  729.   def come_again
  730.     $game_system.se_play($data_system.decision_se)
  731.     @prize_show.show_prize
  732.     @curtain.show
  733.     @lamps.each{|l| l.show}
  734.     refresh_items
  735.     @process = 0
  736.   end
  737.   #--------------------------------------------------------------------------
  738.   def return_to_map
  739.     $game_system.se_play($data_system.cancel_se)
  740.     $scene = Scene_Map.new
  741.   end
  742. end
  743. #==============================================================================
  744. # end
  745. #==============================================================================


〓 范例工程 〓

xp 测试.rar (356.53 KB, 下载次数: 121, 售价: 1 星屑)
作者: haosama    时间: 2018-11-19 23:31
好贴顶一下
作者: chd114    时间: 2018-11-20 01:58
转盘抽奖还是挺好玩的···不过看了下使用的素材···
如果要修改转盘奖品数量概率之类的代码和素材要一起调整···
不过还是足够了

但是话说回来现在基本是箱子摸球或者抽池子这种了吧今年上半年连黄油RPG都是抽池子了
这种抽池子的有什么比较好的思路吗?(我以前做了一个,不过是把奖品按3-5星分组,然后每个奖品设权重,单抽就是正常的5星合计2%,4星合计18%,3星合计80%的三组放到一起抽,十连的情况其中一张是5星合计2%,4星合计98%的两组放到一起抽,十次十连的情况其中一张是5星合计100%的抽,能有个办法简化一下就好了)
作者: Tsar_NicholasII    时间: 2018-12-5 01:12
配合限制SL次数的脚本更有意思(心疼非酋1秒)
作者: 钓鱼的岛    时间: 2018-12-11 22:12
可以可以,很有趣
作者: ainimen726    时间: 2020-6-18 03:43
请教的那个问题想趁下一楼请教下大佬们,不小心点了个点评跑上面了~~~【抱歉】
用老版本的抽奖我分辨率是1140*640,使用后抽奖底座和指针偏移右边,修改图片和修改插件里面的数字画面就乱了。
这个更新的版本下是XP的,想请教大佬这个新版本怎么用在MV里?或者老版本修改分辨率改修改哪里的数字?
作者: chanszeman1018    时间: 2020-6-18 07:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: ainimen726    时间: 2020-6-18 19:39
ainimen726 发表于 2020-6-18 03:43
请教的那个问题想趁下一楼请教下大佬们,不小心点了个点评跑上面了~~~【抱歉】
用老版本的抽奖我分辨率是11 ...

回复:芯☆淡茹水
就是用你mv版的转盘,(我制作的工程分辨率设置的是1140*640),转盘游戏启动后,转盘指针和底座偏移转盘,PS改图片指针位置和改插件里Scene_Prize.prototype.iniRect = function()后面的数字,就出现转盘图形变花!不知道改插件里哪点能让位置转盘和指针的位置摆正?
作者: ainimen726    时间: 2020-6-18 19:41
1140*640的分辨率,使用后转盘是这样子的

QQ图片20200618192815.png (269.16 KB, 下载次数: 37)

QQ图片20200618192815.png

作者: l734273398    时间: 2021-4-2 05:02
感谢,大佬




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1