制作有视角的迷宫游戏+碰撞

      FLASH 2008-11-8 10:20:00

制作有视角的迷宫游戏+碰撞

作者:smallerbird   类型:原创   来源:闪吧

 
  演示效果:

 

//最近做了一个迷宫游戏。一说到迷宫游戏,大家一定会想到如何做了。
//先装备一个张画好的迷宫的图片。道路掏空。然后用 地图.hitTest(玩家x,玩家y,true) 进行检测。
//这次要做的迷宫的游戏,不是把所有迷宫整个的显示到画面中,只是显示一部分。
//我们就要解决两个问题:
//1。当玩家视线(屏幕可以看到迷宫的部分)不处在迷宫边界(迷宫四个顶点)的时候,玩家的移动,此时我们设置
//两个移动方式:
//第一个方式:如果要玩家在迷宫中向左移动。那么就要让迷宫向右移动。些时玩家是不动。此时玩家处于视线的“中心”位置
//第二个方式:当视线处于迷宫的四个顶点,就是迷宫移动最左,最右,最上,最下的时候,这个时候,迷宫就不能动了。此时玩家相对
//动,迷宫不动。
//2。检测碰撞。承上,要对两种方式下的移动进行碰撞检测。
//大体的原理就是检测玩家的四个顶点坐标进行检测
//笔者本想在两种移动方式检测应该是一样的,可是在代码写出来的时候。用:地图.hitTest(玩家x,玩家y,true)
//(注:现在用某一个点来说明)
//但是用这个方式不能进行检测第一个方式,总是慢一步。想了好久,后来换一个思路改成:当迷宫向上的时候:地图.hitTest(玩家x,玩家y-速度,true) 就解决了。
//第二个方式:用:地图.hitTest(玩家x,玩家y,true) 正常
//实例名说明:
//mcK 视线 mcPlayer玩家 mcMap 地图
有视角的迷宫游戏+碰撞

