游戏开发吧 关注:96,048贴子:617,554

面向对象的方法在游戏中的应用的一个例子

只看楼主收藏回复

  接触过计算机高级语言的人都听说过面向对象编程(即OOP),但究竟什么是面向对象编程呢?这个问题就不是刚刚接触计算机的初学者所能完全理解的了.为了帮助大家理解面向对象的编程,我们这里用VB作为开发工具,以一个相对较小的例子来看一看VB中怎样使用面向对象的编程方法。
什么是面向对象的编程方法呢?
   总的说来面向对象的编程方法的核心就是:封装性、继承性和多态性。下面我们作一个简单的介绍:


1楼2010-12-06 13:25回复
    封装性也就是说要将对象的信息(也就是对象的属性)和对象所能执行的动作(也就是对象的方法)包装起来,这样就可以让使用者可以用深入不了解内部的运作原理,就可以对其进行操作。举个简单的例子,在v
    b中我们要使用的一个控件,我们不必了解其中给一个属性是怎样传给对象的,也不要知道当我们调用一个对象控件的方法时,对象在其中为我们作了些什么,我们所要作的仅仅是要符合它的使用规范对其进行简单的使用即可。
    继承性则是说,一个对象可以在一个或多个已有对象的基础上,通过继承这些对象具有的属性,方法和事件,并添加自己的属性方法和事件,使其功能更加强大。而其中对已有对象的属性,方法和事件的拥有,就是继承性的精髓所在。比如在V
    B中有一个TEXTBOX控件可以处理简单的文本信息,同时还有一个RICH
    TEXTBOX控件,很明显后一个控件是在前一个的基础上建立起来的,但在功能上后一个除了具备前一个控件的功能外,还具有远远强于前者的更加丰富的功能。


    2楼2010-12-06 13:25
    回复
      多态性,简单的说,就是在许多种不同的对象中,可以使用相同的方法,但是同样的方法能为各个对象执行不同的任务.也就是说程序能在运行时根据不同的对象,运行是用于当前对象的方法.例如,几乎所有的控件都包含一个move方法.当一个控件调用这个方法时,程序能够准确的知道是那一个控件在使用这个方法,从而执行此控件特定的任务.
      可以看到面向对象的编程方法关键就是为了提高代码的可重用性,从而减少代码的长度,减轻程序员的负担。


      3楼2010-12-06 13:25
      回复
           那么在V B 中怎样进行面向对象的编程呢?其实说出来也很简单。在V
        B的工具箱中的每一个控件从实质上说都是一个类,其中包含了这个类的所有的属性,事件和方法。当你将一个控件放置在V
        B工程的窗体上时,开发工具自动为你创建这个控件类的一个实例,通过这个实例你可以方便的使用它的另一种属性,事件和方法。另一种,就是不使用可见的控件而是从“工程”中“引用”一个类的,并在代码中显示的定义这个类的一个实例,就可以想用控件一样对其属性,事件和方法进行灵活的控制了。
        我们这篇文章将用类的方法完成一个扫雷游戏的编写,更主要的是在其中我们可以看到怎样建立一个自己的类,以及在工程中使用这个类。


        4楼2010-12-06 13:26
        回复
          一、我们现来看一看怎样建立一个类.
             在VB中建立一个类要使用Class
          Module(类模块).一个类模块相当于一个简单的程序对象.当一个类模块建立起来后,我们就可以在程序的其他窗体中,定义一个类的实例,然后就像使用一个对象一样访问它的属性,调用它的方法.下面是一个简单的例子.
          对于扫雷游戏来说,每一个地雷都有一个位置,这些地雷按位置紧密排列在窗体上,所以我们可以先建立一个包含地雷x
          , y轴位置的类.具体过程如下:


          5楼2010-12-06 13:26
          回复
            1、创建一个类模块。首先在v
            b的[工程]菜单上选择[添加类模块]。这样就在工作区中显示了一个新的类模块,其默认的名字为Class1。
            2、设定类的属性和事件。当建立一个新的类之后,就需要设定类的三个属性值。
            属性:
               Name属性:也就是类的名字,可以在程序中区别于其他的类。
            Public属性:用来确定该类在当前的项目之外能否被其他程序使用。只有两个值:True和False。当该属性值为True时,其他应用程序可以对该类进行某种类型的访问。其访问类型由下面的Instancing决定。当该属性值被设置为False时,表示该类只能在定义类的程序中使用。
            Instancing属性:用来确定其他的应用程序何时能够访问该类。该属性只有在Public属性设置为真时才起作用。(不是太重要,我们省略)
            事件:类模块主要有两个事件:Initialize和Terminate。在创建类的时候,我们可以在这些事件中添加代码,这样就可以在类的实例被创建或被析构时使程序采取一些动作。类似于c
            / c + +中的构造函数和析构函数。
            在这里我们主要修改了新类的Name属性:设置为clsCoords,这样我们就可以用这个名字来作为类的名字,定义它的实例,并访问它的属性和事件了.


            6楼2010-12-06 13:26
            回复
              3、向类中添加属性
              在设定了类的属性和事件之后,我们就需要为类添加用户自己定义的属性了.要向类中添加属性有两种方法:一种是在类中定义public变量.在这里Public关键字表明在类中创建的变量是在任何模块中都可以使用的公共变量,也正因为这一点,所以程序的任何部分无须进行任何数据检查就能修改变量的值,这样如果传给对象的是一个坏数据,那么就可能产生问题(不过也因为使用简单,所以我们这里就使用这种方法);另一种是使用Property过程.这种方法类似于使用一个过程,通过调用过程时,将参数传递的数据,经过验证后,赋给类中的私有属性,(或者将私有属性传递给参数).通过使用这种方法,程序为访问和修改对象属性提供了接口,这样程序员就可以编写代码来验证向类传递的数据是否正确,使类的函数不会因传递了坏数据而崩溃.下面是对可以使用的三种属性过程及其作用的总结:


              7楼2010-12-06 13:26
              回复
                   属性类别
                   作 用
                   Property Let
                   从调用的程序接收属性值,用来设置属性值
                   Property Get
                   向调用的程序传送属性值,用来获取属性值
                   Property Set
                   特殊情况的Let过程,用来设置对象变量的值
                下面是具体个实现方法:
                   要创建类的属性过程,我们先要进到类的代码窗口,然后从[工具] ( Tool
                )菜单中选择[添加过程] ( Add Procedure
                ).在显示的”添加过程”对话框中,输入过程的名字,以及”类型”中的[属性]选项,单击[确定],这样就在类模块中创建了Property
                Let和Property Get过程。


                8楼2010-12-06 13:26
                回复
                  4、向类中添加方法
                  任何程序都要实现一定的动作才能体现它的用处,因此,我们也要给类创建一些方法.它实质上也就是通过在类中编写公共过程实现的.这些过程与为程序的其他部分编写的过程类似.所有在类模块中的过程都以声明语句开始.如果这一语句使用Public关键字,那么该过程就是类的方法,并且该过程可以被在任何模块中创建的该类的实例所调用;如果该过程用Private关键字开始,那么该过程只能在定义该类的模块中调用.(方法同上)


                  9楼2010-12-06 13:27
                  回复
                    5、向类中添加事件
                    为了在类中创建事件,需要完成下面两个步骤:
                    (1)在类中声明事件。若要声明事件,只要提供事件名和在事件中要传递的参数,方法和定义属性类似,只是关键字使用Event
                    ,并且开始的关键字必须为Public,这样才能使在不同模块中定义的类的实例能触发该方法。
                    (2)使用Raise Event语句触发事件。声明了事件之后,就可以使用Raise
                    Event语句在类的代码的任何地方触发该事件。
                    我们这里不使用对象的事件,所以省略。


                    10楼2010-12-06 13:27
                    回复
                      二、怎样在程序中使用定义的类呢?
                      1、创建类的对象
                      要使用一个已经定义的类,首先要创建一个该类的对象。有两种方法可以从用户开发的类中创建对象:使用声明语句或使用Set语句。一旦用这两种方法创建了该类的对象后,就可以在程序中使用该对象,并能通过给对象访问对象的属性和方法。
                      当一个类的对象被创建后,类模块中的Initialize事件首先运行,为了的属性方法的访问做准备,相当于C++语言中的构造函数。
                      (1)使用声明语句:
                      当定义了一个类之后,我们就可以像使用一般的类型一样使用这个类.形式上唯一不同之处就是,在dim .
                      . . as ..之后,还要加一个New关键字,形式变为 Dim . . . As New . .
                      .
                      使用这种方式时,声明语句直接创建对象的实例,我们可以通过这个对象的实例在程序中访问对象的属性和方法.


                      11楼2010-12-06 13:27
                      回复
                        (2)使用Set语句:这是创建对象的第二种方法.使用这种方法时,首先要声明对象变量,然后用Set语句创建对象的实例.如我们在游戏中使用了以下代码定义了一个clsCoords类型的实例objCoords

                        Dim objCoords As New clsCoords
                        同样,在我们用Set语句创建了对象变量之后,我们可以通过这个对象的实例在程序中访问对象的属性和方法.与前一种方法的不同之处在于,虽然我们先创建了一个对象的类型,但是我们还是不能使用这个对象,直到使用Set语句时才实际创建了对象的实例,这是我们才可以通过这个对象的实例在程序中访问对象的属性和方法.


                        12楼2010-12-06 13:27
                        回复
                          2、设置和读取属性值:
                             对象的实例创建了,必然要对它的属性进行访问.对于这一步其实很简单,
                          例如我们在coords.cls类模块中定义的两个变量
                          '定义了一个对象用来保存被错误标记的地雷的x , y轴坐标
                          Public mintX As Integer
                          Public mintY As Integer
                          当我们要访问它的值时,我们只要使用像下面的方式即可.
                          Dim objCoords As New clsCoords
                          '在新建的clsCoords类的实例中存储被标记错误的地雷的X , Y坐标位置
                          objCoords.mintX = intX
                          objCoords.mintY = intY
                          这里我们给clsCoords类的新的实例objCoords的两个属性mintX和mintY赋予了新值.


                          13楼2010-12-06 13:27
                          回复
                            3、使用对象的方法
                               要使用用户自己创建的对象的方法,与在v
                            b中使用内在对象和控件的方法一样.只要提供要执行对象的名称和方法名,以及方法中要传递的数据即可.下面是我们在代码中的使用对象的方法的一个例子.
                            Private objMine As New clsWinMine
                            Private Sub Form_MouseMove(Button As Integer,
                            Shift As Integer, x As Single, y As Single)
                            '当鼠标左键被按下时,出发此事件,调用clsWinMine类的BeginHitTest过程来确定点击的方格的位置
                            objMine.TrackHitTest Button, x, y
                            End Sub
                            此段代码调用clsWinMine类的BeginHitTest过程来确定点击的方格的位置。
                            


                            14楼2010-12-06 13:28
                            回复
                              三、下面我们一起来分析一下在扫雷游戏中建立的类。
                              在这个例子中,我们可以看到主要有两个类,一个是用来描述地雷位置的coords类,其中定义了两个属性,mintX
                              , mintY .代码如下:
                              '在coords.cls类模块中定义的两个变量
                              '定义了一个对象用来保存地雷的x , y轴坐标
                              Public mintX As Integer
                              Public mintY As Integer
                              另一个类是用来控制扫雷游戏的winmine类,其中定义了主要的属性,方法,代码如下:
                              '定义鼠标左键,同VB中的定义常数vbKeyLButton ,值都为1
                              Private Const LEFT_BUTTON As Byte = 1
                              '标记一个方格是否为空的标志
                              Private Const NONE As Byte = 0
                              '标记一个方格是否为一个带雷的方格
                              Private Const MINE As Byte = 243
                              '标记一个方格是否被点开
                              Private Const BEEN As Byte = 244
                              '标记一个方格是否已经被标记为一个带雷的方格
                              Private Const FLAGGED As Byte = 2
                              '标记一个方格是否被标记为一个问号,即一个存有疑问,不能确定的方格
                              Private Const QUESTION As Byte = 1
                              '定义扫雷游戏中最大和最小的地雷地图的行数和列数及其地雷个数
                              Private Const MIN_MINES As Byte = 10
                              '最小的地雷数
                              Private Const MIN_ROWS As Integer = 8
                              Private Const MIN_COLS As Integer = 8
                              '最小的地图行数列数
                              Private Const MAX_MINES As Byte = 99
                              '最大的地雷数
                              Private Const MAX_ROWS As Integer = 24
                              Private Const MAX_COLS As Integer = 36
                              


                              15楼2010-12-06 13:28
                              回复