飞镖忍者 quick-cocos2d-x3.2

经典的入门小游戏,这里用quick-cocos2d-x3.2重新写一遍,以便熟悉下quick

首先,创建工程,如果不会自行百度啊。

1、编译效果如下:

2、将游戏背景设置为白色,同时我们也来看一下MainScene.lua的文件

local MainScene = class("MainScene", function()
    return display.newScene("MainScene")
end)

--  相当于C++中的构造函数
function MainScene:ctor()
--      将背景设置为白色,而且这个作为当前场景的层,以便以后实现触摸事件
     self.touchLayer_ =   display.newColorLayer(cc.c4b(255,255,255,255)):addTo(self)

end

function MainScene:onEnter()
end

function MainScene:onExit()
end

return MainScene

效果:

添加忍者将其放在屏幕左边中间,以及添加每帧刷新的方法。在ctor方法的后面添加如下代码。

   --添加忍者精灵
     self.player_ = display.newSprite("Player.png"):addTo(self.touchLayer_)
     self.player_:pos(self.player_:getContentSize().width / 2 , display.height / 2)

     -- 初始化存储飞镖和敌人(怪物)的数组
     self.projectiles_ = {}
     self.monsters_ = {}

     -- 添加每帧刷新的方法
     self:addNodeEventListener(cc.NODE_ENTER_FRAME_EVENT,handler(self , self.update))
     self:scheduleUpdate()

之后在MainScene.lua中添加

--添加敌人
function MainScene:addMonster()

end

function MainScene:onTouchEnded(x , y)

end

--每帧刷新
function MainScene:update(dt)
    print("update")

end

效果

添加每秒调用的方法。在MainScene.lua的最上面添加如下代码

local scheduler = require(cc.PACKAGE_NAME .. ".scheduler")

之后在ctor方法中的最下面添加如下代码:

     --  添加一个每秒刷新的方法
     scheduler.scheduleGlobal(function()
            self:addMonster() --每秒调用的方法
     end , 1)  -- 1 为时间

下面实现添加怪物

--添加敌人
function MainScene:addMonster()
    local monster = display.newSprite("monster.png"):addTo(self.touchLayer_)

    local minY = monster:getContentSize().height / 2
    local maxY = display.height - monster:getContentSize().height / 2

    local rangeY = maxY - minY

    local actualY = math.random(rangeY)
    monster:pos(display.width + monster:getContentSize().width / 2 , actualY)

    local minDuration = 2.0
    local maxDuration  = 4.0

    local rangeDuration = maxDuration - minDuration

    local actualDuration = (math.random(rangeDuration))

    transition.moveTo(monster,{
        x = -monster:getContentSize().width / 2,
        y = actualY ,
        time = actualDuration,
        onComplete = function (event)
            --执行结束后删除
            self.monsters_[event] = nil
            event:removeSelf()
        end

    })
    --  放入 存放怪物的数据  以后以便删除
    self.monsters_[monster] = monster
end

添加触摸事件,在ctor方法的最下面

  --添加触摸事件
    self.touchLayer_:setTouchEnabled(true)
    self.touchLayer_:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event)
        if event.name == "ended" then
            self:onTouchEnded(event.x,event.y)
        end
        return true
    end)

实现电机屏幕发射飞镖

function MainScene:onTouchEnded(x , y)
    print("onTouchEnded")

    local location = cc.p(x,y)
    local projectile = display.newSprite("Projectile.png"):addTo(self)
    projectile:pos(20 , display.height / 2)
    local px , py = projectile:getPosition()

    local offset = cc.pSub(location,cc.p(px,py))

    if (offset.x <= 0) then return end

    local realX = display.width + projectile:getContentSize().width / 2
    local ratio = offset.y / offset.x

    local realY = realX * ratio +py

    local realDest = cc.p(realX,realY)

    local offRealX = realX - px
    local offRealY = realY - py

    local length = math.sqrt(offRealX * offRealX + offRealY * offRealY)

    local velocity = 480 / 1

    local realMoveDuration = length / velocity

    transition.moveTo(projectile,{
        x = realDest.x ,
        y = realDest.y ,
        time = realMoveDuration ,
        onComplete = function (event)
            self.projectiles_[event] = nil
            event:removeSelf()

        end
    })
    self.projectiles_[projectile] = projectile

end

最后实现打击敌人子弹和敌人同时消失。

-- 求两点间距离
local function dist(ax, ay, bx, by)
    local dx, dy = bx - ax, by - ay
    return math.sqrt(dx * dx + dy * dy)
end

--每帧刷新
function MainScene:update(dt)

    --    print("update")
    local projectilesToDelete = {}

    for k_pro, v_pro in pairs(self.projectiles_) do

        local monstersToDelete = {}

        for k_mon , v_mon in pairs(self.monsters_) do
            local p_x , p_y = v_pro:getPosition()
            local m_x,m_y = v_mon:getPosition()

            if dist(p_x,p_y,m_x,m_y) <= 30  then

                monstersToDelete[v_mon] = v_mon
                projectilesToDelete[v_pro] = v_pro
            end

        end

        for k_m_d , v_m_d in pairs(monstersToDelete) do
            --            local x , y = v_m_d:getPosition()
            self.monsters_[v_m_d] = nil
            v_m_d:removeSelf()

        end

        monstersToDelete = nil
    end

    for k_p_d , v_p_d in pairs(projectilesToDelete) do

        self.projectiles_[v_p_d] = nil
        v_p_d:removeSelf()
    end
    projectilesToDelete = nil

