目录
  • 1.效果展示
  • 2.程序原理说明
    • 2.1奖项设置
    • 2.2随机抽取
    • 2.3绘制图层
    • 2.4滑动鼠标刮奖
  • 3.完整代码

    1.效果展示

    程序运行效果如下:

    利用Matlab制作一款刮刮乐抽奖特效

    如图所示,按住鼠标不松开并滑动鼠标,即可刮开图层:

    利用Matlab制作一款刮刮乐抽奖特效

    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
    

    鼠标滑动刮奖

    利用Matlab制作一款刮刮乐抽奖特效

    该部分代码:

    [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
    
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。