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


    Lua本是一门面向过程的解释性语言。但在开发过程中有很多人还是习惯于面向对象编程。在Lua中我们能够使用table模拟类。只是写起来不太爽(特别是在继承一些C++类的时候)。通过查看演示样例。发现cocos2d-xsamplesLuaTestLuaResourcesluaScript路径下有一个“extern.lua”文件,这个文件封装对怎样创建一个类,而且十分easy继承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


     

  • 相关阅读:
    Access的相关SQL语句
    决心创业
    [转]在.NET环境中使用单元测试工具NUnit
    [转]IE"单击以激活控件"网站代码解决法
    [转]C#中ToString格式大全
    [转]div中放flash运行30秒钟后自动隐藏效果
    Property和attribute的区别
    C++中的虚函数(virtual function)
    进程间通信方式
    关于页面传值的方法
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5088821.html
Copyright © 2020-2023  润新知