cocos2d-x(十二)Lua开发飞机大战-7-添加敌机

时间:2023-02-08 17:26:58
Lua本是一门面向过程的解释性语言。但在开发过程中有许多人还是习惯于面向对象编程。在Lua中我们可以使用table模拟类,不过写起来不太爽(特别是在继承一些C++类的时候)。通过查看示例,发现cocos2d-x\samples\Lua\TestLua\Resources\luaScript路径下有一个“extern.lua”文件,这个文件封装对如何创建一个类,并且十分容易继承C++类。

这里只介绍extern.lua的其中的两个方法,也是我们接下来要用到的两个方法。

1.function class(classname, super)   这个方法用于声明一个类,第一个参数是你要定义的类名,第二个参数要继承的父类实体(从参数中可以发现只是实现单继承)。

2.function clone(Object) 这个方法用于复制对象

回到正题,想要增添敌机,第一件事想到肯定是定义一个敌机的实体类,那我们定义一个吧,在EnemyLayer.lua文件中定义Enemy实体类

require "Lua/extern"
Enemy = class("Enemy", function(frame)
		local sprite = CCSprite:createWithSpriteFrameName(frame) 
		local peer = {}
		tolua.setpeer(sprite,peer)
		return sprite
	end
  )
Enemy.__index = Enemy

function Enemy:create(frame,life,score,level)
	local enemy = Enemy.new(frame)
	local peer = tolua.getpeer(enemy)
	peer.life = life--敌机的生命值
	peer.score = score--打爆这架敌机,可获得的分数
  	peer.level = level--敌机的等级,图片资源中有三种敌机
	return enemy
end

function Enemy:getLife()
	return tolua.getpeer(self).life
end

function Enemy:getLevel()
	return tolua.getpeer(self).level
end

function Enemy:getScore()
	return tolua.getpeer(self).score
end
	

function Enemy:loseLife()
	tolua.getpeer(self).life = tolua.getpeer(self).life - 1
end

有了敌机,我们再创建一个敌机图层

function create()
	layer = CCLayer:create()
	start()
	return layer
end

start()方法将所有敌机添加到图层中

local enemyAEntry = nil
local enemyBEntry = nil
local enemyCEntry = nil
function start()	
	enemyAEntry = CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(addEnemyA, 3,false)
	enemyBEntry = CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(addEnemyB, 1,false)
	enemyCEntry = CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(addEnemyC, 10,false)
end

在这儿就只贴出添加敌机A方法的代码addEnemyA(),其他两个都与这个类似。

local Enemy_A_Life = 1
local Enemy_B_Life = 2
local Enemy_C_Life = 3

local Enemy_A_SCORE = 5
local Enemy_B_SCORE = 10
local Enemy_C_SCORE = 15

local Enemy_A_Level = 1
local Enemy_B_Level = 2
local Enemy_C_Level = 3

local layer = nil

local enemyArray = {}
function addEnemyAB(frameName,life,score,level)

	local enemy = Enemy:create(frameName,life,score,level)
	local enemyASizie = enemy:getContentSize()
	local minX = enemyASizie.width / 2
	local maxX = visibleSize.width - (enemyASizie.width / 2)
	local rangX = maxX - minX
	local actualX = (math.random() * rangX) + minX
	
	enemy:setPosition(ccp(actualX,visibleSize.height + enemyASizie.height / 2))
	layer:addChild(enemy)
	table.insert(enemyArray,enemy)
	
	local minDuration = 10
	local maxDuration = 20
	local rangeDur = maxDuration - minDuration
	local actuakDur = (math.random() * rangeDur) + minDuration
	
	local actionMove = CCMoveTo:create(actuakDur,ccp(actualX,0 - enemy:getContentSize().height / 2))
	local actionDone = CCCallFuncN:create(removeEnemy)
	local sequence = CCSequence:createWithTwoActions(actionMove,actionDone)
	enemy:runAction(sequence)
	
end

function addEnemyA()
	addEnemyAB("enemy1.png",Enemy_A_Life,Enemy_A_SCORE,Enemy_A_Level)
end

enemyArray这个参数用来存放所有的敌机,在后面的碰撞检测时会有用处。

 

本计划将代码整理后再上传,无赖这段时间太忙,没时间整理,也不知道什么时候有时间更新博文。所以今天先将所有代码上传一份吧,方便大家学习交流。

 源码下载http://download.csdn.net/detail/yifuteli/7305869