Flash 抽奖程序制作

  转眼间2009年又过了六分之五,一年间里面发生很多事情。在这些事情里面,让我了解很多,失去很多也得到一些经验。在这一年期间,认识了很多好友,他们都是一群热爱flash 的好友,走在一起也算是一种缘分。

 

   话说回头,我们都知道flash和flex的内容方向有许多,一个人再厉害精力也是有限,只能选择性去找一些方向来进行学习。曾经过去一次偶然机会,帮大学的一个同学制作个一个As2的抽奖程序,当时我什么项目经验都没有,仅仅会一点As2的编程语法,就这样答应了同学制作了一个抽奖程序,当时没有收过一分钱,当时制作出这个也非常兴奋,心情难以表达成功感。后来,我就喜欢上制作了这些抽奖程序。一口气制作手机抽奖,选号抽奖等几个小应用程序。不过,说到抽奖程序,里面涉及的东西还是很多。最近做了一个小的抽奖程序,现在把最近的笔记都记录一下。

 

  抽奖程序下载地址:

                                游戏抽奖程序需求说明:

 

一、需求背景

  为了一项活动进行一个游戏抽奖活动,需要制作一个flash应用程序完成这一次官方的活动。

 

二、需求功能说明:

游戏当中,有四个礼物区,每一个礼物区里面有125份礼物(125x4=500)。在抽象过程中,随机抽选四个区,同一个区的礼物是相同的。抽奖的过程中,抽奖完一个区的时候,这个区就不可以进行抽取,直到完成了抽奖形式的时候。四个区都变成了不能继续抽取,就结束了抽奖。

 

注意:

为了防止礼物数被误操作,采取到礼物数更改的策略进行礼物数修正。并且可以选那个区为标记不可以再抽取。以做到更加灵活。

 

制作时间:9天内进行交户使用。

 

 

三、制作平台:

 

 Flash cs3 制作

 

 

 

四、制作方案:

 

 

初步方案一:

 

 随机抽取四个区,假设是分别代号为1234

 

 Flash 抽奖程序制作_第1张图片

 

 

第一次    抽取为1的时候,这时候减去第一区的礼物数()

第二次    抽取为 2 的时候,这时候减去第二区的礼物数()

第三次    抽取为3 的时候,这时候减去第三区的礼物数()

第四次    抽取为4的时候,这时候减去第四区的礼物数()

。。。。。。。

………………..

……………………..

 

当第一区礼物数为0的时候,则随机抽取的数组长度变为3,同时标记1区为灰色,不可以进行抽取。

 

当第二个 区礼物数为 0的时候,则随机抽取数组长度变为2,同时标记2区为灰色,不可以进行抽取

 

四个区设计的时候,可以让用户选中和不选中两种状态,根据礼物数的设定判断该区是否纳入随机抽取的范围当中。

 

这个是第一方案做法比较灵活,假设错误了都可以 进行重新设定来进行礼物重新抽取。

 

 

五、程序设计

  在这次程序设计当中,主要使用了三个类,第一个是礼物类,第二个是移动框类,第三个就是文档类

 

   礼物类:Gigt.as

   移动框:DrawAnimation.as

  主程序:   Main.as 

 礼物类当中:初步功能构想如下:

                1.可以设置和获取礼物数,可以输出礼物数

                2.可以设置和获取礼物总数(暂定)

                        3.可以设置礼物的代号(暂定)

                4. 克隆对象

                这个类里面,目的用于存储礼物数。

 

 移动框类: 初步构想如下:

               1. 移动框坐标更改

 

  主程序类:

         1.在这个主要程序类当中,我们使用时间计算器来随机抽取数组当中的号码。

         2.其次我们需要进行对键盘监听,设置键盘相应的控制,如开始,抽取等一些动作。

         3.同样在这个类当中,我们要处理界面的GUI里面的组件和文本。这样我们通过礼物类绑定在文本里面,当数据更改的时候,则文本也会进行相应更改。

         4.处理相应的逻辑关系和动画显示过程

         5.处理checkbox组件的选种和不选中两种状态

          6.结合一些动画缓冲类处理一些元件的动画 效果    

 

 

抽奖原理:

             说到抽奖的原理,每一个人的做法都不一样,比较常见的做法是采用随机数进行选取数组的内容,当选取了就对其数据进行删除操作。这样就能够确保抽奖的时候不重复。不过为了确保原本数组不影响,在开始程序的时候,可以对原本的数组进行深度复制,Copy一份出来进行操作。这样也是一种方案。

        

 

