用Quick3.3开发微信打飞机 (二) -------------------- 子弹和敌人的配置和创建

 

用Quick3.3简单开发微信打飞机02

  1. 这次将实现子弹的配置文件,敌人的配置文件,子弹的精灵和敌人的精灵。以及子弹的发射和敌人的产生。  

 

 

子弹的分析:

游戏中不可能只有一种子弹,这样子弹就需要一个配置文件,配置文件中有子弹的类型,子弹的贴图,子弹的生命以及子弹的移动速度。

敌人的分析:

同样,游戏中会出现多种敌人,所以,也需要一个敌人的配置文件,其中包括敌人的类型,贴图,速度,生命等属性。

在这里新建了一个目录(data)来存放配置文件。

 

data中有两个配置文件,一个是子弹的配置文件,一个是敌人的配置文件。

BulletConfig.lua源码

 

  1. config_bullets = {}  
  2. config_bullets[1] = {  
  3.     id = 1,  
  4.     skin = "bullet_0.png",  
  5.     life = 10,  
  6.     speed = 0.5  
  7. }  
  8. config_bullets[2] = {  
  9.     id = 2,  
  10.     skin = "bullet_1.png",  
  11.     life = 10,  
  12.     speed = 0.2  
  13. }  


EnermyConfig.lua源码

 

 

  1. config_enermy = {}  
  2.   
  3. config_enermy[1] = {  
  4.     id = 1,  
  5.     skin = "enemy_b.png",  
  6.     speed = 0.2,  
  7.     life = 100  
  8. }  
  9. config_enermy[2] = {  
  10.     id = 2,  
  11.     skin = "enemy_m.png",  
  12.     speed = 0.2,  
  13.     life = 50  
  14. }  
  15. config_enermy[3] = {  
  16.     id = 3,  
  17.     skin = "enemy_s.png",  
  18.     speed = 0.2,  
  19.     life = 10  
  20. }  


每一个配置文件对应一个精灵,即,子弹的配置文件对应的是子弹的精灵,敌人的配置文件对应的是敌人的精灵。

 

EnermySprite.lua源码:

 

  1. local scheduler = require(cc.PACKAGE_NAME .. ".scheduler")  
  2.   
  3. local BulletSprite = class("BulletSprite",function (path)  
  4.     return display.newSprite(path)  
  5. end)  
  6.   
  7. function BulletSprite:create(data)  
  8.     local bulleSprite = BulletSprite.new(data.skin)  
  9.     for k ,v in pairs(data) do  
  10.         bulleSprite[k] = v  
  11.     end  
  12.     bulleSprite:init()  
  13.     return bulleSprite  
  14. end  
  15.   
  16. function BulletSprite:ctor()  
  17.      
  18. end  
  19.   
  20. function BulletSprite:init()  
  21.     --子弹移动的计时器  
  22.     scheduler.scheduleGlobal(function()  
  23.         local speed = (self.speed * display.height) / 60  
  24.         self:pos(self:getPositionX(),speed + self:getPositionY())  
  25.     end,1.0 / 60)  
  26. end  
  27.   
  28.   
  29.   
  30. return BulletSprite  


EnermySprite.lua源码

 

 

  1. local scheduler = require(cc.PACKAGE_NAME .. ".scheduler")  
  2.   
  3. local EnermySprite = class("EnermySprite",function (path)  
  4.     return display.newSprite(path)  
  5. end)  
  6.   
  7. function EnermySprite:create(data)  
  8.     local enermy = EnermySprite.new(data.skin)  
  9.     for k ,v in pairs(data) do  
  10.         enermy[k] = v  
  11.     end  
  12.     enermy:init()  
  13.       
  14.     return enermy  
  15. end  
  16.   
  17. function EnermySprite:init()  
  18.     scheduler.scheduleGlobal(function()  
  19.         local speed = (self.speed * display.height) / 60  
  20.         self:pos(self:getPositionX(),self:getPositionY() - speed)  
  21.     end,1.0 / 60)  
  22. end  
  23.   
  24. return EnermySprite  


这里实现了子弹和敌人,接着将他们添加到游戏主界面中就OK了。

 

在这里,我将它们都放在了一个计时器中,当然,实际上他们是不应该在一个计时器中的。因为,游戏中产生敌人和子弹的节奏应该是不一致的。

GameScene的源码如下:

 

    1. require("src/app/scenes/Utils")--这个是我的一个工具类,这里没有用到,所以,有没有这句话都行  
    2. require("src/app/data/EnermyConfig")  
    3. local BulletConfig = require("src/app/data/BulletConfig")  
    4. local BulletSprite = import(".BulletSprite")  
    5. local EnermySprite = import(".EnermySprite")  
    6. local scheduler = require(cc.PACKAGE_NAME .. ".scheduler")  
    7.   
    8. local GameScene = class("GameScene",function ()  
    9.     return display.newScene("GameScene")  
    10. end)  
    11.   
    12. function GameScene:ctor()  
    13.     --添加Player精灵  
    14.     self.player = display.newSprite("hero_1.png"):addTo(self)  
    15.     self.player:pos(display.cx,display.cy)  
    16.     self.player:setLocalZOrder(10)  
    17.     self.touchPos = cc.p(0,0)  
    18.     self.bullets = {}  
    19.     self.enermy = {}  
    20.   
    21.     --添加一个TouchLayer接收点击事件  
    22.     self.touchLayer = display.newColorLayer(cc.c4b(255,0,0,255)):addTo(self)  
    23.     self.touchLayer:setTouchEnabled(true)  
    24.     self.touchLayer:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event)  
    25.           
    26.         if event.name == "began" then  
    27.             self.touchPos = cc.p(event.x,event.y)  
    28.         elseif event.name == "moved" then  
    29.             local x = event.x - self.touchPos.x ;  
    30.             local y = event.y - self.touchPos.y ;  
    31.             self.touchPos = cc.p(event.x,event.y) ;  
    32.             self:onTouch(x,y) ;  
    33.         else  
    34.             self.touchPos = cc.p(0,0)   
    35.         end  
    36.         return true  
    37.     end)  
    38.     --添加子弹的创建计时器  
    39.     scheduler.scheduleGlobal(function()  
    40.       self:createBullet()--这里将产生子弹和敌人放在了同一个计时器中,实际上不应该是这样的  
    41.       self:createEnermy()  
    42.     end , 1)  -- 1 为时间  
    43. end  
    44.   
    45. function GameScene:onTouch(x,y)  
    46.      --更新飞机的位置,没有对飞机是否会触屏做限制  
    47.     self.player:pos(self.player:getPositionX() + x,self.player:getPositionY() + y)  
    48. end  
    49.   
    50. function GameScene:createBullet()  
    51.     local config = config_bullets[1]  
    52.     local bullet = BulletSprite:create(config):addTo(self)  
    53.     bullet:pos(self.player:getPosition())  
    54.     self.bullets[bullet] = bullet  
    55. end  
    56.   
    57. function GameScene:createEnermy()  
    58.     --print("create enermy schedule")  
    59.     local config = config_enermy[1]  
    60.     local x = math.random(100,400)  
    61.     local y = display.height + 100  
    62.     local enermy = EnermySprite:create(config):addTo(self)  
    63.     enermy:setPosition(cc.p(x,y))  
    64.     self.enermy[enermy] = enermy   
    65. end  
    66.   
    67. function GameScene:onEnter()  
    68. end  
    69.   
    70. function GameScene:onExit()  
    71. end  
    72.   
    73. return GameScene  
posted @ 2015-09-14 14:05  silent-bobo  阅读(619)  评论(0编辑  收藏  举报