本文转自:http://www.alixixi.com/Dev/W3C/Flash/2007/2007070868666.html

概述:

Flash ActionScript2.0是一种面向对向的编程语言,利用它可以开发出功能强大的应用程序.以早期的ActionScript 1.0相比,它在结构化编程上具有明显的优势,可以使程序具有更强的可移植性,可重性,和伸缩性.

本文通过一个推箱子游戏的开发过程来逐步讲述如何利用ActionScript2.0 进行开发.

结构分析:

在进行一个项目的开发前,项目规化是必不可少的.我们先来思考一下推箱子游戏包含哪些必要的元素呢?

  • 一个玩家(Player)
  • 至少一个箱子(Box)
  • 和箱子数目一样的目标地(Target)
  • 数目不定的砖块(Brick)
  • 砖块连在一下组成了墙壁(Wall)
  • 一个游戏管理者(Manager)
  • 一些显示游戏信息的控件

我们都需要将这些元素抽象化为对象(Object),各个对象包含有各自特有的属性和方法.比如,玩家具有位置属性(currentPos),它表示玩家当全的位置,玩家还有move方法,它使玩家移到下一个位置.等腰三角形这些问题搞清楚了,我们就要进行具体的实现.

实现过程:

  1. 打开Flash,新建"动作脚本文件",依次建立如下.as文件,注意要把它们放在同一个目录下.源文件如下:
  2. //*********Pos.as********* //用来表示游戏中物体位置的类 //游戏中所有对象的位置都为此类的实例 //用col,row 两个量确定物体的位置 class Pos { var col:Number;// 列值 var row:Number;// 行值
    //构造函数 function Pos(c, r) { col = c; row = r; }
    //判断两个位置是否重合 function equals(t):Boolean { return (col == t.col && row == t.row); }
    //根据方向值,取得此位置的下一个位置 function getNextPos(d):Pos{ var nextPos:Pos; nextPos=new Pos(col,row); switch (d) { case 0 : nextPos.col++;
    break; case 1 : nextPos.row++; break; case 2 : nextPos.col--; break; case 3 : nextPos.row--; break; } return nextPos; } }
  3. //************Wall.as************ //用来构建游戏中的墙壁 class Wall extends MovieClip { var brickMatrix:Array;//表示墙壁形状的数组 var left:Number;//左偏移量 var top:Number;//上偏移量 var bricks:Array;//用来存放砖块电影剪辑的数组 var _stepSize:Number;//每块砖的偏移量
    //构造函数 function Wall() { left = 0; top = 0; _stepSize = 40;
    }
    //设置墙壁形状数组 function setMatrix(b) {
    bricks = new Array(); brickMatrix = b; }
    //按照墙壁形状数组修墙 function build():Void { var index = 0; for (var i = 0; i<brickMatrix.length; i++) { for (var j = 0; j<brickMatrix[0].length; j++) { if (brickMatrix[i][j] == 1) { //数组值为1,画一块砖 bricks[index] = attachMovie("Brick", "bricks"+index, this.getNextHighestDepth()); bricks[index]._x = left+j*_stepSize; bricks[index]._y = top+i*_stepSize; index++; } } } } }
  4. //*************Target.as***************** class Target extends MovieClip{ var pos:Pos; var finished:Boolean; var left:Number; var top:Number; var _stepSize:Number; function Target(){ finished=false; left=0; top=0; _stepSize=40;
    } function setPos(p){ pos=p; this._x=left+pos.col*_stepSize; this._y=top+pos.row*_stepSize; } }
  5. //*************Player.as************** //游戏中的player class Player extends MovieClip {

    var _stepSize:Number;//步长 var _wall:MovieClip;//墙壁电影剪彩辑 var startPos:Pos;//初始置 var currentPos:Pos;//当前位置 var left:Number;//左边距 var top:Number;//上边距 var dir:Number;//移动方向 var boxes:Array; var player_path_stack:Array;//玩家移动的路线 var boxes_path_stack:Array;//箱子移动的路线
    //构造函数,初始化 function Player() { _stepSize = 40; currentPos = null; left = 0; top = 0; dir = 0; player_path_stack=new Array(); boxes_path_stack=new Array();
    boxes = new Array(); }
    //设置玩家的起始位置 function setStartPos(p) { startPos = new Pos(p.col, p.row); currentPos = startPos; this._x = currentPos.col*_stepSize+left; this._y = currentPos.row*_stepSize+top;

    }
    //为玩家指定一个wall实例 function setWall(w) { _wall = w; }
    //为玩家指定一个boxes数组,存有所有的箱子实例 function setBoxes(b) { boxes = b; }
    //通过按键控制玩家 function setKeyHandle() { this.onKeyDown = function() {
    if (Key.isDown(Key.LEFT)) { dir = 2;//左键
    } else if (Key.isDown(Key.RIGHT)) { dir = 0;//右键
    } else if (Key.isDown(Key.UP)) { dir = 3;//上键
    } else if (Key.isDown(Key.DOWN)) { dir = 1;//下键
    } var nextObject = this.getNextObject(); //取得玩家下一个位置上的物体
    if (nextObject == "BOX") { //玩家下一个位置上是个箱子 var box_pushed = getPushedBox();//取得此位置上的这个箱子
    //被推到的箱子存在 if (box_pushed) {
    if (box_pushed.getNextObject() == "NOTHING") {//被推箱子的下个位置没有障碍
    boxes_path_stack.push({box:box_pushed,pos:new Pos(box_pushed.pos.col,box_pushed.pos.row)}); box_pushed.move();//被推箱子移一步 this.move();//玩家移一步
    }
    }
    } else if (nextObject == "NOTHING") {//玩家的下个位置玩障碍 this.move(); boxes_path_stack.push(null); }
    }; Key.addListener(this); //监听按键输入 }

    //取得被推到的箱子 function getPushedBox() { var nextPos:Pos; nextPos =currentPos.getNextPos(dir);
    for (var i = 0; i<boxes.length; i++) { if (boxes[i].pos.equals(nextPos)) { return boxes[i]; break; //trace(box_pushed); } } return null; }
    //取得玩家下个位置上的物块类型( 墙壁, 箱子, 无障碍) function getNextObject():String { //var obj:String; var nextPos:Pos; nextPos = currentPos.getNextPos(dir);
    if (_wall.brickMatrix[nextPos.row][nextPos.col] == 1) { return "WALL"; } for (var i = 0; i<boxes.length; i++) { if (boxes[i].pos.equals(nextPos)) { return "BOX"; } } return "NOTHING"; }
    //移到下个位置 function move() { player_path_stack.push(currentPos);
    var c=currentPos.getNextPos(dir); currentPos=c; this._x = left+this.currentPos.col*_stepSize; this._y = top+this.currentPos.row*_stepSize;
    }
    //返回上一步 function reback(){ if(player_path_stack.length>0){ var pre=player_path_stack.pop(); currentPos=pre; this._x = left+this.currentPos.col*_stepSize; this._y = top+this.currentPos.row*_stepSize; } if(boxes_path_stack.length>0 ){ var obj=boxes_path_stack.pop(); if(obj!=null){ var box=obj.box; var pos=obj.pos; box.pos=pos; box._x=box.left+box.pos.col*box._stepSize; box._y=box.top+box.pos.row*box._stepSize; } } } }

  6. class Box extends MovieClip { var pos:Pos; var left:Number; var top:Number; var _wall:MovieClip; var player:MovieClip; var _stepSize:Number; var _targets:Array; var finished:Boolean;//此箱子是否到达目标地
    function Box() { left = 0; top = 0; finished = false; _stepSize = 40; }
    //设置目标地 function setTargets(t) { _targets = new Array(); _targets = t; }
    //设置箱子的起始位置若罔闻 function setStartPos(p) { pos = new Pos(p.col, p.row); this._x = pos.col*_stepSize+left; this._y = pos.row*_stepSize+top; }
    //移到下一个位置 function move() { var c = pos.getNextPos(player.dir); pos = c; this._x = left+pos.col*_stepSize; this._y = top+pos.row*_stepSize; gotTarget(); }
    //是否到达目标地 function gotTarget() { for (var i = 0; i<_targets.length; i++) { if (this.pos.equals(_targets[i].pos)) { if (this.getDepth()>_targets[i].getDepth()) { this.swapDepths(_targets[i]); } this.finished = true; return; } } this.finished = false; }
    //取得一下个位置上物体的类型 function getNextObject():String { //var obj:String; var nextPos:Pos; nextPos = pos.getNextPos(player.dir); if (_wall.brickMatrix[nextPos.row][nextPos.col] == 1) { return "WALL"; } for (var i = 0; i<player.boxes.length; i++) { if (player.boxes[i].pos.equals(nextPos)) { return "BOX"; } } return "NOTHING"; } }
  7. class Matrix{ //用来存放游戏各关中初始界面 static var matrixs:Array;
    function Matrix(){ matrixs=new Array(); //0:null //1:wall //2:player //3:box //4:target //5:target and box //1 2 3 4 5 6 7 8 9 matrixs[0]= [[0, 0, 0, 0, 0, 0, 0, 0, 0],//1 [0, 0, 0, 0, 0, 0, 0, 0, 0],//2 [0, 0, 0, 0, 0, 0, 0, 0, 0],//3 [0, 0, 0, 0, 0, 0, 0, 0, 0],//4 [0, 0, 0, 0, 0, 0, 0, 0, 0],//5 [0, 0, 0, 0, 0, 0, 0, 0, 0],//6 [0, 0, 0, 0, 0, 0, 0, 0, 0],//7 [0, 0, 0, 0, 0, 0, 0, 0, 0],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ];
    //1 2 3 4 5 6 7 8 9 matrixs[1]= [[0, 1, 1, 1, 1, 1, 1, 0, 0],//1 [1, 1, 1, 0, 0, 0, 1, 0, 0],//2 [1, 0, 3, 0, 1, 0, 1, 1, 0],//3 [1, 0, 1, 0, 0, 4, 0, 1, 0],//4 [1, 0, 0, 0, 0, 1, 0, 1, 0],//5 [1, 1, 0, 1, 0, 0, 0, 1, 0],//6 [0, 1, 2, 0, 0, 1, 1, 1, 0],//7 [0, 1, 1, 1, 1, 1, 0, 0, 0],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ]; //1 2 3 4 5 6 7 8 9 matrixs[2]= [[0, 0, 1, 1, 1, 1, 1, 0, 0],//1 [1, 1, 1, 0, 0, 0, 1, 0, 0],//2 [1, 0, 3, 0, 1, 0, 1, 1, 0],//3 [1, 0, 1, 0, 0, 4, 0, 1, 0],//4 [1, 0, 0, 0, 0, 1, 0, 1, 0],//5 [1, 1, 3, 1, 4, 0, 0, 1, 0],//6 [0, 1, 2, 0, 0, 1, 1, 1, 0],//7 [0, 1, 1, 1, 1, 1, 0, 0, 0],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ];

    //1 2 3 4 5 6 7 8 9 matrixs[3]= [[1, 1, 1, 1, 1, 1, 1, 1, 0],//1 [1, 0, 0, 0, 1, 0, 0, 1, 0],//2 [1, 0, 0, 0, 0, 0, 0, 1, 0],//3 [1, 1, 3, 1, 1, 0, 0, 1, 0],//4 [0, 1, 0, 4, 1, 0, 1, 1, 1],//5 [0, 1, 0, 0, 0, 0, 2, 0, 1],//6 [0, 1, 0, 0, 1, 0, 0, 0, 1],//7 [0, 1, 1, 1, 1, 1, 1, 1, 1],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ];

    //1 2 3 4 5 6 7 8 9 matrixs[4]= [[1, 1, 1, 1, 1, 1, 1, 1, 0],//1 [1, 0, 0, 0, 1, 0, 0, 1, 0],//2 [1, 0, 0, 0, 0, 0, 0, 1, 0],//3 [1, 1, 5, 1, 1, 0, 0, 1, 0],//4 [0, 1, 0, 4, 1, 0, 1, 1, 1],//5 [0, 1, 0, 5, 0, 3, 2, 0, 1],//6 [0, 1, 0, 0, 1, 0, 0, 0, 1],//7 [0, 1, 1, 1, 1, 1, 1, 1, 1],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ]; //1 2 3 4 5 6 7 8 9 matrixs[5]= [[0, 0, 1, 1, 1, 1, 0, 0, 0],//1 [0, 1, 1, 0, 0, 1, 1, 1, 1],//2 [1, 1, 0, 0, 0, 0, 0, 0, 1],//3 [1, 0, 3, 0, 1, 2, 1, 0, 1],//4 [1, 0, 1, 0, 4, 0, 0, 0, 1],//5 [1, 0, 0, 3, 0, 1, 1, 1, 1],//6 [1, 1, 1, 0, 4, 1, 0, 0, 0],//7 [0, 0, 1, 1, 1, 1, 0, 0, 0],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ]; //1 2 3 4 5 6 7 8 9 matrixs[6]= [[0, 0, 1, 1, 1, 1, 0, 0, 0],//1 [0, 1, 1, 0, 0, 1, 1, 1, 1],//2 [1, 1, 0, 0, 3, 0, 0, 0, 1],//3 [1, 0, 3, 0, 1, 2, 1, 0, 1],//4 [1, 0, 1, 0, 4, 0, 0, 0, 1],//5 [1, 0, 4, 3, 0, 1, 1, 1, 1],//6 [1, 1, 1, 0, 4, 1, 0, 0, 0],//7 [0, 0, 1, 1, 1, 1, 0, 0, 0],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ]; //1 2 3 4 5 6 7 8 9 matrixs[7]= [[0, 1, 1, 1, 1, 1, 0, 0, 0],//1 [0, 1, 0, 0, 0, 1, 0, 0, 0],//2 [1, 1, 3, 1, 0, 1, 1, 1, 0],//3 [1, 0, 0, 0, 3, 2, 0, 1, 0],//4 [1, 0, 1, 0, 0, 1, 0, 1, 0],//5 [1, 0, 1, 4, 0, 4, 0, 1, 0],//6 [1, 0, 0, 0, 1, 1, 1, 1, 0],//7 [1, 1, 1, 1, 1, 0, 0, 0, 0],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ]; //1 2 3 4 5 6 7 8 9 matrixs[8]= [[0, 1, 1, 1, 1, 1, 0, 0, 0],//1 [0, 1, 0, 0, 0, 1, 0, 0, 0],//2 [1, 1, 3, 1, 0, 1, 1, 1, 0],//3 [1, 0, 0, 4, 3, 2, 0, 1, 0],//4 [1, 0, 1, 0, 0, 1, 0, 1, 0],//5 [1, 0, 1, 4, 4, 3, 0, 1, 0],//6 [1, 0, 0, 0, 1, 1, 1, 1, 0],//7 [1, 1, 1, 1, 1, 0, 0, 0, 0],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ]; //1 2 3 4 5 6 7 8 9 matrixs[9]= [[0, 1, 1, 1, 1, 1, 1, 1, 0],//1 [0, 1, 0, 2, 4, 4, 4, 1, 0],//2 [0, 1, 0, 0, 0, 1, 1, 1, 1],//3 [1, 1, 1, 3, 0, 0, 0, 0, 1],//4 [1, 0, 0, 0, 1, 3, 1, 0, 1],//5 [1, 0, 3, 0, 1, 0, 0, 0, 1],//6 [1, 0, 0, 0, 1, 1, 1, 1, 1],//7 [1, 1, 1, 1, 1, 0, 0, 0, 0],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ]; //1 2 3 4 5 6 7 8 9 matrixs[10]= [[0, 0, 1, 1, 1, 1, 0, 0, 0],//1 [0, 0, 1, 0, 0, 1, 0, 0, 0],//2 [0, 0, 1, 0, 0, 1, 0, 0, 0],//3 [0, 0, 1, 0, 0, 1, 1, 1, 0],//4 [0, 0, 1, 4, 3, 3, 2, 1, 0],//5 [0, 0, 1, 0, 0, 4, 0, 1, 0],//6 [0, 0, 1, 0, 0, 1, 1, 1, 0],//7 [0, 0, 1, 1, 1, 1, 0, 0, 0],//8 [0, 0, 0, 0, 0, 0, 0, 0, 0] //9 ]; }

    function getMatrix(d){ return matrixs[d]; }
    }

  8. //****************Manager.as************* //用来管理游戏 //所有的对象都入其中 //MovieClip类的子类 class Manager extends MovieClip { var wall:MovieClip; var player:MovieClip; var boxes:Array; var targets:Array; var stageNum:Number;//游戏的当前关数
    function Manager() { _x=50; _y=50; }
    //游戏初始化 function init(s) { stageNum = s;
    boxes = new Array(); targets = new Array();
    var brickMatrixT = new Matrix().getMatrix(stageNum);//根据关数从矩阵类中取得相应的矩阵
    //修墙 wall = attachMovie("Wall", "wall", this.getNextHighestDepth()); wall.setMatrix(brickMatrixT); wall.build();
    //创建一个玩家 player = attachMovie("Player", "plyaer", this.getNextHighestDepth()); player.setWall(wall); player.setKeyHandle();//监听键盘输入
    for (var i = 0; i<brickMatrixT.length; i++) { for (var j = 0; j<brickMatrixT[0].length; j++) { if (brickMatrixT[i][j] == 2) { player.setStartPos(new Pos(j, i)); } if (brickMatrixT[i][j] == 3) { var d = this.getNextHighestDepth(); var box = attachMovie("Box", "box"+i+j, d); box.setStartPos(new Pos(j, i)); box.player = player; box._wall = wall; boxes.push(box); } if (brickMatrixT[i][j] == 4) { var d = this.getNextHighestDepth(); var t = attachMovie("Target", "target"+i+j, d); t.setPos(new Pos(j, i)); targets.push(t); } if (brickMatrixT[i][j] == 5) { var d = this.getNextHighestDepth(); var box = attachMovie("Box", "box"+i+j, d); box.setStartPos(new Pos(j, i)); box.player = player; box._wall = wall; box.finished = true; boxes.push(box); var d1 = this.getNextHighestDepth(); var t = attachMovie("Target", "target"+i+j, d1); t.setPos(new Pos(j, i)); targets.push(t); } } }
    for (var i = 0; i<boxes.length; i++) { boxes[i].setTargets(targets); }
    player.setBoxes(boxes); player.swapDepths(this.getNextHighestDepth()); } //判断游戏是否结束 function ifWin() { var win = true; for (var i = 0; i<boxes.length; i++) { win = boxes[i].finished && win; }
    return win; } }
  9. 新建"Flash文档",命名为"push_box",并将它和以上脚本文件存在同一目录下.以下要做的就是建立要用到的电影剪辑,并将其和相应的脚本文件建立链接.
  10. 按"Ctrl+F8",新建一个电影剪辑,命名为"Player",在编辑状态下画一个长,宽都为40象素的小人(_stepSize=40),注意,小人的注册点放在左上脚.画完后在电影库中,右击"Player",选择"为动作脚下本导出",其它不选."标识符","As 2.0类"都为电影剪辑名"Player".要注意,大小写不能搞错,否则会出错.
  11. 按上述方法依次建立"Box","Target"剪辑.
  12. 按10建立名为"Brick"的剪辑,不过由于它不需要外部脚本文件,故"As 2.0"中不要添.
  13. 按10建立"Wall"剪辑,稍有不同的是,在编辑状态下,第一帧中加"stop()",第二帧中加入一个"Brick"剪辑.这样做是因为"Wall"在修建时需要用到"Brick".
  14. 按12建立"Manager"剪辑,不同的是需要点中“在第一帧导出”,而且第二帧加入的不是"Brick",而是"Wall","Player","Box","Target".
  15. 好了,一切就绪,我们可以测试一下了.在主时间轴上第一帧中中入语句:attachMovie("Manager","game1",_root.getNextHighestDepth()); game1.init(1);就可以运行第一关了.
  16. 至于如何建立友好的用户界面,我们只需稍花点力气就搞定了.

  示例:

