我们之前说了要做飞机大战的项目,就从这篇开始吧。
Bullet类
子弹类是这样一种类,它由飞机发出,直线运动,撞到物体后消失,超出地图后也会消失。
-- Bullet
-- 构造函数里面有很多参数,根据这些参数,我们可以实现不同样式的子弹
local Bullet=class("Bullet", function(filename,poX,poY,style,parentNode)
local bullet= display.newSprite(filename)
return bullet
end)
function Bullet:ctor(filename,poX,poY,style,parentNode)
self.moveType=style -- 运动的方向,有的子弹是斜着飞的
self:setAnchorPoint(0.5,0)
self:setPosition(cc.p(poX,poY))
parentNode:addChild(self,2)
self.speed=5
end
function Bullet:move()
local positionX=self:getPositionX()
local positionY=self:getPositionY()
-- update
if self.moveType==1 then
self:setPosition(cc.p(positionX,positionY+self.speed))
elseif self.moveType==2 then
self:setPosition(cc.p(positionX-self.speed/2,positionY+self.speed*0.8660))
elseif self.moveType==3 then
self:setPosition(cc.p(positionX+self.speed/2,positionY+self.speed*0.8660))
end
end
return Bullet
如果你理解了上篇文章所讲,应该知道这里的move方法是一个放在scheduler里执行的方法。
HeroPlane类
hero是这样的一个类,它能随着你的点击移动,然后一直发射子弹,会被敌机攻击,然后生命值不够了就爆炸
-- HeroPlane
local HeroPlane=class("HeroPlane", function()
return display.newSprite("#hero1.png")
end)
function HeroPlane:ctor()
self:setAnchorPoint(0.5,0)
self:setPosition(display.cx,0)
self.speed=3
self.HP=20
end
-- 按照恒定速度移动到一个点
function HeroPlane:move(pox,poy)
self:stopAllActions()
local dis=cc.pGetDistance(cc.p(pox,poy),cc.p(self:getPositionX(),self:getPositionY()))
local timeDelay=dis/self.speed/global_fps
local moveAction=cc.MoveTo:create(timeDelay,cc.p(pox , poy))
totalAction=cc.Spawn:create(angleRevert,moveAction)
self:runAction(moveAction)
end
function HeroPlane:getNewBox()
local originBox=self:getBoundingBox()
originBox.x=originBox.x+10
originBox.y=originBox.y +10
originBox.width=originBox.width-20
originBox.height=originBox.height-20
return originBox
end
function HeroPlane:blowup()
local frames=display.newFrames("hero_blowup_n%d.png",1,4)
local animation=display.newAnimation(frames,0.2)
local animate=cc.Animate:create(animation)
-- local action=cc.RepeatForever:create(animate) -- 你可以用这句让他循环播放
self:runAction(animate)
-- audio.playMusic("sound/hero_down.mp3")
end
return HeroPlane
hero的blowup方法是根据plist文件生成逐帧动画的固定方法,cocos中的动画都是根据设定的时间加入主循环的时间片中,然后顺序执行。
我们这里都没有执行需要更新(update)的函数(比如子弹的move和hero的move),我们将会把它放在主场景的scheduler中执行,一个场景只需要一个update,这才是最高效的方式。