代码清单:

 礼物类Gift.as:

 package { //礼物的基础类 public class Gift { private var gifts:int;//礼物数 private var totals:int;//礼物总数 private var temp:int;//临时礼物数 private var giftid:String; public function Gift() { } // 创建新对象 public function clone():Gift { return new Gift ; } //设置礼物对应的ID值 public function set id(value:String):void { giftid=value; } //获取礼物对应的ID值 public function get id():String { return giftid; } /* 设置礼物的数 */ public function set Gifts(num:int):void { gifts=num; } //获取礼物数 public function get Gifts():int { return gifts; } //让礼物数变成字符串 public function toString():String { return String(this.Gifts); } //获取最大的礼物数 public function get total():int { return totals; } //设置最大的礼物数 public function set total(totals:int):void { totals=totals; } } }

 

DrawAnimation.as 类 用于移动框使用

 

 package { //抽奖时候的动画类 import flash.display.MovieClip; import flash.events.*; public class DrawAnimation extends MovieClip { private var mc_circle:MovieClip; public function DrawAnimation(mc:MovieClip) { this.mc_circle=mc; } //改变动画光圈位置 public function changeXY(x:int,y:int):void { this.mc_circle.x=x; this.mc_circle.y=y; } } }

 

 

 主程序Main.as:

package { //抽奖程序 version 版本1.0 import flash.display.MovieClip; import flash.events.*; import flash.net.*; import flash.ui.Keyboard; import flash.text.*; import flash.utils.Dictionary; import flash.utils.Timer; import fl.controls.NumericStepper; import fl.controls.CheckBox; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.system.fscommand; import flash.media.*; import caurina.transitions.*; public class Main extends MovieClip { private var array:Array;//随机存取数 private var data:Array=[11,22,33,44];//随机存取数 private var gift_num1:Gift=new Gift();//第一区礼物数 private var gift_num2:Gift=gift_num1.clone();//克隆对象 private var gift_num3:Gift=gift_num1.clone();//克隆对象 private var gift_num4:Gift=gift_num1.clone();//克隆对象 private var time:Timer;//计时器 private var num:int=0; private var temp:Array;//用于临时的数组存放 private var xArray:Array = [118,342,580,860];//记录移动框的位置 private var yArray:Array = [353,268,218,225]; private var currentID:uint = 0;//当前的号码值 private var speed:int = 5;//用于控制移动框的速度 private var start:Boolean = false;//是否开始 private var maxNum:int=500;//默认开始最大礼物数值 private var IsEnd:Boolean=false;//判断抽奖是否结束,如果结束了就启动这个 private var sound:MySound=new MySound();//库链接的抽奖的声音 private var channel:SoundChannel=new SoundChannel(); private var key:Boolean=true; private var animation:DrawAnimation;//移动框 public function Main() { init(); } //初始化应用程序 private function init():void { fscommand("fullscreen", "true");//全屏 array=data.concat();//复制一个数组副本 temp=data.concat(); gift1.addEventListener(Event.CHANGE,onChange); gift2.addEventListener(Event.CHANGE,onChange); gift3.addEventListener(Event.CHANGE,onChange); gift4.addEventListener(Event.CHANGE,onChange); checkbox1.addEventListener(Event.CHANGE,box_onChange); checkbox2.addEventListener(Event.CHANGE,box_onChange); checkbox3.addEventListener(Event.CHANGE,box_onChange); checkbox4.addEventListener(Event.CHANGE,box_onChange); Mymc.configTxt.addEventListener(Event.CHANGE,onconfigTxt); gift_init();//礼物数初始化 people_txt.mouseEnabled=false;//人数禁止鼠标交互 Mymc.configTxt.text=String(maxNum); animation=new DrawAnimation(kuang);//移动框动画 time=new Timer(200); time.addEventListener(TimerEvent.TIMER,onTimer); stage.addEventListener(KeyboardEvent.KEY_DOWN,onkeyDown); } //礼物显示初始化 private function gift_init():void { gift_num1.Gifts = int(maxNum/4); gift_num2.Gifts = int(maxNum/4); gift_num3.Gifts = int(maxNum/4); gift_num4.Gifts = int(maxNum/4); gift1.text=String(gift_num1.Gifts); gift2.text=String(gift_num2.Gifts); gift3.text=String(gift_num3.Gifts); gift4.text=String(gift_num4.Gifts); people_txt.text = getPeoples(); // 获取总的人数 } //修改配置 private function onconfigTxt(e:Event):void { maxNum = int( Mymc.configTxt.text); gift_init(); } //获取人数 private function getPeoples():String { return String(maxNum -(gift_num1.Gifts + gift_num2.Gifts + gift_num3.Gifts + gift_num4.Gifts) + 1); } //是否被激活 private function Isactive(checkbox:CheckBox,n:int,value:int):void { if (checkbox.selected) { array[n]=value; } else { array[n]=0; } temp=getNewArray(array); } //改变选择框 private function box_onChange(event:Event):void { switch (event.currentTarget) { case checkbox1 : Isactive(checkbox1,0,11); break; case checkbox2 : Isactive(checkbox2,1,22); break; case checkbox3 : Isactive(checkbox3,2,33); break; case checkbox4 : Isactive(checkbox4,3,44); break; } } //修改礼物数值,并显示 private function ChangeGifts(mygift:Gift,txt:TextField,n:int,vaule:int,checkbox:CheckBox):void { mygift.Gifts=int(txt.text); stage.focus=txt; txt.text=mygift.toString(); if (mygift.Gifts>0) { array[n]=vaule; temp=getNewArray(array); if (!checkbox.selected) { checkbox.selected=true; checkbox.mouseEnabled=true; } } else if (mygift.Gifts==0) { array[n]=0; temp=getNewArray(array); checkbox.selected=false; checkbox.mouseEnabled=false; trace("你来了这里了"); } else { } people_txt.text = getPeoples(); } private function onChange(event:Event):void { switch (event.currentTarget) { case gift1 : ChangeGifts(gift_num1,gift1,0,11,checkbox1); break; case gift2 : ChangeGifts(gift_num2,gift2,1,22,checkbox2); break; case gift3 : ChangeGifts(gift_num3,gift3,2,33,checkbox3); break; case gift4 : ChangeGifts(gift_num4,gift4,3,44,checkbox4); break; } } //获取每次抽奖后选取的结果处理 private function ResultHandler(mygift:Gift,giftNum:TextField,n:int,checkbox:CheckBox):void { if (mygift.Gifts>0) { mygift.Gifts-=1; giftNum.text=mygift.toString();//礼物的数目 if (mygift.Gifts==0) { array[n]=0; temp=getNewArray(array); giftNum.text=mygift.toString(); checkbox.selected=false; checkbox.mouseEnabled=false; } } } //抽取随机号码 private function randomArray(n:int):void { switch (temp[n]) { case 11 : ResultHandler(gift_num1,gift1,0,checkbox1); break; case 22 : ResultHandler(gift_num2,gift2,1,checkbox2); break; case 33 : ResultHandler(gift_num3,gift3,2,checkbox3); break; case 44 : ResultHandler(gift_num4,gift4,3,checkbox4); break; default : trace("结束"); break; } } //抽奖的操作: private function onkeyDown(event:KeyboardEvent):void { switch (event.keyCode) { case Keyboard.SPACE : StopTime(); break; case Keyboard.ENTER : if (time.running) { return; } startTime(); break; case 65 : if (key) { key=false; show(); } else { key=true; unshow(); } break; case 82 : restgame();//系统复位 break; default : trace("错误按键"); break; } } private function startTime():void { time.start(); start = true; stage.focus=textinput; } private function StopTime():void { start = false; speed = 5; } private function stopgame():void { time.stop(); time.delay=200; randomArray(currentID); people_txt.text = getPeoples();//获取人数 } //加快时间和当抽奖完的时候 出现一种缓冲效应 private function SlowTime():void { if (start && time.delay >60) { time.delay -=speed; speed++; } if (!start) { time.delay +=speed; speed++; } if (time.delay > 200) { stopgame(); } } private function onTimer(event:TimerEvent):void { var n:int=Math.floor((temp.length)*Math.random());//长度变更 showgift(n);//显示选择区,判断是否存在数据否则就不进行选择 currentID = n; channel=sound.play(0,1); SlowTime(); } //获取新数组 private function getNewArray(myarray:Array):Array { var Temp:Array=new Array(); for (var i:int=0; i

 

 

 

 六 、程序主界面

 

   由于那个Logo 不方便发上来,只能用Ps处理一下左上角的界面图

  Flash 抽奖程序制作_第2张图片

 

  我们主要界面是这种布局,有五个文本分别是显示礼物数的文本,一个显示客人的文本,四个checkbox组件。

 

 

七、辅助工具

 

 在这次程序当中,利用了一些常见As3缓冲开源类,这些缓冲类能够方便实现一些flash 的缓冲动画效果。这次使用了Tweener这个缓冲效果引擎。有兴趣可以尝试一下。

八、操作方法

 Space-空格键-进行选取

 Enter - 回车 -进行开始

 R--重置

 A--设置总的礼物数

 

九、缺点

  基本需求已经进行完,不过程序当中依然有很多缺点,如采用命名规范性,还不尽人意,面向对象设计依然还没有提升起来,重用性和维护性还没够完善,动画效果表现还没有处理完善。重置功能依然还有一些bug。

 

十、拓展

 这个抽奖程序不是很难的东西,还有很多可以扩展的地方,目前来讲,只能慢慢提升设计水平一步步来进行对程序重构,说不定你也能做出一个更加好的抽奖程序。

 

你可能感兴趣的:(每天学一点Flash)