十二月 8, 2009 1 : 36 上午 此格有 52 个脚印
即时获得麻球游戏开发的最新消息,关注游戏开发者热门讨论,请各位开发者申请加入麻球官方群:121304476
也可以follow catfly围脖:t.sina.com.cn/iscat
也可以follow catfly围脖:t.sina.com.cn/iscat
分享一个给冲锋岛做的拼图小游戏。
看到不少讲拼图游戏的帖子,但好像都是方块分割的,这里给大家看的是一个不规则形状分割的例子。
先来看看实际应用中的demo吧:
下面是测试拼图功能的demo:
This movie requires Flash Player 9
示例原文件下载
核心拼图功能代码在这个Jigsaw的类中,可以结合我提供的原文件进行编译!
实现了:
- 拖拽拼块
- 拼图判断
- 每次随机分配三个拼块
- 拼图过程中各种动画显示效果
package com.ui.jigsaw {
import flash.events.Event;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.utils.getDefinitionByName;
import com.gs.TweenLite;
import flash.events.EventDispatcher;
/**
* @author rman
* @version creat:04:37:372009-2-9
*/
public class Jigsaw extends Sprite{
//主影片
private var __jigMain:Class;
private var jigMain:Sprite;
private var timeState:Boolean = true;
//mask与ceil
private var jigsaw:Sprite;
private var maskContaint:Sprite;
private var ceilContaint:Sprite;
private var dragCeilContain:Sprite;
private var dropDotContain:Sprite;
private var xiaoren:MovieClip;
private var nowDragCeil:Sprite;
private var bigDropArea:Sprite;
private var selNum:int = -1;
private var noNewTempArr:Array = new Array();
private var dragState:Boolean = false;
private var jigNum:uint = 0;
//about ceil
private var ceilArr:Array = new Array();
private var activeCeilArr:Array = new Array(0,1,2,3,4,5,6,7,8);
public function Jigsaw(){
initView();
//加入主影片剪辑
jigMain = new __jigMain();
addChild(jigMain);
jigsaw = jigMain.getChildByName("jigsaw") as Sprite;
/* 获取maskContain与ceilContaint的引用
* maskContain: 找对的拼块所显示的对象
* ceilContaint: 随机出来的供选择的缩小比例拼块
* dragCeilContain: 选择拼块后,跟随鼠标的正常比例拼块*/
maskContaint = jigsaw.getChildByName("maskContaint") as Sprite;
ceilContaint = jigsaw.getChildByName("ceilContaint") as Sprite;
xiaoren = jigsaw.getChildByName("xiaoren") as MovieClip;
bigDropArea = jigsaw.getChildByName("bigDropArea") as Sprite;
dropDotContain = jigsaw.getChildByName("dropDotContain") as Sprite;
dragCeilContain = jigMain.getChildByName("dragCeilContain") as Sprite;
//init
initmaskContaint();
initDropDot();
initDragCeil();
getCeilArr();
upDataCeil();
//default jigsaw
defaultInDot();
addListeners();
}
/***********************************
** 初始化类函数,加入事件函数
***********************************/
private function initView():void{
__jigMain = getDefinitionByName("main") as Class;
}
private function initmaskContaint():void{
for(var i:uint=0;i<maskContaint.numChildren;i++){
var s:Sprite = maskContaint.getChildByName("s"+i) as Sprite;
s.visible = false;
}
}
private function initDropDot():void{
for(var i:uint=0;i<maskContaint.numChildren;i++){
var dropTag:Sprite = new Sprite;
dropTag.name = "dropDot"+i;
var s:Sprite = maskContaint.getChildByName("s"+i) as Sprite;
var theDot:Sprite = makeArea(25,25);
dropTag.addChild(theDot);
dropDotContain.addChild(dropTag);
dropTag.x = s.x + s.width/2 - 12;
dropTag.y = s.y + s.height/2 - 12;
}
}
private function initDragCeil():void{
for(var i:uint=0;i<dragCeilContain.numChildren;i++){
var ceil:Sprite = dragCeilContain.getChildByName("drag"+i) as Sprite;
ceil.alpha = 1;
ceil.scaleX = 1;
ceil.scaleY = 1;
ceil.x = 0;
ceil.visible = false;
}
}
private function addListeners():void{
for(var i:uint=0;i<ceilContaint.numChildren;i++){
var ceil:Sprite = ceilContaint.getChildByName("c"+i) as Sprite;
ceil.buttonMode = true;
ceil.addEventListener(MouseEvent.MOUSE_DOWN, ceilDown);
ceil.addEventListener(MouseEvent.MOUSE_OVER, ceilOver);
ceil.addEventListener(MouseEvent.MOUSE_OUT, ceilOut);
ceil.mouseChildren = false;
}
for(var k:uint=0;k<dropDotContain.numChildren;k++){
var dropDot:Sprite = dropDotContain.getChildByName("dropDot"+k) as Sprite;
dropDot.mouseChildren = false;
}
}
/***********************************
** addListeners函数
***********************************/
private function dropInBig():void{
//initDragCeil();
ceilMoveBack();
dragState = false;
}
private function defaultInDot():void{
var n:uint = Math.random() * 3 + 1;
if(n == 1){
n = 2;
}
for(var i:uint=0;i<n;i++){
var gotMask:MovieClip = maskContaint.getChildByName("s"+ceilArr[0]) as MovieClip;
//trace(ceilArr[0]);
selNum = ceilArr[0];
gotMask.visible = true;
gotMask.gotoAndPlay(2);
getCeilArr();
upDataCeil();
//checkJigNum
jigNum++;
}
}
private function dropInDot(dropDot:Sprite):void{
trace(dropDot.name);
var n:uint = dropDotContain.getChildIndex(dropDot);
//更新ceilContain
//trace("n:"+n+"selNum:"+selNum);
if(n == selNum && dragState){
initDragCeil();
var gotMask:MovieClip = maskContaint.getChildByName("s"+n) as MovieClip;
gotMask.visible = true;
gotMask.gotoAndPlay(2);
getCeilArr();
upDataCeil();
//checkJigNum
dropDot.visible = false;
jigNum++;
checkJigNum();
}else{
ceilMoveBack();
}
dragState = false;
}
private function ceilOver(evt:MouseEvent):void{
var ceil:MovieClip = evt.target as MovieClip;
ceil.gotoAndStop(2);
}
private function ceilOut(evt:MouseEvent):void{
var ceil:MovieClip = evt.target as MovieClip;
ceil.gotoAndStop(1);
}
private function ceilDown(evt:MouseEvent):void{
if(timeState){
dispatchEvent(new Event("startGame"));
timeState = false;
}
var ceil:Sprite = evt.target as Sprite;
var n:uint = ceilContaint.getChildIndex(ceil);
selNum = n;
dragState = true;
//trace(ceilArr[ceilArr.indexOf(selNum)]);
initDragCeil();
nowDragCeil = dragCeilContain.getChildByName("drag"+n) as Sprite;
nowDragCeil.addEventListener(MouseEvent.MOUSE_UP, nowDragUp);
nowDragCeil.visible = true;
nowDragCeil.x = mouseX - nowDragCeil.width/2;
nowDragCeil.y = mouseY - nowDragCeil.height/2;
nowDragCeil.startDrag();
}
private function nowDragUp(evt:MouseEvent):void{
nowDragCeil.stopDrag();
if(nowDragCeil.dropTarget){
var dropTag:Sprite = nowDragCeil.dropTarget.parent as Sprite;
//trace(dropTag.name.slice(0,7));
if(dropTag.name == "bigDropArea"){
dropInBig();
}else if(dropTag.name.slice(0,7) == "dropDot"){
dropInDot(dropTag);
}else{
dropInBig();
}
}
}
/***********************************
** 一些实现jigsaw的方法
***********************************/
private function ceilMoveBack():void{
if(dragState){
//moveBack 时nowDragCeil半透明,比例缩小一半
nowDragCeil.alpha = 0.5;
nowDragCeil.scaleX = 0.5;
nowDragCeil.scaleY = 0.5;
//计算出moveBack的目标x位置
var nowCeilIndex:uint = ceilArr.indexOf(selNum);
var backX:Number;
if(nowCeilIndex == 0){
backX = 25;
}else{
backX = nowCeilIndex%3 * 90;
}
TweenLite.to(nowDragCeil,0.2,{y:380,x:backX});
TweenLite.delayedCall(0.2, tLiteComplete);
}
}
private function tLiteComplete():void{
nowDragCeil.alpha = 0;
nowDragCeil.visible = false;
}
private function checkJigNum():void{
if(jigNum == 9){
dispatchEvent(new Event("winLevel"));
for(var i:uint=0;i<3;i++){
disableCeil(i);
}
}
}
private function disableCeil(n:uint):void{
var ceil:Sprite = ceilContaint.getChildByName("c"+ceilArr[n]) as Sprite;
ceil.buttonMode = false;
ceil.removeEventListener(MouseEvent.MOUSE_DOWN, ceilDown);
}
/***********************************
** 更新ceilContaint子元素显示状态
***********************************/
private function upDataCeil():void{
resetCeil();
upDataCeilAnim();
}
private function upDataCeilAnim():void{
for(var i:uint=0;i<3;i++){
var ceilafter:Sprite = ceilContaint.getChildByName("c"+ceilArr[i]) as Sprite;
ceilafter.x = i%3 * 80;
ceilafter.visible = true;
}
}
private function resetCeil():void{
for(var i:uint=0;i<ceilContaint.numChildren;i++){
var ceil:Sprite = ceilContaint.getChildByName("c"+i) as Sprite;
ceil.x = 0;
ceil.visible = false;
}
}
private function getCeilArr():void{
if(ceilArr.length>0){
var n:uint = activeCeilArr.indexOf(selNum);
activeCeilArr.splice(n,1);
randomArr();
}else{
randomArr();
//trace(activeCeilArr);
}
}
private function randomArr():void{
//tempArr 随 activeCeilArr 更新数据;
var tempArr:Array = new Array();
for(var index in activeCeilArr){
tempArr.push(activeCeilArr[index]);
}
//noNewTempArr 获取 activeCeilArr == 3 时的数据;
if(tempArr.length == 3){
trace("--------");
trace("begin mechanical arm");
for(var index2 in activeCeilArr){
noNewTempArr.push(activeCeilArr[index2]);
}
}
//ceilArr分两种情况更新数据
if(tempArr.length>2){
resetArr(tempArr);
trace(ceilArr);
}else if(tempArr.length == 2 || tempArr.length == 1){
var tempArr2:Array = new Array();
for(var index3 in noNewTempArr){
tempArr2.push(noNewTempArr[index3]);
}
resetArr(tempArr2);
trace(ceilArr);
}
}
private function resetArr(arr:Array):void{
for(var i:uint=0;i<3;i++){
var arrIndex:uint = Math.random()*arr.length;
ceilArr[i] = arr[arrIndex];
arr.splice(arrIndex,1);
}
}
private function makeArea(w:uint,h:uint):Sprite {
var area:Sprite = new Sprite;
area.alpha=0;
area.graphics.beginFill(0x000000,1);
area.graphics.drawRect(0,0,w,h);
area.graphics.endFill();
return area;
}
}
}








看起来很难的样子~~~ 先下载下来研究研究! stone[引用]