简单的对对碰小游戏源码
package com.data
{
import mx.controls.Button;
/**
* 格子数据
**/
public class DataItem extends Button
{
public static const TYPES:Array = [1, 2, 3, 4, 5, 6, 7];
public static const WIDTH:uint = 50;
public static const HEIGHT:uint = 50;
private var _type:int;
private var _px:int;
private var _py:int;
private var _initXY:Boolean;
public function DataItem()
{
super();
this.width = DataItem.WIDTH;
this.height = DataItem.HEIGHT;
this._initXY = false;
select();
}
public function get type():int
{
return _type;
}
public function set type(value:int):void
{
_type = value;
this.label = String(value);
}
public function isSame(item:DataItem):Boolean{
return this._type == item._type;
}
public function get px():int
{
return _px;
}
public function set px(value:int):void
{
_px = value;
}
public function get py():int
{
return _py;
}
public function set py(value:int):void
{
_py = value;
}
public function get initXY():Boolean
{
return _initXY;
}
public function set initXY(value:Boolean):void
{
_initXY = value;
}
public function select(sign:Boolean = false):void{
if(sign){
this.alpha = 1;
}else{
this.alpha = 0.2;
}
}
}
}
-------------------------------------------------------------------------
package com.data
{
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import mx.containers.Panel;
/**L
* 对对碰容器管理
**/
public class DataManager extends Panel
{
private var _data:Array;
private var _rows:uint;
private var _cols:uint;
private var _deletes:Array;
private var _selectItem:DataItem;
private var _timer:Timer;
private var _item1:DataItem;
private var _item2:DataItem;
private var _active:Boolean = false;
private var _unselect:Boolean = false;
public function DataManager(rows:uint, cols:uint)
{
super();
this.layout = "absolute";
_data = new Array();
_rows = rows;
_cols = cols;
_deletes = new Array();
var i:uint = 0;
var j:uint = 0;
var item:DataItem = null;
var array:Array = null;
for(i = 0; i < rows; i++){
array = new Array();
_data.push(array);
for(j = 0; j < cols; j++){
item = createDataItem();
array.push(fillDataItem(i, j, item));
this.addChild(item);
initItemDataXY(item, item.px * DataItem.WIDTH, item.py * DataItem.HEIGHT);
}
}
initDeletes();
if(_deletes.length > 0){
removeDeletes();
}
}
private function initItemDataXY(item:DataItem, x:int, y:int):void{
item.x = x;
item.y = y;
item.initXY = true;
}
/**
* 生成随机类型的数据
**/
private function createDataItem():DataItem{
var item:DataItem = new DataItem();
item.type = int(Math.round(Math.random() * DataItem.TYPES.length));
item.addEventListener(MouseEvent.CLICK, click);
return item;
}
private function removeDeletes():void{
_unselect = true;
_timer = new Timer(200, 5);
_timer.addEventListener(TimerEvent.TIMER, deleteAnimate);
_timer.addEventListener(TimerEvent.TIMER_COMPLETE, deleteAnimateEnd);
_timer.start();
}
/**
* 初始化消除数据
**/
private function initDeletes():void{
_deletes.length = 0;
var array:Array = null;
var i:uint = 0;
var j:uint = 0;
var k:uint = 0;
var n:uint = 1;
var item1:DataItem = null;
var item2:DataItem = null;
/**横向消除*/
for(i = 0; i < _rows; i++){
array = _data[i] as Array;
item1 = array[0] as DataItem;
n = 1;
for(j = 1; j < _cols; j++){
item2 = array[j] as DataItem;
if(item1.isSame(item2)){
n++;
}else{
if(n >= 3){
for(k = j - n; k < j; k++){
addDelete(array[k] as DataItem);
}
}
n = 1;
item1 = item2;
}
}
if(n >= 3){
for(k = j - n; k < j; k++){
addDelete(array[k] as DataItem);
}
}
}
/**纵向消除*/
for(i = 0; i < _cols; i++){
array = _data[0] as Array;
item1 = array[i];
n = 1;
for(j = 1; j < _rows; j++){
array = _data[j] as Array;
item2 = array[i] as DataItem;
if(item1.isSame(item2)){
n++;
}else{
if(n >= 3){
for(k = j - n; k < j; k++){
array = _data[k] as Array;
addDelete(array[i] as DataItem);
}
}
n = 1;
item1 = item2;
}
}
if(n >= 3){
for(k = j - n; k < j; k++){
array = _data[k] as Array;
addDelete(array[i] as DataItem);
}
}
}
}
/**
* 添加消除数据
**/
private function addDelete(item:DataItem):void{
var temp:DataItem = null;
for(var i:uint = 0; i < _deletes.length; i++){
temp = _deletes[i] as DataItem;
if(temp == item){
break;
}else{
temp = null;
}
}
if(temp == null){
_deletes.push(item);
}
}
/**
* 填充已经消除掉的数据
**/
private function fillDeletes():void{
_unselect = true;
var delItem:DataItem = null;
var deep:int = -1;
var newItem:DataItem = null;
var array:Array = null;
var remaings:Array = new Array();
var addIndex:int = 0;
for(var i:int = 0; i < _cols; i++){
remaings.length = 0;
deep = -1;
addIndex = 0;
for(var j:int = 0; j < _deletes.length; j++){
delItem = _deletes[j] as DataItem;
if(delItem.px == i){
if(delItem.py > deep)
deep = delItem.py;
}
}
if(deep > -1){
for(var k:int = deep - 1; k >= 0; k--){
array = _data[k] as Array;
newItem = array[i] as DataItem;
if(newItem != null){
remaings.push(newItem);
}
}
for(var z:int = remaings.length - 1; z < deep; z++){
newItem = this.createDataItem();
initItemDataXY(newItem, i * DataItem.WIDTH, (++addIndex) * DataItem.HEIGHT * -1);
this.addChild(newItem);
remaings.push(newItem);
}
for(var n:int = 0; n < remaings.length; n++){
newItem = remaings[n] as DataItem;
newItem.initXY = false;
array = _data[deep - n] as Array;
array[i] = newItem;
this.fillDataItem(deep - n, i, newItem);
}
}
}
_timer = new Timer(50, 0);
_timer.addEventListener(TimerEvent.TIMER, fillAnimate);
_timer.start();
}
/**
* 消除动画
**/
private function deleteAnimate(e:Event):void{
var item:DataItem = null;
for(var i:int = 0; i < _deletes.length; i++){
item = _deletes[i] as DataItem;
item.visible = !item.visible;
}
}
/**
* 消除动画结束,删除数据
**/
private function deleteAnimateEnd(e:Event):void{
var delItem:DataItem = null;
var array:Array = null;
for(var i:uint = 0; i < _deletes.length; i++){
delItem = _deletes[i];
this.removeChild(delItem);
array = _data[delItem.py] as Array;
array[delItem.px] = null;
}
fillDeletes();
}
/**
* 填充动画
**/
private function fillAnimate(e:Event):void{
var array:Array = null;
var item:DataItem = null;
var sign:Boolean = false;
for(var i:uint = 0; i < _rows; i++){
array = _data[i] as Array;
for(var j:uint = 0; j < _cols; j++){
item = array[j] as DataItem;
if(!item.initXY){
item.y = item.y + 20;
if(item.y >= item.py * DataItem.HEIGHT){
item.initXY = true;
item.y = item.py * DataItem.HEIGHT;
}else{
sign = true;
}
}
}
}
if(!sign){
_timer.stop();
initDeletes();
if(_deletes.length > 0){
removeDeletes();
}else{
_unselect = false;
}
}
}
/**
* 填充数据
**/
private function fillDataItem(row:uint, col:uint, item:DataItem):void{
var array:Array = _data[row];
array[col] = item;
item.px = col;
item.py = row;
}
public function click(e:Event):void{
if(!_unselect){
var item:DataItem = e.target as DataItem;
if(_selectItem != null){
if(_selectItem == item){
selectItem = null;
}else{
if((_selectItem.px == item.px && (_selectItem.py - 1 == item.py || _selectItem.py + 1 == item.py))
|| (_selectItem.py == item.py && (_selectItem.px - 1 == item.px || _selectItem.px + 1 == item.px))){
_active = true;
changeDataIem(_selectItem, item);
}else{
selectItem = item;
}
}
}else{
selectItem = item;
}
}
}
/**
* 交换位置
**/
public function changeDataIem(item1:DataItem, item2:DataItem):void{
selectItem = null;
var px1:uint = item1.px;
var py1:uint = item1.py;
var px2:uint = item2.px;
var py2:uint = item2.py;
fillDataItem(py1, px1, item2);
fillDataItem(py2, px2, item1);
_item1 = item1;
_item2 = item2;
this.setChildIndex(_item1, 0);
this.setChildIndex(_item2, 1);
_timer = new Timer(50, 0);
_timer.addEventListener(TimerEvent.TIMER, changeAnimate);
_timer.start();
}
/**
* 调换动画
**/
private function changeAnimate(e:Event):void{
var move1:Boolean = moveAnimate(_item1);
var move2:Boolean = moveAnimate(_item2);
if(!move1 && !move2){
_timer.stop();
this.setChildIndex(_item1, 0);
this.setChildIndex(_item2, 0);
if(_active){
initDeletes();
if(_deletes.length > 0){
removeDeletes();
}else{
_active = false;
changeDataIem(_item2, _item1);
}
}else{
_item1 = null;
_item2 = null;
}
}
}
private function moveAnimate(item:DataItem):Boolean{
var move:Boolean = false;
var x:int = item.px * DataItem.WIDTH;
var y:int = item.py * DataItem.HEIGHT;
var speed:int = 0;
if(item.x != x){
speed = (x - item.x) / 2;
if(Math.abs(speed) > 5){
item.x += speed;
}else{
item.x = x;
}
move = true;
}
if(item.y != y){
speed = (y - item.y) / 2;
if(Math.abs(speed) > 5){
item.y += speed;
}else{
item.y = y;
}
move = true;
}
return move;
}
public function set selectItem(value:DataItem):void
{
if(_selectItem != null){
_selectItem.select(false);
}
_selectItem = value;
if(_selectItem != null){
_selectItem.select(true);
}
}
}
}
-------------------------------------------------------------------------
测试类:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="955" minHeight="600" creationComplete="init()">
<mx:Script>
<![CDATA[
import com.data.DataManager;
private var manager:DataManager;
public function init():void{
manager = new DataManager(8, 8);
this.addChild(manager);
}
]]>
</mx:Script>
</mx:Application>
简单的对对碰小游戏源码相关推荐
- iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码
iOS精选源码 企业级开源项目,模仿艺龙旅行App 标签选择器--LeeTagView CSSegmentedControl常用的分段选择器,简单易用! 仿微信左滑删除 IOS左滑返回 输入框 iOS ...
- 微信html5小游戏源码70种
2019独角兽企业重金招聘Python工程师标准>>> 微信html5小游戏源码70种 http://download.csdn.net/detail/csdddn/9419955游 ...
- Android 实现扑克牌动画,Android扑克牌猜点小游戏源码
Android扑克牌猜点小游戏源码分享. 该游戏是简单的猜点游戏, 1点为正确的点数 点重新开始后进行洗牌 每次牌的顺序不同 Java代码: package com.mrzhu.test0109_pr ...
- 小游戏|小游戏源码平台、小游戏源码网站有哪些?
小游戏是近几年非常流行的游戏之一,这类游戏操作简单,不用下载专用app,重要还能投放广告,甚至可以根据自己的品牌设计专属游戏,是一种新兴的市场营销手段,营销效果不仅比传统营销方式效果好,还较大限度节约 ...
- 学生学python编程---实现贪吃蛇小游戏+源码
学生学python编程---实现贪吃蛇小游戏+源码 前言 主要设计 1.蛇的表示 2.蛇怎么移动? 3.玩家控制小蛇移动功能的实现 4.如何判定游戏结束? 应用知识点 1.python知识点 1.1 ...
- 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )
坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...
- 【180928】美女贪吃蛇小游戏源码
本源码是一个简单的c#版美女贪吃蛇小游戏源码,基于winform技术制作.控制方向键即可.右侧有记分板,每走一步都记加分.贪吃蛇身体掠过的地方就会显示背景图片,身体越长,显示的越多,玩家可以将图片换成 ...
- 合成大西瓜小程序小游戏源码
近日,一款名为[合成大西瓜]的休闲小游戏火爆社交圈.[合成大西瓜]因其玩法简单.充满魔性而频登微博热搜,游戏开发商微伞小游戏在昨日顺势上线了"合成大西瓜"APP. 起初,大家对 ...
- 合成大西瓜小程序小游戏源码,仅供学习
近日,一款名为[合成大西瓜]的休闲小游戏火爆社交圈.[合成大西瓜]因其玩法简单.充满魔性而频登微博热搜,游戏开发商微伞小游戏在昨日顺势上线了"合成大西瓜"APP. 起初,大家对这种 ...
最新文章
- 将通讯录导入到摩托罗拉A1800通讯录中
- WIN10 关闭驱动签名
- 文件上传简介1---上传到指定的目录
- vue自定义组件,插槽,自定义事件
- ThinkPHP中的find和select的区别
- 本实例演示往TreeSet集合中存储自定义对象
- Hive与数据库的异同
- 计蒜客——回文平方数
- Android:屏幕自适应
- *[codility]CartesianSequence
- 获取当前屏幕高度方法总结
- word文字上下间距怎么调_Word表格调整(行高、文字上下间距等)
- 5.android系统裁剪
- Python ---------列表 集合 字典 深浅拷贝
- 偷得浮生半日闲,您有啥事它出马
- 上面一个星星下面一个r_谁能告诉我微博那个红色五角星有个R?
- VSS配置及使用说明
- 若依项目整合eCharts实现图表统计功能
- 喜讯:世界首款阿兹海默老年痴呆症治疗药将上市
- 从负债累累到老板,00后的逆袭之路