BlitzMax-NG中文用户指南——第二部分

编译者:sosei

Type

BlitzMax里的Type类似于别的程序语言中的Class。类型是BlitzMax的一部分,使它成为一种OOP(面向对象编程)语言。如果您刚接触OOP,Type是最难处理的部分之一。

设置和创建Type

假设我们想要一艘宇宙飞船,那么让我们先为它创建一个结构体:

Type SpaceShip 'declares a new type

  Const help:String="this is what the structure contains"

  Global fleet:String

  Field max_speed:Float

  Field armor:Int=2000

  Field name:String

EndType 'ends declaration

Local ship:SpaceShip

这里定义变量ship为SpaceShip类型。这时的变量并不是个实例对象,要用下面方式创建一个实例对象:

ship = New SpaceShip

也可以合并定义:

Local ship:SpaceShip = New SpaceShip

注:变量里其实放的是实例对象的地址。如果我们不创建一个新的ship,我们的ship将是= null。

现在可以使用ship.SpaceShipFieldName设置该对象的字段:

ship.max_speed = 3.5 'Read: Ship's MaxSpeed set to 3.5

Ship.armor = 5000 'Default was 2000 (See the type)

Ship.name = "wavebreaker"

继续例子:

Local ship2:SpaceShip = New SpaceShip

ship.max_speed = 5.5

ship2 = ship

当给变量ship2赋值成ship中的地址,ship2原指向的实例对象地址就没有被任何变量保存,那么此实例对象将被BlitzMax自动删除。一个实例对象可以有多个指向它的指针。实例对象本身是唯一的,但是它的地址可以驻留在几个不同的变量中。

类型SpaceShip中的变量fleet是用关键字Global定义的,意味着这是类似于Python中的类变量。这种变量在其类型所派生的实例对象中是共享的。即使没有该类型的任何实例,也可以使用它。类型中关键字Const声明的也是所派生的实例对象中是共享的,跟Global的区别是这定义的是个常量。

例子:

Print SpaceShip.help

SpaceShip.fleet = "Quantum Light"

直接对类型SpaceShip的Global变量fleet赋值了。

TList类型

这是列表类型,列表比数组更具动态性,不用在声明时就定下尺寸。

下面是一个用到列表的程序例子:

Global number_of_tanks = 10 'How many tanks to create?

' Having a Global like the one above makes it easy To change how the program

' acts at least in small examples like this. Now let's declare a new type

' called Tank.

Type TTank 'The extra T infront of the type name is good use

  Field x#, y#

  Field dir, armor = 100

  Field speed# = 0.2, size = 25

EndType

Graphics 800,600

Global TankList:TList = CreateList() 'Create a list to store all tanks

' TankList:TList defines TankList To be of the List-Type, CreateList() returns

' a New List. The variable TankList will be used whenever you want To add

' remove or alter this TList.

' Note that TList is a BlitzMax built-in Type And it has it's own methods and

' functions.

' Create a bunch of new Tanks

For Local n = 1 To number_of_tanks ' number_of_tanks is a Global

  Local NewTank:TTank 'Declares a variable to store our Tank-Type

  'Put the address of this new Tank into variable NewTank

  NewTank = New TTank

  'Set a random armor 150 + 10,20,30,40 or 50

  NewTank.armor = Rand( 5 )*10 + 150

  'Random Start Location

  NewTank.x = Rand( 5, 800 )

  NewTank.y = Rand( 5, 600)

  NewTank.dir = Rand( 0, 360 )

  'Put this tank called NewTank into our TankList

  ListAddLast( TankList, NewTank )

Next

While Not KeyDown(Key_Escape)

  Cls

  'Local T is declared to hold the current Tank each loop

  'Because we called our Type TTank, Tank is availible as variable

  For Local Tank:TTank = EachIn TankList

    DrawOval( Tank.x, Tank.y, Tank.size, Tank.size )

    DrawText "Number of Tanks : "+TankList.Count(), 20, 20

    DrawText "Press ESC to exit", 20, 40 '20 is X-coordinate, 40 is Y

    Tank.x:+ Tank.speed*Cos( Tank.dir )

    Tank.y:+ Tank.speed*Sin( Tank.dir )

  Next 'This loop will loop for every Tank that was added to TankList

  Flip

Wend

Method

方法通常是类型的动作,它可以是FireShot()、Explode()、Turn()或Update()。

例子:

Type TWizard

  Field x, y, mana

  Method Teleport( x, y )

    Self.x = x

    Self.y = y

  EndMethod

EndType

可以省略关键字Self,如下写法:

Type TWizard

  Field x, y, mana

  Method Teleport( x2, y2 )

    x = x2

    y = y2

  EndMethod

EndType

所以为了可读性,推荐不要省略关键字Self

注:有一个特殊的方法。方法New(),每次创建该类型的实例时都会运行该方法。

我们也可以写成一个函数,但它看起来会是这样的:

Type TWizard

  Field x, y, mana

  Function Teleport( Wizard:TWizard, x, y )

    Wizard.x = x

    Wizard.y = y

  EndFunction

EndType

类型的方法和类型的函数之间的区别有两点:

区别一,方法内可使用类型内的Global变量、常量、字段变量、方法、函数、类型,都可以直接引用。而类型的函数只可以直接使用类型内的Global变量、常量、函数、类型。

区别二,类型的方法只可以用类型派生的实例对象调用,类似Python中的实例方法;类型的函数既可以用类型派生的实例对象调用,也可以用类型直接调用,类似Python中的静态方法。

例子:

Type TT

  Const  x_const:Int=666

  Global y_var

  Type SubTT

    Field f

  EndType

  Function z_func()

    Print "z_func"

  EndFunction

  Function test_func(y)

    Print x_const

    Local y_var:Int = y

    Print y_var

    Local s:SubTT

    z_func()

  EndFunction

EndType

Local object_var:TT = New TT

object_var.test_func(999)

TT.test_func(999)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容