点击这里下载源文件

  如果你还有任何不明白之处,可发邮件或QQ给我.xiake1860@ncepubj.edu.cn

[转]Flash ActionScript2.0面向对象游戏开发-推箱子的更多相关文章

  1. 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化

    Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...

  2. 012-C语言小游戏之推箱子

    012-C语言小游戏之推箱子 一.创建游戏地图   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #define ROWS 11 #define COLS 12   char ...

  3. 《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记

    最近在看游戏导航源码,但是看了几天感觉看不懂.里面全是一些几何运算,以及一些关于3d方面的知识.发现自己缺少3d这方面的知识,正好也想研究一下3d游戏开发的基本原理,于是决定买本书看看了,后来在ope ...

  4. 5、Cocos2dx 3.0小游戏开发的例子寻找测试三个简单的介绍和总结

    繁重的劳动开发商,当转载请注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 測试例子简单介绍 Cocos2d-x 为我们提供了 ...

  5. 用 CocosCreator 快速开发推箱子游戏

    游戏总共分为4个功能模块: - 开始游戏(menuLayer) - 关卡选择(levelLayer) - 游戏(gameLayer) - 游戏结算(gameOverLayer) Creator内组件效 ...

  6. CocosCreator 快速开发推箱子游戏,附代码

    游戏总共分为4个功能模块: - 开始游戏(menuLayer) - 关卡选择(levelLayer) - 游戏(gameLayer) - 游戏结算(gameOverLayer) Creator内组件效 ...

  7. 《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记

    模型的表示 场景:物品或模型的集合 任何物品都可以用三角形网络逼近表示.我们经常用以下术语描述三角形网络:多边形(polygons).图元(primitives).网络几何单元(mesh geomet ...

  8. 《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记

    REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中, ...

  9. C++学习(九)(C语言部分)之 项目 推箱子游戏

    游戏制作 推箱子 步骤分析 1.模板 2.模板分析 组成元素: 空地 墙 人 目的地 箱子 背景 3.如何操作 通过WASD键盘操作人,推着箱子,到达目的地,游戏结束,如果箱子卡在死角则游戏失败 4. ...

随机推荐

  1. java之Class类详解

    测试中需要用到的代码 InterfaceA代码: package jichu; interface InterfaceA { String s1 = "this is s1 in Inter ...

  2. [moka同学笔记]yii2.0查询数据库

      一. [:id占位符]使用 $results = Test::findBySql($sql,array(':id'=>'1 or 1=1))->all()   二. [id=1]  选 ...

  3. 【poj 3080】Blue Jeans(字符串--KMP+暴力枚举+剪枝)

    题意:求n个串的字典序最小的最长公共子串. 解法:枚举第一个串的子串,与剩下的n-1个串KMP匹配,判断是否有这样的公共子串.从大长度开始枚举,找到了就break挺快的.而且KMP的作用就是匹配子串, ...

  4. PHP学习笔记:万能随机字符串生成函数(已经封装好)

    做验证码用到的,然后就把这个函数封装起来,使用时候要设置2个参数: $str设置里要被采集的字符串,比如: $str='efasfgzsrhftjxjxjhsrth'; 则在函数里面生成的字符串就回从 ...

  5. ahjesus解决win下U盘无法写入的问题

    可能是由于不同品牌的U盘出厂时磁盘分区和格式化方式不同而引起的兼容性问题.解决方案如下 启动cmd.输入diskpart,启动DISKPART工具 在DISKPART窗口中输入以下命令: >li ...

  6. [翻译]:SQL死锁-为什么会出现死锁

    下面这篇对理解死锁非常重要,首先死锁是如何产生的我们要清楚. We already know why blocking occurs in the system and howto detect an ...

  7. Android5.0新特性——兼容性(support)

    兼容性 虽然Material Design新增了许多新特性,但是并不是所有新内容对对下保持了兼容. 使用v7包 v7 support libraries r21 及更高版本包含了以下Material ...

  8. Entity Framework 实体关系总结

    刚开始使用 Entity Framework 的时候,由于没有静下心来认真理清关系,走了一些"痛不欲生"的弯路.而我们目前开发的项目都在使用 Entity Framework,为了 ...

  9. 任意类型转换为IntPtr

    之前,将数组.结构体等转换为IntPtr使用的是Marshal.Copy().Marshal.StructureToPtr(),但是有个问题自定义的结构体数组没法这样转化,一般网上给出的解决方法就是通 ...

  10. DataTable 转换为ArrayList 再转换成 json 格式

    //JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();        //javaScriptSeriali ...