zoukankan      html  css  js  c++  java
  • 飞镖忍者 quick-cocos2d-x3.2

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

    首先,创建project,假设不会自行百度啊。

    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实现起来比之前easy非常多。

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

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

  • 相关阅读:
    bzoj4950
    P1377发奖金
    环信SDK与Apple Watch的结合(1)
    环信SDK与Apple Watch的结合(2)
    【Objective-C】0-第一个OC的类
    【Objective-C】4-空指针和野指针
    【Objective-C】3 -self关键字
    【Objective-C】2.自定义构造方法和description方法
    Swift函数|闭包
    Swift枚举|结构体|类|属性|方法|下标脚本|继承
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7049655.html
Copyright © 2011-2022 走看看