MC新手入门(三十六)------ 指针

什么是指针
    在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确的找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。
    简单地说,指针就是地址。这里的地址是指内存地址,但是与我们日常生活中的地址很相似,他说明了某一个角色(对程序来说是数据,对生活中的角色可以是人,也可以是物等)所在的地方。我们通常会向某人询问他的住址,然后把这个地址记录在纸上。
例如:林玲要寄一张明信片给小明,明信片中记录了小明的地址,明信片就是我们所说的指针,邮局就是通过明信片中的地址找到小明的住址。如下图所示:

7.jpg

 

MC中指针的使用
使用场景:游戏动画中背景图像的循环使用
实例:背景动画循环播放
目标:使用指针循环调用克隆角色实现一张背景图像的循环调用

5-7-2-3.jpg

图5-7-2-1

5-7-2-2.jpg

图5-7-2-2

首先我们将目标转换成逻辑描述:   

5-7-2-1.jpg

图5-7-2-3


1)首先在粉红色框的位置(2)创建一张背景图CloneOne左端刚好与view框内左端线切并让它恒速向左移动,如图中粉红框(2)左边与view框内左端相切。
2)当背景图CloneOne移动到如图粉红框(3)中右端与view框内右端相切的位置时,在黑框(4)左端与view相切的位置创建另一张背景图 CloneTwo左端与view框相切,同样让它以同样的速度恒速向左移动。
3)当背景图CloneOne右端移动到黑框(1)右端与view框左端相切的位置时,销毁背景图CloneOne。
4)背景图 CloneTwo重复第二和第三步中的内容。
接着我们开始用MC来实现上述的逻辑: 
1)在全局脚本中添加代码:
              //创建Actor型的指针数组变量bgActor[2],并给Flag标志位置1
                  Actor *bgActor[2];
             //Flag置1时表示允许,置0时表示禁止
                  int Flag[2] = {1, 1};
                  void startBackGround();
             //创建第一个背景到view框框内左端(2)的位置,并让bgActor[0]指针指向它
                  void startBackGround()
                 {
                     bgActor[0] = CreateActor("BackGround", "AD_bg_levelTwo", "", "", 0, 0, true);
                     bgActor[0]->x =  (bgActor[0]->width - view.width) / 2;
                     bgActor[0]->y = view.y + bgActor[0]->height / 2;         
                 }
2)在背景图像BackGround中添加 “角色绘制——脚本编辑器” 里添加如下代码:
             /*当bgActor[0]指针指向的克隆角色在view框内右端(3)的位置时,创建第二个克隆角色到view框外右端(4)的位置并让bgActor[1]指针指向它,同时赋予它与 
                bgActor[0]指针指向的克隆角色在水平轴上同样的速度,将Flag[0]标志位置0*/

                if(bgActor[0]->x <= (view.width - bgActor[0]->width) / 2 && Flag[0] == 1)
               {
                    bgActor[1] = CreateActor("BackGround", "AD_bg_levelTwo", "", "", 0, 0, true);
             /*改变bgActo[1]指针指向的克隆角色的位置到view框外右端(4)的位置,同时注意要加上当时bgActor[0]指针指向的克隆角色的移动速度*/
                    bgActor[1]->x = bgActor[0]->xvelocity + (view.width + bgActor[1]->width)  / 2;
                    bgActor[1]->y = view.y + bgActor[1]->height / 2;
                    bgActor[1]->xvelocity = -5;
                    Flag[0] = 0;
               }
               else 
            /*当bgActor[0]指针指向的克隆角色在view框外左端(1)的位置时,销毁它并将Flag[1]标志位置1*/
               if(bgActor[0]->x <=  -(view.width + bgActor[0]->width) / 2)
              {
                   DestroyActor(bgActor[0]->clonename);
                   Flag[1] = 1;
              }
        /*当bgActor[1]指针指向的克隆角色在view框内右端(3)的位置时,创建第二个克隆角色到view框外右端(4)的位置并让bgActor[0]指针指向它,同时赋予它与
              bgActor[1]指针指向的克隆角色在水平轴上同样的速度,将Flag[1]标志位置0*/

              if(bgActor[1]->x <= (view.width - bgActor[1]->width)  / 2 && Flag[1] == 1)
              {
                   bgActor[0] = CreateActor("BackGround","AD_bg_levelTwo","","",0,0,true);
        /*改变bgActor[0]指针指向的克隆角色的位置到view框外右端(4)的位置,同时注意要加上当时bgActor[1]指针指向的克隆角色的移动速度*/
                   bgActor[0]->x = bgActor[1]->xvelocity + (view.width + bgActor[0]->width)  / 2;
                   bgActor[0]->y = view.y + bgActor[0]->height / 2;
                   bgActor[0]->xvelocity = -5;
                   Flag[1] = 0;
              }
              else 
        /*当bgActor[1]指针指向的克隆角色在view框外左端(1)的位置时,销毁它并将Flag[0]标志位置1*/
              if(bgActor[1]->x <=  -(view.width + bgActor[1]->width)  / 2)
             {
                   DestroyActor(bgActor[1]->clonename);
                   Flag[0] = 1;
             }
