×

关注微信公众号

免备案网站空间虚拟主机双线空间域名查询PS数码后期
photoshop互助课堂数百G视频教程下载英语培训机构初中英语如何学随时随地聆听大师开讲/课堂
路径专辑手绘教程抠图教程酷素材photoshop cs3视频教程
查看: 4530|回复: 1

[教程] 码绘俄罗斯方块<<解析玄之不玄的码绘⑤<<张志晨as3实例教程系列6

[复制链接]
发表于 2014-3-24 21:32:59 | 显示全部楼层 |阅读模式
本帖最后由 dqxxx 于 2014-3-24 22:21 编辑

码绘俄罗斯方块<<解析玄之不玄的码绘⑤<<张志晨as3实例教程系列6

文档类:Main.as

  1. package {
  2.         import flash.display.Sprite;
  3.         import flash.events.Event;
  4.         import flash.events.KeyboardEvent;
  5.         import flash.events.MouseEvent;
  6.         import flash.events.TimerEvent;
  7.         import flash.geom.Point;
  8.         import flash.ui.Keyboard;
  9.         import flash.utils.Timer;
  10.         import flash.net.*;

  11.         [SWF(width="120",height="240",backgroundColor="0x000000",frameRate="60")]
  12.         public class Main extends Sprite {
  13.                 private var deadBoxs:Array = new Array();
  14.                 private var liveBoxs:Array = new Array();
  15.                 private var lives:Array = new Array();
  16.                 private var livesLength:int=5;

  17.                 private var xNum:int=10;
  18.                 private var yNum:int=20;
  19.                 private var w:Number=10;
  20.                 private var world:Sprite = new Sprite();
  21.                 private var liveWrapper:Sprite = new Sprite();

  22.                 private var keyRight:Boolean=false;
  23.                 private var keyLeft:Boolean=false;
  24.                 private var keyUp:Boolean=false;
  25.                 private var keyRollRight:Boolean=false;
  26.                 private var goon:Boolean=false;

  27.                 var timer:Timer;
  28.                 var timer2:Timer;

  29.                 public function Main():void {
  30.                         init();
  31.                 }

  32.                 private function init():void {
  33.                         timer=new Timer(1000);
  34.                         timer2=new Timer(100);
  35.                         addChild(world);
  36.                         world.x=10;
  37.                         world.y=20;
  38.                         addChild(liveWrapper);
  39.                         for (var i:int = 0; i < yNum; i++) {
  40.                                 deadBoxs[i] = new Array();
  41.                                 for (var j:int = 0; j < xNum; j++) {
  42.                                         deadBoxs[i][j]=0;
  43.                                 }
  44.                         }
  45.                         lives[0]=1;
  46.                         for (i = 0; i < livesLength; i++) {
  47.                                 initLive();
  48.                         }
  49.                         update();
  50.                         stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  51.                         stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
  52.                         stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
  53.                         timer.addEventListener(TimerEvent.TIMER, timeHandler);
  54.                         timer2.addEventListener(TimerEvent.TIMER, timeHandler2);
  55.                 }

  56.                 function replay() {
  57.                         for (var i:int = 0; i < yNum; i++) {
  58.                                 deadBoxs[i] = new Array();
  59.                                 for (var j:int = 0; j < xNum; j++) {
  60.                                         deadBoxs[i][j]=0;
  61.                                 }
  62.                         }
  63.                         lives[0]=1;
  64.                         for (i = 0; i < livesLength; i++) {
  65.                                 initLive();
  66.                         }
  67.                         start();
  68.                 }

  69.                 function start() {
  70.                         timer2.start();
  71.                         timer.start();
  72.                 }
  73.                 function stop() {
  74.                         timer2.stop();
  75.                         timer.stop();
  76.                 }

  77.                 private function initLive():void {
  78.                         var r:Number=Math.random();
  79.                         if (r < 0.2) {
  80.                                 lives[lives[0]]=0;
  81.                                 liveBoxs[0]={x:1,y:0};
  82.                                 liveBoxs[1]={x:0,y:0};
  83.                                 liveBoxs[2]={x:2,y:0};
  84.                                 liveBoxs[3]={x:3,y:0};
  85.                         } else if (r < 0.4) {
  86.                                 lives[lives[0]]=1;
  87.                                 liveBoxs[0]={x:1,y:0};
  88.                                 liveBoxs[1]={x:0,y:0};
  89.                                 liveBoxs[2]={x:1,y:1};
  90.                                 liveBoxs[3]={x:2,y:1};
  91.                         } else if (r < 0.6) {
  92.                                 lives[lives[0]]=2;
  93.                                 liveBoxs[0]={x:1,y:0};
  94.                                 liveBoxs[1]={x:0,y:1};
  95.                                 liveBoxs[2]={x:1,y:1};
  96.                                 liveBoxs[3]={x:2,y:0};
  97.                         } else if (r < 0.8) {
  98.                                 lives[lives[0]]=3;
  99.                                 liveBoxs[0]={x:0,y:0};
  100.                                 liveBoxs[1]={x:0,y:1};
  101.                                 liveBoxs[2]={x:1,y:1};
  102.                                 liveBoxs[3]={x:1,y:0};
  103.                         } else {
  104.                                 lives[lives[0]]=4;
  105.                                 liveBoxs[0]={x:1,y:1};
  106.                                 liveBoxs[1]={x:1,y:0};
  107.                                 liveBoxs[2]={x:0,y:1};
  108.                                 liveBoxs[3]={x:2,y:1};
  109.                         }
  110.                         move(int(xNum / 2), 1);
  111.                         if (lives[0]==livesLength) {
  112.                                 lives[0]=1;
  113.                         } else {
  114.                                 lives[0]++;
  115.                         }
  116.                 }
  117.                 private function liveToDead():void {
  118.                         for (var i:int = 0; i < liveBoxs.length; i++) {
  119.                                 deadBoxs[liveBoxs[i].y][liveBoxs[i].x]=1;
  120.                         }
  121.                 }
  122.                 private function clear():void {
  123.                         for (var i:int = 0; i < yNum; i++) {
  124.                                 var counter:int=0;
  125.                                 for (var j:int = 0; j < xNum; j++) {
  126.                                         if (deadBoxs[i][j]!=1) {
  127.                                                 //没有小正方形,略过,因为这行不可能消行,
  128.                                                 break;
  129.                                         }
  130.                                         counter++;
  131.                                 }
  132.                                 //如果要消行,一行中有十个小正方形:
  133.                                 if (counter==xNum) {
  134.                                         for (j = 0; j < xNum; j++) {
  135.                                                 //消行:
  136.                                                 deadBoxs[i][j]=0;
  137.                                         }
  138.                                         //上方的所有行下落一行:
  139.                                         for (var ii:int = i; ii > 0; ii--) {
  140.                                                 for (j = 0; j < xNum; j++) {
  141.                                                         deadBoxs[ii][j]=deadBoxs[ii-1][j];
  142.                                                 }
  143.                                         }
  144.                                         //只要有消行,顶行必空:
  145.                                         for (j = 0; j < xNum; j++) {
  146.                                                 deadBoxs[0][j]=0;
  147.                                         }
  148.                                 }
  149.                         }
  150.                 }
  151.                 private function isBottom():Boolean {
  152.                         var ret:Boolean=false;
  153.                         //考察方块中的每一个小正方形:
  154.                         for (var i:int = 0; i < liveBoxs.length; i++) {
  155.                                 //如果到了底行:
  156.                                 if (liveBoxs[i].y==yNum-1) {
  157.                                         ret=true;
  158.                                         break;
  159.                                 }
  160.                                 //如果“地”的上方是一个小正方形:
  161.                                 for (var ii:int = 0; ii < yNum; ii++) {
  162.                                         for (var j:int = 0; j < xNum; j++) {
  163.                                                 if ((deadBoxs[ii][j]==1)&&(liveBoxs[i].y==ii-1)&&(liveBoxs[i].x==j)) {
  164.                                                         ret=true;
  165.                                                         break;
  166.                                                 }
  167.                                         }
  168.                                 }
  169.                         }
  170.                         return ret;
  171.                 }
  172.                 private function isLive():Boolean {
  173.                         var ret:Boolean=true;
  174.                         //是否到了左右边界:
  175.                         for (var i:int = 0; i < liveBoxs.length; i++) {
  176.                                 if (
  177.                                 (liveBoxs[i].x < 0)
  178.                                 ||(liveBoxs[i].x> ( xNum - 1))
  179.                                 ||(liveBoxs[i].y < 0)
  180.                                 ||(liveBoxs[i].y>(yNum-1))
  181.                                 ) {
  182.                                         ret=false;
  183.                                         break;
  184.                                 }
  185.                                 //只要有一个小正方形压在“地”上了:
  186.                                 for (var ii:int = 0; ii < yNum; ii++) {
  187.                                         for (var j:int = 0; j < xNum; j++) {
  188.                                                 if ((deadBoxs[ii][j]==1)&&(liveBoxs[i].x==j)&&(liveBoxs[i].y==ii)) {
  189.                                                         ret=false;
  190.                                                         break;
  191.                                                 }
  192.                                         }
  193.                                 }
  194.                         }
  195.                         return ret;
  196.                 }
  197.                 private function move(x:int=1, y:int=0):void {
  198.                         var old:Array = new Array();
  199.                         //尝试移动:
  200.                         for (var i:int = 0; i < liveBoxs.length; i++) {
  201.                                 old[i]={x:liveBoxs[i].x,y:liveBoxs[i].y};//记忆原位
  202.                                 liveBoxs[i].x+=x;//移动
  203.                                 liveBoxs[i].y+=y;//移动
  204.                         }
  205.                         //如果不能移动,就退回原位:
  206.                         if (! isLive()) {
  207.                                 for (i = 0; i < liveBoxs.length; i++) {
  208.                                         //复原位:
  209.                                         liveBoxs[i]={x:old[i].x,y:old[i].y};
  210.                                 }
  211.                         }
  212.                 }
  213.                 private function roll():void {
  214.                         var old:Array = new Array();
  215.                         for (var i:int = 0; i < liveBoxs.length; i++) {//记忆原位
  216.                                 old[i]={x:liveBoxs[i].x,y:liveBoxs[i].y};
  217.                         }
  218.                         //右旋转
  219.                         for (i= 1; i < liveBoxs.length; i++) {
  220.                                 var tempIX=liveBoxs[i].x;
  221.                                 liveBoxs[i].x=liveBoxs[0].x-liveBoxs[i].y+liveBoxs[0].y;
  222.                                 liveBoxs[i].y=liveBoxs[0].y+tempIX-liveBoxs[0].x;
  223.                         }
  224.                         //如果不能旋转:
  225.                         if (! isLive()) {
  226.                                 for (i = 0; i < liveBoxs.length; i++) {
  227.                                         //复位:
  228.                                         liveBoxs[i]={x:old[i].x,y:old[i].y};
  229.                                 }
  230.                         }
  231.                 }
  232.                 private function update():void {
  233.                         world.graphics.clear();
  234.                         world.graphics.lineStyle(1, 0xffffff);
  235.                         //绘制地上的小正方形:;
  236.                         var i:int;
  237.                         var j:int;
  238.                         for (i = 0; i < yNum; i++) {
  239.                                 for (j= 0; j < xNum; j++) {
  240.                                         if (deadBoxs[i][j]==1) {
  241.                                                 world.graphics.beginFill(0x123456);
  242.                                                 world.graphics.drawRect(j * w, i * w, w, w);
  243.                                         }
  244.                                 }
  245.                         }
  246.                         //移动方块的颜色:
  247.                         var color:Number;
  248.                         if (lives[0]==4) {
  249.                                 color=0x00ffff;
  250.                         } else if (lives[0]==1) {
  251.                                 color=0xff0000;
  252.                         } else if (lives[0]==2) {
  253.                                 color=0x00ff00;
  254.                         } else if (lives[0]==3) {
  255.                                 color=0x0000ff;
  256.                         } else {
  257.                                 color=0xffff00;
  258.                         }

  259.                         //不断在绘制方块:
  260.                         for (i = 0; i < liveBoxs.length; i++) {
  261.                                 world.graphics.beginFill(color,0.9);
  262.                                 world.graphics.drawRect(liveBoxs[i].x*w,liveBoxs[i].y*w,w,w);
  263.                         }
  264.                         world.graphics.endFill();
  265.                         //边框:;
  266.                         world.graphics.lineStyle(1, 0xffffff);
  267.                         world.graphics.moveTo(0, 0);
  268.                         world.graphics.lineTo(xNum * w , 0);
  269.                         world.graphics.lineTo(xNum * w ,yNum * w);
  270.                         world.graphics.lineTo(0, yNum * w );
  271.                         world.graphics.lineTo(0,0);

  272.                         //网格:;
  273.                         world.graphics.lineStyle(1, 0xffffff, 0.5);
  274.                         for (i = 0; i < xNum-1; i++) {
  275.                                 world.graphics.moveTo(w * (i + 1), 0);
  276.                                 world.graphics.lineTo(w * (i + 1), w*yNum);
  277.                         }
  278.                         for (i = 0; i < yNum-1; i++) {
  279.                                 world.graphics.moveTo(0, w*(i+1));
  280.                                 world.graphics.lineTo(w * xNum , w*(i+1));
  281.                         }
  282.                 }
  283.                 private function timeHandler2(e:TimerEvent):void {
  284.                         if (keyLeft) {
  285.                                 move(-1, 0);
  286.                         }
  287.                         if (keyRight) {
  288.                                 move(1, 0);
  289.                         }
  290.                         if (keyRollRight) {
  291.                                 roll();
  292.                         }
  293.                 }
  294.                 private function timeHandler(e:TimerEvent):void {
  295.                         move(0, 1);
  296.                         if (isBottom()) {
  297.                                 liveToDead();
  298.                                 clear();
  299.                                 initLive();
  300.                         }
  301.                 }
  302.                 private function enterFrameHandler(e:Event):void {
  303.                         if (keyUp) {
  304.                                 while (!isBottom()) {
  305.                                         move(0, 1);
  306.                                 }
  307.                                 liveToDead();
  308.                                 clear();
  309.                                 initLive();
  310.                                 keyUp=false;
  311.                         }
  312.                         update();
  313.                 }
  314.                 private function keyDownHandler(e:KeyboardEvent):void {

  315.                         switch (e.keyCode) {
  316.                                 case Keyboard.CONTROL :
  317.                                         if (goon) {
  318.                                                 goon=false;
  319.                                                 stop();
  320.                                         } else {
  321.                                                 goon=true;
  322.                                                 start();
  323.                                         }
  324.                                         break;
  325.                                 case Keyboard.R :
  326.                                         replay();
  327.                                         break;
  328.                                 case Keyboard.LEFT :
  329.                                         if (! goon) {
  330.                                                 return;
  331.                                         }
  332.                                         keyLeft=true;
  333.                                         keyRight=false;
  334.                                         break;
  335.                                 case Keyboard.RIGHT :
  336.                                         if (! goon) {
  337.                                                 return;
  338.                                         }
  339.                                         keyRight=true;
  340.                                         keyLeft=false;
  341.                                         break;
  342.                                 case Keyboard.DOWN :
  343.                                         if (! goon) {
  344.                                                 return;
  345.                                         }
  346.                                         keyUp=true;
  347.                                         break;
  348.                                 case Keyboard.UP :
  349.                                         if (! goon) {
  350.                                                 return;
  351.                                         }
  352.                                         keyRollRight=true;
  353.                                         break;
  354.                         }
  355.                 }
  356.                 private function keyUpHandler(e:KeyboardEvent):void {
  357.                         switch (e.keyCode) {
  358.                                 case Keyboard.LEFT :
  359.                                         keyLeft=false;
  360.                                         break;
  361.                                 case Keyboard.RIGHT :
  362.                                         keyRight=false;
  363.                                         break;
  364.                                 case Keyboard.UP :
  365.                                         keyRollRight=false;
  366.                                         break;
  367.                         }
  368.                 }
  369.         }
  370. }
  371. //教程参考了sliz 的代码
复制代码

Left键    向左平移
Right键   向右平移
UP键     右向旋转
Down键   一键到底
R键      重玩
Contrl键  开始、暂停与继续
游戏需要焦点,如果键盘不能控制游戏,就用鼠标点击一下游戏界面。



解析码绘<<解析玄之不玄的码绘①<<张志晨as3实例教程系列6
飘逸的粒子<<解析玄之不玄的码绘②<<张志晨as3实例教程系列6
雪花代表我的心<<解析玄之不玄的码绘③<<张志晨as3实例教程系列6
码绘A*寻路<<解析玄之不玄的码绘④<<张志晨as3实例教程系列6
码绘俄罗斯方块<<解析玄之不玄的码绘⑤<<张志晨as3实例教程系列6
本帖的地址:http://bbs.jcwcn.com/forum.php?mod=viewthread&tid=539431
跟着教程做一遍,做完的图要到这里评论交作业,教程有看不懂的地方,可以在贴子下面评论

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
发表于 2014-12-4 23:39:23 | 显示全部楼层
酷素材
强烈支持楼主。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | [立即注册]

本版积分规则

2345