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

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

1、编译效果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFNQ1k=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

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

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

    本文基于Quick cocos2d x这个游戏框架,为了行文流畅,后面都简称Q2D 导出自定义c++类给项目使用已经有了现成的例子了 详见:http://quick.cocos.org/?p=235 ...

  2. quick-cocos2d 设置横屏

    quick cocos2d新建项目,在xcode中 起模拟器,默认的是竖屏,我想做一个横屏的游戏,前面已经说了 选中你的项目,在General这个标签内,Deoployment info的这个分组,有 ...

  3. Cocos2d-x游戏实例《忍者飞镖》之对象管理

    推荐移步至<忍者飞镖射幽灵>之对象管理阅读 配置环境:win7+Cocos2d-x.2.0.3+VS2012 目标读者:需了解游戏帧率以及回调函数的概念 一.引言 对具体游戏demo的分析 ...

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

    Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明 ...

  5. cocos2d-x3.0创建第一个jsb游戏

    第一步: 最新的cocos2d-x.下载地址https://github.com/cocos2d/cocos2d-x github上最新的引擎,值得注意的是官网上发布的引擎是稳定版.选择哪种就看个人喜 ...

  6. 使用Swift和SpriteKit写一个忍者游戏

    这篇文章的游戏使用SpriteKit和Swift语言来完毕. SpriteKit是苹果自己的游戏引擎,更能贴合iOS系统底层的API,只是架构和实现上都是模仿了Cocos2D.所以使用上事实上区别不大 ...

  7. 忍者无敌-实例讲解Cocos2d-x瓦片地图

    实例比较简单,如图所示,地图上有一个忍者精灵,玩家点击他周围的上.下.左.右,他能够向这个方向行走.当他遇到障碍物后是无法穿越的,障碍物是除了草地以为部分,包括了:树.山.河流等. 忍者实例地图(TO ...

  8. 【Quick 3.3】资源脚本加密及热更新(三)热更新模块

    [Quick 3.3]资源脚本加密及热更新(三)热更新模块 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 lua相对于c++开发的优点之一是代码可以在运行的时候才加载,基于此我们 ...

  9. 【Quick 3.3】资源脚本加密及热更新(二)资源加密

    [Quick 3.3]资源脚本加密及热更新(二)资源加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 在前一篇文章中介绍了代码加密,加密方式是XXTEA.对于资源文件来说,同样 ...

随机推荐

  1. PostgreSQL递归查询实现树状结构查询

    在Postgresql的使用过程中发现了一个非常有意思的功能,就是对于须要相似于树状结构的结果能够使用递归查询实现.比方说我们经常使用的公司部门这样的数据结构.一般我们设计表结构的时候都是相似以下的S ...

  2. UNIX多线程编程

    一个程序至少有一个进程.一个进程至少有一个线程.进程拥有自己独立的存储空间,而线程能够看作是轻量级的进程,共享进程内的全部资源.能够把进程看作一个工厂.线程看作工厂内的各个车间,每一个车间共享整个工厂 ...

  3. Android控件ToggleButton的使用方法

    ToggleButton(开关button)是Android系统中比較简单的一个组件,是一个具有选中和未选择状态双状态的button.而且须要为不同的状态设置不同的显示文本. ToggleButton ...

  4. OpenCascade Sweep Algorithm

    OpenCascade Sweep Algorithm eryar@163.com Abstract. Sweeps are the objects you obtain by sweeping a ...

  5. js---11运算符,流程控制,真假

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. Handle-postDelayed 延迟操作

    今天在工作的时候,遇到了一个方法,是关于Handle来实现延时操作的,自己写了一个小demo,学习总结如下 xml <?xml version="1.0" encoding= ...

  7. [51Nod]NOIP2018提高组省一冲奖班模测训练(三) 题解

    链接 A.Anan的派对 题意:Anan想举办一个派对.Anan的朋友总共有 n 人.第i个人如果参加派对会得到 \(c_i\) 的快乐值,除他自己外每多一个人参加他会减少 \(d_i\) 的快乐值. ...

  8. c++中sizeof()的用法介绍

    1.      定义 sizeof是一个操作符(operator). 其作用是返回一个对象或类型所占的内存字节数. 2.      语法 sizeof有三种语法形式: 1)  sizeof (obje ...

  9. SpringBoot与Dubbo整合-项目搭建

    本章节建立生产者和消费者来演示dubbo的demo 生产者:springboot-dubbo-provider 和 消费者:springboot-dubbo-consumer 工程配置详解 Apach ...

  10. Log4j日志管理的简单实例

    大型项目中非常多情况下要分析程序的日志信息,怎样管理自己的日志信息至关重要. 在应用程序中加入日志记录总的来说基于三个目的 , 监视代码中变量的变化情况,周期性的记录到文件里供其它应用进行统计分析工作 ...