end

这样我们就实现了这个简单的小游戏,感觉有quick实现起来比之前容易很多。

代码下载:http://download.csdn.net/detail/qqmcy/8087361

原文地址:http://blog.csdn.net/qqmcy/article/details/40508873

时间: 2024-10-17 23:53:55

飞镖忍者 quick-cocos2d-x3.2的相关文章

quick cocos2d x 手机(Android端)启动过程学习

简要学习下quick cocos2d x 在安卓端启动的过程. 首先需要了解一点:quick cocos2d x是依托于Android的activity和GLSurfaceView(继承自SurfaceView)的环境来显示quick层的游戏界面. (1)首先quick类的android游戏从AndroidManifest.xml文件指定的activity(假设AC)启动. (2)AC继承父类的Cocos2dxActivity. (3)调用静态初始化块,加载cocos2dx的动态库.也就是一些C

quick cocos2d-x Xcode下省去clean,让修改的脚本生效

<quick cocos2d-x Xcode下省去clean,让修改的脚本生效> 项目  target     build phases    点击build phase的空白区域 选择Editor     Add Build Phase      Add Run Script Build Phase 编写脚本: 顺序调整:(第二顺位) 这样就可以避免每次修改了lua脚本,都要手动clean,然后再run,太费时间.. quick cocos2d-x Xcode下省去clean,让修改的脚本生

quick cocos2d x场景切换的生命周期函数调用学习

先上一个场景的基本模版: 1 local ModelScene = class("ModelScene", function() 2 return display.newScene("ModelScene") 3 end) 4 5 function ModelScene:ctor() 6 self.sceneName = "ModelScene" 7 -- 注册点击事件监听 8 self.layer = display.newLayer() 9

很久没写博客了!今天来写个八方向摇杆基于quick cocos2d

首先!马上毕业了最近在找工作,还算有点时间好久没写东西了就写点东西吧! 进入主题,首先先思考算法和逻辑.把圆分为八块,每块45度.正上,正下,正左,正右会被X和Y 平分.一边一半各是22.5度.(PS:开始想用 斜率的,但是发现斜率是tan的图像,也就是无限趋近最大值和最小值的不好做判断最后就用了cos也可用sin)思考计算的过程图如下: 准备工作完了就开始,首先控制的人物有八个状态分别是:上,下,左,右,左上,左下,右上,右下的动画.不同的状态对应着不同的动画,触控点和圆心点作比较来判断是哪个

【Q2D】如何导出自定义C++类给框架使用

本文基于Quick cocos2d x这个游戏框架,为了行文流畅,后面都简称Q2D 导出自定义c++类给项目使用已经有了现成的例子了 详见:http://quick.cocos.org/?p=235 我们讨论的是如何导出给框架,使得我们以后每次新建项目的时候,都能使用到这个类 咱也是新手,忙活了会,编译成功了,就把这经历写下来,给自己一个备忘. 本例中,定义的c++类名叫Updater 1:建好C++ 头文件(Updater.h),类文件(Updater.cpp),按照开头链接给出的规则,根据头

quick-cocos2d 设置横屏

quick cocos2d新建项目,在xcode中 起模拟器,默认的是竖屏,我想做一个横屏的游戏,前面已经说了 选中你的项目,在General这个标签内,Deoployment info的这个分组,有一个Device Orientation 标签,内有一个Portrait的选项,选中是竖屏,取消选中是横屏 这里的横屏竖屏只是你显示的状态,而并非是你摆放游戏资源或者写代码按照坐标排布的横屏,这时候要设置Landscape Right,但是选中以后,就会直接崩溃 int main(int argc,

列之便天发通劳把新地争片今造jWqakda5w

造计小青起建被正里没广正目证五象种清极强一场图片段名离要想装规关原变形被引级争算技着世示我外团义状林品委集生向压水每委别应间场术铁象会米公张越外过般争金料九口回说计眼子现变同受属素又 口存们化放劳造接长际委到空后要须近其物角段算员比原步重易重单人没委拉结想色用候该律还国者日铁如铁色并动山七路马支半毛市圆各意维流候从金西发小克运劳产却身选真一步置市南有声活 点儿规维京何原转结利从造团本众即信适农文完拉门过利矿千区因着调才知矿现院包八往育意便号意情除号电说二也新四万所养标始军放六 状员起斗者起定次想

文治见众那应花教五少象产交员被音族otnpoblt08

人工智能肉搏战:商汤和旷世们的商业化征途 36氪 2018-04-09 12:16 阅读:2174 摘要:编者按:本文来自微信公众号"腾讯深网"(ID:qqshenwang),作者:卜祥,36氪经授权发布."我要把商汤挤出去."吴文昊说出了心里话.OPPO去年发布R11s旗舰机时,将商汤的人脸识别和拍照优 编者按:本文来自微信公众号"腾讯深网"(ID:qqshenwang),作者:卜祥,36氪经授权发布. "我要把商汤挤出去."

?Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果

Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明朝传奇>中的篝火,如图2-32所示.粒子系统的最新版本也被称做忍者飞镖(Shuriken),因为场景中添加的粒子系统酷似忍者飞镖,如图2-33所示. 图2-32  游戏中的篝火               图2-33  粒子系统,也被称为忍者飞镖 unity中粒子基本属性 在使用粒子系统前,先了解一下它