另外,在MC中还可以实用getclone()函数来调用已经创建好的克隆角色。getclone()函数可以与角色属性clonename配合使用。如一下代码:

       //先创建一个Actor型的指针变量来存放克隆的指针,字符型数组str存放克隆名
             Actor *getclonepoint;
             Char str[32] = "";

       //在创建克隆角色时将克隆名存放在字符数组str中
             bgActor[1] = CreateActor("BackGround","AD_bg_levelTwo","","",0,0,true);
             strcpy(str,bgActor[1]->clonename);

      //利用已知的克隆名获取克隆角色的指针
             getclonepoint = getclone(str);

从上面的例子中可以看出
指针的一般表达式:
                类型说明符  *变量名
其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
在游戏设计中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
对指针变量的定义包括三个内容:
(1)指针类型说明,即定义变量为一个指针变量;
(2)指针变量名;
(3)变量值(指针)所指向的变量的数据类型。
   例如:在前面背景循环的例子中定义的指针变量:
            Actor  *bgActor[2];
注释:也可以用两个变量来代替数组,如 Actor  *bgActorOne,*bgActorTwo;

bgActor是一个Actor类型的指针数组变量,它包括bgActor[0]、bgActor[1]两个元素,如bgActor[0]的值是某个Actor类型变量的地址,或者说bgActor[0]是指向一个Actor型变量。
   应该注意的是,一个指针变量只能指向同类型的变量,不能时而指向一个浮点型,时而又指向一个整型变量。

指针变量的引用

实例:通过引用指针来改变背景在屏幕中的位置。

            bgActor[0] = CreateActor("BackGround","AD_bg_levelTwo","","",0,0,true);
            bgActor[0]->x =  (bgActor[0]->width - view.width) / 2;
            bgActor[0]->y = view.y + bgActor[0]->height / 2;

在背景循环的实例中,由于CreateActor()函数的返回值本身就是一个指针类型,因此可以直接向指针变量bgActor[0]、bgActor[1]赋值。
指针变量同普通变量一样,使用之前不进仅要定义说明,而且必须赋予具体的值。指针变量的赋值只能赋予地址,决不能赋予任何其他数据,否则将引起错误。
两个相关的运算符:
1)&:取地址运算符。
2)*:指针运算符(或称“间接访问”运算符)。
C语言中提供了地址运算符&来表示变量的地址。
其一般形式为:
                     &变量名;  
如&addr表示变量addr的地址,&str表示变量str的地址。变量本身必须预先说明。
设有指向整型变量的指针变量point,如果把整型变量addr的地址赋予point可以有以下两种方式:
1)指针变量初始化的方法
           int addr;
           int *point=&addr;
2)赋值语句的方法
           int addr;
           int *point;
           point = &addr;

 

Demo下载地址:http://www.dongyo.cn/bbs/forum.php?mod=viewthread&tid=2504&extra=page%3D2%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

posted @ 2013-05-16 14:17  zj_king  阅读(315)  评论(0编辑  收藏  举报