这次将实现子弹的配置文件,敌人的配置文件,子弹的精灵和敌人的精灵。以及子弹的发射和敌人的产生。
子弹的分析:
游戏中不可能只有一种子弹,这样子弹就需要一个配置文件,配置文件中有子弹的类型,子弹的贴图,子弹的生命以及子弹的移动速度。
敌人的分析:
同样,游戏中会出现多种敌人,所以,也需要一个敌人的配置文件,其中包括敌人的类型,贴图,速度,生命等属性。
在这里新建了一个目录(data)来存放配置文件。
data中有两个配置文件,一个是子弹的配置文件,一个是敌人的配置文件。
BulletConfig.lua源码
config_bullets = {} config_bullets[1] = { id = 1, skin = "bullet_0.png", life = 10, speed = 0.5 } config_bullets[2] = { id = 2, skin = "bullet_1.png", life = 10, speed = 0.2 }
EnermyConfig.lua源码
config_enermy = {} config_enermy[1] = { id = 1, skin = "enemy_b.png", speed = 0.2, life = 100 } config_enermy[2] = { id = 2, skin = "enemy_m.png", speed = 0.2, life = 50 } config_enermy[3] = { id = 3, skin = "enemy_s.png", speed = 0.2, life = 10 }
每一个配置文件对应一个精灵,即,子弹的配置文件对应的是子弹的精灵,敌人的配置文件对应的是敌人的精灵。
EnermySprite.lua源码:
local scheduler = require(cc.PACKAGE_NAME .. ".scheduler") local BulletSprite = class("BulletSprite",function (path) return display.newSprite(path) end) function BulletSprite:create(data) local bulleSprite = BulletSprite.new(data.skin) for k ,v in pairs(data) do bulleSprite[k] = v end bulleSprite:init() return bulleSprite end function BulletSprite:ctor() end function BulletSprite:init() --子弹移动的计时器 scheduler.scheduleGlobal(function() local speed = (self.speed * display.height) / 60 self:pos(self:getPositionX(),speed + self:getPositionY()) end,1.0 / 60) end return BulletSprite
EnermySprite.lua源码
local scheduler = require(cc.PACKAGE_NAME .. ".scheduler") local EnermySprite = class("EnermySprite",function (path) return display.newSprite(path) end) function EnermySprite:create(data) local enermy = EnermySprite.new(data.skin) for k ,v in pairs(data) do enermy[k] = v end enermy:init() return enermy end function EnermySprite:init() scheduler.scheduleGlobal(function() local speed = (self.speed * display.height) / 60 self:pos(self:getPositionX(),self:getPositionY() - speed) end,1.0 / 60) end return EnermySprite
这里实现了子弹和敌人,接着将他们添加到游戏主界面中就OK了。
在这里,我将它们都放在了一个计时器中,当然,实际上他们是不应该在一个计时器中的。因为,游戏中产生敌人和子弹的节奏应该是不一致的。
GameScene的源码如下:
require("src/app/scenes/Utils")--这个是我的一个工具类,这里没有用到,所以,有没有这句话都行 require("src/app/data/EnermyConfig") local BulletConfig = require("src/app/data/BulletConfig") local BulletSprite = import(".BulletSprite") local EnermySprite = import(".EnermySprite") local scheduler = require(cc.PACKAGE_NAME .. ".scheduler") local GameScene = class("GameScene",function () return display.newScene("GameScene") end) function GameScene:ctor() --添加Player精灵 self.player = display.newSprite("hero_1.png"):addTo(self) self.player:pos(display.cx,display.cy) self.player:setLocalZOrder(10) self.touchPos = cc.p(0,0) self.bullets = {} self.enermy = {} --添加一个TouchLayer接收点击事件 self.touchLayer = display.newColorLayer(cc.c4b(255,0,0,255)):addTo(self) self.touchLayer:setTouchEnabled(true) self.touchLayer:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event) if event.name == "began" then self.touchPos = cc.p(event.x,event.y) elseif event.name == "moved" then local x = event.x - self.touchPos.x ; local y = event.y - self.touchPos.y ; self.touchPos = cc.p(event.x,event.y) ; self:onTouch(x,y) ; else self.touchPos = cc.p(0,0) end return true end) --添加子弹的创建计时器 scheduler.scheduleGlobal(function() self:createBullet()--这里将产生子弹和敌人放在了同一个计时器中,实际上不应该是这样的 self:createEnermy() end , 1) -- 1 为时间 end function GameScene:onTouch(x,y) --更新飞机的位置,没有对飞机是否会触屏做限制 self.player:pos(self.player:getPositionX() + x,self.player:getPositionY() + y) end function GameScene:createBullet() local config = config_bullets[1] local bullet = BulletSprite:create(config):addTo(self) bullet:pos(self.player:getPosition()) self.bullets[bullet] = bullet end function GameScene:createEnermy() --print("create enermy schedule") local config = config_enermy[1] local x = math.random(100,400) local y = display.height + 100 local enermy = EnermySprite:create(config):addTo(self) enermy:setPosition(cc.p(x,y)) self.enermy[enermy] = enermy end function GameScene:onEnter() end function GameScene:onExit() end return GameScene