//初使化玩家
function ini_mcPlayer() {
var mc:MovieClip = _root.mcPlayer;
//
mc.numCX = mc._x;
mc.numCY = mc._y;
mc.numSd = _root.numPlaySd;
//
mc.iniX = mc._x;
//
mc.minX = mcK._x;
mc.minY = mcK._y;
mc.maxX = mcK._x+mcK._width;
mc.maxY = mcK._y+mcK._height;
//0在中心 1 运行
mc.numGCenterX = 0;
mc.numGCenterY = 0;
// 
mc.goX = function(numFx:Number) {
  var numLast:Number = this._x;
  //
  var numTemX:Number = this._x+this.numSd*numFx;
  if (numTemX<=this.minX) {
   this._x = this.minX;
  } else if (numTemX>=this.maxX) {
   this._x = this.maxX;
  } else {
   if (this._x<this.numCX && numTemX>=this.numCX) {
    this._x = this.numCX;
    this.numGCenterX = 0;
   } else if (this._x>this.numCX && numTemX<=this.numCX) {
    this._x = this.numCX;
    this.numGCenterX = 0;
   } else {
    this._x += this.numSd*numFx;
    this.numGCenterX = 1;
   }
  }
  //
  if (numFx == -1) {
   if (_root.isHitTest(4,0)) {
    this._x = numLast;
   }
  } else if (numFx == 1) {
   if (_root.isHitTest(2,0)) {
    this._x = numLast;
   }
  }
};
mc.goY = function(numFy:Number) {
  var numLast:Number = this._y;
  //
  var numTemY:Number = this._y+this.numSd*numFy;
  if (numTemY<this.minY) {
   this._y = this.minY;
  } else if (numTemY>this.maxY) {
   this._y = this.maxY;
  } else {
   if (this._y<this.numCY && numTemY>=this.numCY) {
    this._y = this.numCY;
    this.numGCenterY = 0;
   } else if (this._y>this.numCY && numTemY<=this.numCY) {
    this._y = this.numCY;
    this.numGCenterY = 0;
   } else {
    this._y += this.numSd*numFy;
    this.numGCenterY = 1;
   }
  }
  //
  if (numFy == -1) {
   if (_root.isHitTest(1,0)) {
    this._y = numLast;
   }
  } else if (numFy == 1) {
   if (_root.isHitTest(3,0)) {
    this._y = numLast;
   }
  }
};
}
//初使化地图
function ini_mcMap() {
var mc:MovieClip = _root.mcMap;
mc.numSd = _root.numPlaySd;
mc.minX = -182;
mc.minY = -124;
mc.maxX = 134;
mc.maxY = 108;
//
mc.goX = function(numFx:Number) {
  var numLast:Number = this._x;
  //
  var numTemX:Number = this._x+this.numSd*numFx;
  if (numTemX<this.minX) {
   this._x = this.minX;
   _root.mcPlayer.goX(1);
   return 0;
  } else if (numTemX>this.maxX) {
   this._x = this.maxX;
   _root.mcPlayer.goX(-1);
   return 0;
  } else {
   //
   if (_root.mcPlayer.numGCenterX == 0) {
    this._x += this.numSd*numFx;
   } else {
    _root.mcPlayer.goX(numFx*-1);
   }
  }
  //
  if (numFx == 1) {
   if (_root.isHitTest(4,this.numSd)) {
    this._x = numLast;
   }
  } else if (numFx == -1) {
   if (_root.isHitTest(2,this.numSd)) {
    this._x = numLast;
   }
  }
};
mc.goY = function(numFy:Number) {
  var numLast:Number = this._y;
  //
  var numTemY:Number = this._y+this.numSd*numFy;
  if (numTemY<this.minY) {
   this._y = this.minY;
   _root.mcPlayer.goY(1);
   return 0;
  } else if (numTemY>this.maxY) {
   this._y = this.maxY;
   _root.mcPlayer.goY(-1);
   return 0;
  } else {
   if (_root.mcPlayer.numGCenterY == 0) {
    this._y += this.numSd*numFy;
   } else {
    _root.mcPlayer.goY(numFy*-1);
   }
   //
  }
  //
  if (numFy == 1) {
   if (_root.isHitTest(1,this.numSd)) {
    this._y = numLast;
   }
  } else if (numFy == -1) {
   if (_root.isHitTest(3,this.numSd)) {
    this._y = numLast;
   }
  }
};
}
//玩家四个顶点的碰撞检测
function isUp(num1) {
var mcTem:MovieClip = _root.mcMap;
var mcTem1:MovieClip = _root.mcPlayer;
//
var obj:Object = mcTem1.getBounds(_root);
if (mcTem.hitTest(obj.xMax, obj.yMin-num1, true)) {
  return true;
}
if (mcTem.hitTest(obj.xMin, obj.yMin-num1, true)) {
  return true;
}
return false;
}
function isDown(num1) {
var mcTem:MovieClip = _root.mcMap;
var mcTem1:MovieClip = _root.mcPlayer;
//
var obj:Object = mcTem1.getBounds(_root);
if (mcTem.hitTest(obj.xMax, obj.yMax+num1, true)) {
  return true;
}
if (mcTem.hitTest(obj.xMin, obj.yMax+num1, true)) {
  return true;
}
return false;
}
function isLeft(num1) {
var mcTem:MovieClip = _root.mcMap;
var mcTem1:MovieClip = _root.mcPlayer;
//
var obj:Object = mcTem1.getBounds(_root);
if (mcTem.hitTest(obj.xMin-num1, obj.yMin, true)) {
  return true;
}
if (mcTem.hitTest(obj.xMin-num1, obj.yMax, true)) {
  return true;
}
return false;
}
function isRight(num1) {
var mcTem:MovieClip = _root.mcMap;
var mcTem1:MovieClip = _root.mcPlayer;
//
var obj:Object = mcTem1.getBounds(_root);
if (mcTem.hitTest(obj.xMax+num1, obj.yMin, true)) {
  return true;
}
if (mcTem.hitTest(obj.xMax+num1, obj.yMax, true)) {
  return true;
}
return false;
}
//
function isHitTest(numChk:Number,num1:Number) {
switch (numChk) {
case 1 :
  //trace ("上");
  return isUp(num1);
  break;
case 2 :
  //trace ("右");
  return isRight(num1);
  break;
case 3 :
  //trace ("下");
  return isDown(num1);
  break;
case 4 :
  //trace("左")
  return isLeft(num1);
  break;
}
}
function isHitMapThisMc(mc:MovieClip) {
var mcTem:MovieClip = _root.mcMap;
var mcTem1:MovieClip = mc;
//
var obj:Object = mcTem1.getBounds(_root);
if (mcTem.hitTest(obj.xMax, obj.yMin, true)) {
  return true;
}
if (mcTem.hitTest(obj.xMax, obj.yMax, true)) {
  return true;
}
if (mcTem.hitTest(obj.xMin, obj.yMin, true)) {
  return true;
}
if (mcTem.hitTest(obj.xMin, obj.yMax, true)) {
  return true;
}
return false;
}
//玩家移动速度
var numPlaySd:Number = 3;
var mcPlayer:MovieClip;
var mcMap:MovieClip;
ini_mcPlayer();
ini_mcMap();
//视线
mcMap.setMask(mcK);
//控制
var numKeyType:Number = 0;
var keyListener = new Object();
keyListener.onKeyDown = function() {
switch (Key.getCode()) {
case 37 :
  //trace ("左");
  _root.numKeyType = 1;
  break;
case 38 :
  //trace ("上");
  _root.numKeyType = 2;
  break;
case 39 :
  //trace ("右");
  _root.numKeyType = 3;
  break;
case 40 :
  //trace("下")
  _root.numKeyType = 4;
  break;
}
// End of switch
};
keyListener.onKeyUp = function() {
_root.numKeyType = 0;
};
Key.addListener(keyListener);
//
function chkKey() {
switch (numKeyType) {
case 1 :
  _root.mcMap.goX(1);
  break;
case 2 :
  _root.mcMap.goY(1);
  break;
case 3 :
  _root.mcMap.goX(-1);
  break;
case 4 :
  _root.mcMap.goY(-1);
  break;
default :
}
}
//
var numPlayX:Number, numPlayY:Number;
//
_root.onEnterFrame = function() {
chkKey();
};
 
标签集:TAGS:
回复Comments() 点击Count()
喜欢就顶一下

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}