Matlab刮刮乐抽奖特效
slandarer 人气:01.效果展示
程序运行效果如下:
如图所示,按住鼠标不松开并滑动鼠标,即可刮开图层:
2.程序原理说明
2.1 奖项设置
奖项设置写在一个cell元胞数组中,第一列为文本信息,第二列为抽到的概率:
strSet={'520元红包一个',15/100; '1314元红包一个',5/100; '黑丝水手服',20/100; '黑丝女仆装',20/100; '抱抱×50次',20/100; '亲亲×50次',20/100;}; probVal=cell2mat(strSet(:,2)); %提取第二列概率信息
2.2 随机抽取
我们首先将离散型概率密度函数转换为概率分布函数:
% 将概率密度函数转换为概率分布函数 for i=2:length(probVal) probVal(i)=probVal(i)+probVal(i-1); end
例如
概率密度和概率分布如下:
概率密度 | 概率分布 |
---|---|
0.15 | 0.15 |
0.05 | 0.2 |
0.2 | 0.4 |
0.2 | 0.6 |
0.2 | 0.8 |
0.2 | 1 |
则若是我抽到的随机数为0.7,0.7在概率分布第四个数和第五个数之间,我们就认为我们抽到的是第五个选项。该部分代码如下:
randNum=rand(); numRange=probVal>randNum; strPos=find(numRange,1);
确定了是第几个奖项就可以显示字符串了,用text函数在坐标区域进行显示:
text(300,100,strSet{strPos,1},... 'HorizontalAlignment','center','FontSize',60)
2.3绘制图层
使用image绘制一张颜色为灰色每个位置透明度都为1的图片:
coverageMat_C=ones(200,600,3).*0.62; coverageMat_A=ones(200,600); coverageHdl=image([0 600],[0 200],coverageMat_C,... 'AlphaData',coverageMat_A);
2.4 滑动鼠标刮奖
判断鼠标是否被点击
假设我们当前figure名为fig,以下设置是在fig的基础上设置,首先我们要判定鼠标是否被按住。因此我们设置一个名为isClicking,并设置鼠标按下和鼠标松开两个回调函数,当鼠标点击时将isClicking设置为true,当鼠标松开时isClicking设置为false。
isClicking=false; set(fig,'WindowButtonDownFcn',@bt_down); function bt_down(~,~),isClicking=true;end set(fig,'WindowButtonUpFcn',@bt_up); function bt_up(~,~),isClicking=false;end
鼠标滑动刮奖
该部分代码:
[xMesh,yMesh]=meshgrid(1:600,1:200); set(fig,'WindowButtonMotionFcn',@bt_move); function bt_move(~,~) if isClicking mousePos=fig.CurrentPoint; boolPos=sqrt((xMesh-mousePos(1)).^2+(yMesh-mousePos(2)).^2)<=15; coverageMat_A(boolPos)=0; set(coverageHdl,'AlphaData',coverageMat_A) end end
3.完整代码
function scratchCard strSet={'520元红包一个',15/100; '1314元红包一个',5/100; '黑丝水手服',20/100; '黑丝女仆装',20/100; '抱抱×50次',20/100; '亲亲×50次',20/100;}; probVal=cell2mat(strSet(:,2)); % 将概率密度函数转换为概率分布函数 for i=2:length(probVal) probVal(i)=probVal(i)+probVal(i-1); end fig=figure('units','pixels'); fig.Position=[300 80 600 200]; fig.NumberTitle='off'; fig.MenuBar='none'; fig.Resize='off'; fig.Name='刮刮乐'; ax=axes(fig); ax.Position=[0 0 1 1]; ax.XTick=[]; ax.YTick=[]; ax.ZTick=[]; ax.XLim=[0 600]; ax.YLim=[0 200]; hold(ax,'on') randNum=rand(); numRange=probVal>randNum; strPos=find(numRange,1); text(300,100,strSet{strPos,1},... 'HorizontalAlignment','center','FontSize',60) coverageMat_C=ones(200,600,3).*0.62; coverageMat_A=ones(200,600); [xMesh,yMesh]=meshgrid(1:600,1:200); coverageHdl=image([0 600],[0 200],coverageMat_C,... 'AlphaData',coverageMat_A); isClicking=false; set(fig,'WindowButtonDownFcn',@bt_down); function bt_down(~,~),isClicking=true;end set(fig,'WindowButtonUpFcn',@bt_up); function bt_up(~,~),isClicking=false;end set(fig,'WindowButtonMotionFcn',@bt_move); function bt_move(~,~) if isClicking mousePos=fig.CurrentPoint; boolPos=sqrt((xMesh-mousePos(1)).^2+(yMesh-mousePos(2)).^2)<=15; coverageMat_A(boolPos)=0; set(coverageHdl,'AlphaData',coverageMat_A) end end end
加载全部内容