〓 转盘抽奖 〓
很久没冒泡了,就拿这个来水一贴。以前写的 转盘抽奖 ,觉得不是很好,老早就全部推翻重新写了,但搁在那儿都快忘了。
今天偶然发现了,正好,加上说明就拿出来水咯。
〓 说明 〓
1,抽奖物品全部编辑在公共事件里。
2,游戏中可随时增/减随机的转盘物品。
3,可随时更改抽奖所消耗的东西(金钱/物品)。
4,素材来源=>网络
〓 用法 〓
1,将下面的 脚本 复制到工程 main 前。
2,将下面的 UI图片 下载后,复制到 Graphics\Pictures 文件夹里。
3,参照脚本说明,进行操作。
4,嫌麻烦的同学,可以直接下载下面的范例工程。
〓 演示截图 〓
〓 UI图片 〓
〓 脚本 〓
RUBY 代码
#==============================================================================
# 〓 转盘抽奖 (Lottery draw) 〓 Author: 芯☆淡茹水
#==============================================================================
# ■ 说明 ■
#--------------------------------------------------------------------------
# 1,该转盘抽奖利用公共事件储存抽奖物品,分为 基本物品(设置项设置) 和
# 动态物品(脚本命令添加/删除)两种。
# 转盘上能够随机的物品为以上两种相加。
#--------------------------------------------------------------------------
# 2,公共事件里编辑 增减物品,增减武器 或 增减防具 。当这个公共事件在物品
# 事件里时,里面的这些项目物品都将添加到转盘的随机物品中。
#--------------------------------------------------------------------------
# 3,如果总共的随机物品当中有 珍贵物品 时,随机时至少有一件会是 珍贵物品 。
# 其它出现 珍贵物品 概率,依照设置项所设置的概率百分比。
#--------------------------------------------------------------------------
# 4,进入抽奖场景,而未进行抽奖的,系统将储存当前转盘物品,防止进出抽奖场景
# 刷物品。
#--------------------------------------------------------------------------
# 5,初始抽奖消耗为 金钱=>100 ,可用脚本命令适时更改。
#==============================================================================
# ■ 脚本命令 ■
#--------------------------------------------------------------------------
# 1,开始转盘抽奖 => XdRs_Ld.start_lottery_draw
#--------------------------------------------------------------------------
# 2,添加公共事件(设置有随机物品)里的所有物品到随机物品 =>
# XdRs_Ld.add_ld_event(event_id, type)
# 参数event_id: 公共事件ID。
# type : 添加的类型(0:添加到普通物品; 1:添加到珍贵物品)
# 例:将 22 号公共事件里编辑的所有物品,添加到普通的随机物品中 =>
# XdRs_Ld.add_ld_event(22, 0)
# 将 15 号公共事件里编辑的所有物品,添加到珍贵的随机物品中 =>
# XdRs_Ld.add_ld_event(15, 1)
#--------------------------------------------------------------------------
# 3,将添加的公共事件里的所有物品从随机物品中删除 =>
# XdRs_Ld.del_ld_event(event_id, type)
# 参数同第 2 条。
#--------------------------------------------------------------------------
# 4,清空所有第 2 条添加的公共事件 => XdRs_Ld.clear_ld_events
#--------------------------------------------------------------------------
# 5,清除系统所记忆的转盘物品 =>XdRs_Ld.clear_ld_data
#--------------------------------------------------------------------------
# 6,更改抽奖所需的消耗品 => XdRs_Ld.change_consume(type, num1, num2)
# 参数type: 消耗类型(0:金钱;1:物品)
# num1: 数值1,消耗类型为 0(金钱)时,写所需的金钱数;
# 消耗类型为 1(物品)时,写物品ID。
# num2: 数值2,消耗类型为 0(金钱)时,省略不写;
# 消耗类型为 1(物品)时,写所需的数量。
# 例:设置抽奖消耗金钱 500 => XdRs_Ld.change_consume(0, 500)
# 设置抽奖消耗 10 号物品 3 个 => XdRs_Ld.change_consume(1, 10, 3)
#==============================================================================
#==============================================================================
module XdRs_Ld
#==============================================================================
# ■ 设置项 ■
#==============================================================================
#--------------------------------------------------------------------------
# 游戏分辨率宽。
Graphics_Width = 640
#--------------------------------------------------------------------------
# 游戏分辨率高。
Graphics_Height = 480
#--------------------------------------------------------------------------
# 基本普通抽奖物品的公共事件ID。
Base_Ordinary = 10
#--------------------------------------------------------------------------
# 基本珍贵抽奖物品的公共事件ID。
Base_Precious = 11
#--------------------------------------------------------------------------
# 转盘出现珍贵物品的概率百分比。
Precious_Rate = 10
#--------------------------------------------------------------------------
# 金钱图标名。
Gold_Icon = "035-Item04"
#--------------------------------------------------------------------------
# 得到奖品时播放的动画ID。
Award_Anm = 46
#--------------------------------------------------------------------------
# 指针转动时,播放的SE。
Needle_Se = "041-Knock02"
#--------------------------------------------------------------------------
end
#==============================================================================
# ■ 脚本正文 ■
#==============================================================================
module XdRs_Ld
#--------------------------------------------------------------------------
defself.ui_name
return"Ui_LotteryDraw" #UI图片名
end
#--------------------------------------------------------------------------
# 闪烁灯位置
#--------------------------------------------------------------------------
defself.lamp_place(index)
return[,,,,,,
,,,]
end
#--------------------------------------------------------------------------
# 物品图标位置
#--------------------------------------------------------------------------
defself.item_place(index)
return[,,,,,,
,,,]
end
#--------------------------------------------------------------------------
defself.has_ld_items
data = [, ]
data += $game_system.ld_data
data += $game_system.ld_data
return data.any?{|d| self.type_has_ld_items(d)}
end
#--------------------------------------------------------------------------
defself.type_has_ld_items(data)
return data.any?{|id| self.ld_list(id).size > 0}
end
#--------------------------------------------------------------------------
defself.ld_items
data = []
base = [, ]
data = self.type_items(0, base) + self.type_items(0, $game_system.ld_data)
data = self.type_items(1, base) + self.type_items(1, $game_system.ld_data)
return data
end
#--------------------------------------------------------------------------
defself.type_items(type, data)
items = []
data.size.timesdo |i|
list = self.ld_list(data)
list.each{|l| items 100
end
#--------------------------------------------------------------------------
defself.can_ld_start
cst = $game_system.consumption_data
return$game_party.gold >= cstif cst == "gold"
return$game_party.item_number(cst) >= cst
end
#--------------------------------------------------------------------------
defself.deductible
cst = $game_system.consumption_data
tp = cst; d = cst; n = cst
tp == "gold" ? $game_party.lose_gold(d) : $game_party.gain_item(d, -n)
end
#--------------------------------------------------------------------------
defself.start_lottery_draw
unlessself.has_ld_items
$game_temp.message_text = "没有抽奖物品,暂时无法抽奖!"
return
end
$scene = Lottery_Draw.new
end
#--------------------------------------------------------------------------
defself.add_ld_event(event_id, type=0)
returnif type > 1
$game_system.set_ld_events(event_id, "add", type)
end
#--------------------------------------------------------------------------
defself.del_ld_event(event_id, type=0)
returnif type > 1
$game_system.set_ld_events(event_id, "del", type)
end
#--------------------------------------------------------------------------
defself.clear_ld_data
$game_system.save_ld_items([])
end
#--------------------------------------------------------------------------
defself.clear_ld_events
$game_system.clear_all_ld_events
end
#--------------------------------------------------------------------------
defself.change_consume(type, num1, num2=0)
returnif type == 0 && num10 ? @count -= 1 : start_twinkle
end
end
#==============================================================================
# 白色转幕
#==============================================================================
class XdRs_LdCurtain < XdRs_UiBase
#--------------------------------------------------------------------------
def initialize(x, y)
super(x, y, XdRs_Ld.ui_name, Rect.new(495,48,78,128))
self.ox = @rect.width / 2
self.oy = @rect.height
@index = rand10
start_turn
end
#--------------------------------------------------------------------------
def start_turn
@count = 0
self.angle = 360 - (@index * 36 + 18)
@index = (@index+1) % 10
end
#--------------------------------------------------------------------------
def update
super
update_turn
end
#--------------------------------------------------------------------------
def update_turn
returnunlessself.visible
@count < 10 ? @count += 1 : start_turn
end
end
#==============================================================================
# 转针
#==============================================================================
class XdRs_LdNeedle < XdRs_UiBase
#--------------------------------------------------------------------------
def initialize(x, y)
super(x, y, XdRs_Ld.ui_name, Rect.new(381,48,114,150))
self.ox = @rect.width / 2
self.oy = 93
@index = rand10
@count = @speed = 0
@is_start = false
self.angle = 360 - (@index * 36 + 18)
end
#--------------------------------------------------------------------------
def start
returnif@is_start
add = rand100
@count = (rand(2) == 0 ? add : -add) + 200
@is_start = true
end
#--------------------------------------------------------------------------
def index; return@index; end
#--------------------------------------------------------------------------
def in_rotation;return@is_start;end
#--------------------------------------------------------------------------
def refresh_angle
play_se(XdRs_Ld::Needle_Se)
@index = (@index+1) % 10
self.angle = 360 - (@index * 36 + 18)
@speed = [(300 - @count) / 50, 1].max
end
#--------------------------------------------------------------------------
def update
super
update_turn
end
#--------------------------------------------------------------------------
def update_turn
returnif !self.visible || !@is_start
@count -= 1if@count > 0
@speed -= 1if@speed > 0
@speed == 0 && refresh_angle
@is_start = falseif@count == 0
end
end
#==============================================================================
# 奖品显示
#==============================================================================
class XdRs_LdPrize < XdRs_UiBase
#--------------------------------------------------------------------------
def initialize
x = XdRs_Ld::Graphics_Width / 2
y = XdRs_Ld::Graphics_Height / 2
super(x, y, "", Rect.new(0,0,300,300))
self.ox = @drawing_board.ox = 150
self.oy = @drawing_board.oy = 150
show_prize
end
#--------------------------------------------------------------------------
def show_prize(prize=nil)
hide; clear
returnif !prize
play_anm(XdRs_Ld::Award_Anm)
image = XdRs_Ld.ui_name
blt(50, 80, Rect.new(300, 255, 200, 45), image)
blt(125, 140, Rect.new(381, 198, 50, 50), image)
ix = (50 - icon_size) / 2
draw_icon(125+ix, 140+ix, prize.icon_name)
draw_text(0, 200, 300, 24, prize.name, 1)
show
end
end
#==============================================================================
# 抽奖场景
#==============================================================================
class Lottery_Draw
#--------------------------------------------------------------------------
def main
init_data
create_all
start
Graphics.transition
loopdo
Graphics.update; Input.update; update
breakif$scene != self
end
Graphics.freeze
dispose_all
end
#--------------------------------------------------------------------------
def init_data
@process = 0
@all_items = XdRs_Ld.ld_items
end
#--------------------------------------------------------------------------
def create_all
@lamps = []
x = (XdRs_Ld::Graphics_Width - 300) / 2
y = (XdRs_Ld::Graphics_Height - 300) / 2
cy = y + 304; hx = x + 150; hy = y + 150
rect1 = Rect.new(300,48,81,79); rect2 = Rect.new(300,127,81,79)
@map_bg = Spriteset_Map.new
@turntable= XdRs_UiBase.new(x, y, XdRs_Ld.ui_name,Rect.new(0,0,300,300))
@consume = XdRs_UiBase.new(x, cy, XdRs_Ld.ui_name,Rect.new(300,0,300,48))
@curtain = XdRs_LdCurtain.new(hx, hy)
@needle = XdRs_LdNeedle.new(hx, hy)
@button = XdRs_Button.new(hx, hy, XdRs_Ld.ui_name, rect1, rect2)
@prize_show = XdRs_LdPrize.new
10.times{|i| @lamps0 ? rand(10) : nil
can_repeat = (@all_items + @all_items).size < 10
while data.size < 10
item = rand_item(is_precious(p_index, data) ? 1 : 0)
item && (can_repeat || !data.include?(item)) && data.push(item)
end
$game_system.save_ld_items(data)
return data
end
#--------------------------------------------------------------------------
def is_precious(index, data)
returnrand(100) < XdRs_Ld::Precious_Rate || index && index == data.size
end
#--------------------------------------------------------------------------
def rand_item(type)
obj = @all_items
return obj
end
#--------------------------------------------------------------------------
def draw_now_items
@turntable.clear
10.timesdo |i|
nextunless@now_items
place = XdRs_Ld.item_place(i)
x = place - @turntable.icon_size / 2
y = place - @turntable.icon_size / 2
@turntable.draw_icon(x,y,@now_items.obj.icon_name)
end
end
#--------------------------------------------------------------------------
def num_text(d)
num1 = d == "gold" ? $game_party.gold : $game_party.item_number(d)
num2 = d == "gold" ? d : d
return num2.to_s + "/" + num1.to_s
end
#--------------------------------------------------------------------------
def prize
return@now_items[@needle.index].obj
end
#--------------------------------------------------------------------------
def get_prize
case prize
whenRPG::Item ;$game_party.gain_item(prize.id, 1)
whenRPG::Weapon ;$game_party.gain_weapon(prize.id, 1)
whenRPG::Armor;$game_party.gain_armor(prize.id, 1)
end
end
#--------------------------------------------------------------------------
def update
update_windows
send("process"+@process.to_s)
end
#--------------------------------------------------------------------------
def update_windows
@button.update
@needle.update
@curtain.update
@prize_show.update
@lamps.each{|l| l.update}
end
#--------------------------------------------------------------------------
def process0
Input.trigger?(Input::C) && ready_start
Input.trigger?(Input::B) && return_to_map
end
#--------------------------------------------------------------------------
def process1
!@needle.in_rotation && end_rotation
end
#--------------------------------------------------------------------------
def process2
Input.trigger?(Input::C) && come_again
end
#--------------------------------------------------------------------------
def ready_start
@button.press
if !XdRs_Ld.can_ld_start
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
$game_system.save_ld_items([])
XdRs_Ld.deductible
refresh_demand
@needle.start
@curtain.hide
@lamps.each{|l| l.hide}
@process = 1
end
#--------------------------------------------------------------------------
def end_rotation
@prize_show.show_prize(prize)
get_prize
refresh_demand
refresh_button
@process = 2
end
#--------------------------------------------------------------------------
def come_again
$game_system.se_play($data_system.decision_se)
@prize_show.show_prize
@curtain.show
@lamps.each{|l| l.show}
refresh_items
@process = 0
end
#--------------------------------------------------------------------------
def return_to_map
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
end
end
#==============================================================================
# end
#==============================================================================
〓 范例工程 〓
本帖来自P1论坛作者芯☆淡茹水,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=410955若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]