经典的入门小游戏。这里用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. 扩展: 简介pyinstaller: py文件压缩成exe文件

    写在开始: 后缀 .py 的文件, 必须在装有python解释器, 和相对应的模块下才能运行. 对于装13来说,比较不方便. 如果人家电脑上也装上了python解释器,  说不好一眼就看穿了 自己写的 ...

  2. npm更新方法

    今天npm的版本更新发现小于3.0 尝试了npm install npm -g 安装么有成功换成了 cnpm install npm -g安装之后就可以

  3. vue中 v-cloak 的用法

    原文来自:http://www.sunzhongwei.com/hide-vuejs-variable-with-v-cloak-when-page-loading

  4. js闭包注意事项

    /关于闭包使用应该注意的 // 1 闭包在父函数每次调用都会产生不同的闭包 // 2 闭包中子函数使用父函数变量的变量不是复制 是引用 // 3 闭包在循环中使用

  5. Java证书通信

    一.概念介绍:   加密是将数据资料加密,使得非法用户即使取得加密过的资料,也无法获取正确的资料内容,所以数据加密可以保护数据,防止监听攻击.其重点在于数据的安全性.身份认证是用来判断某个身份的真实性 ...

  6. Linux网络编程--字节序

    1 .谈到字节序,那么会有朋友问什么是字节序 非常easy:[比如一个16位的整数.由2个字节组成,8位为一字节,有的系统会将高字节放在内存低的地址上,有的则将低字节放在内存高的地址上,所以存在字节序 ...

  7. mac自己定义tree命令

    编辑文件: vim ~/.bash_profile 在文件末尾追加: alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____| ...

  8. jquery constructor

    function F(){ this.a = "aaa"; alert(111); } F.prototype = { constructor:F, } var f = new F ...

  9. php数组插入数据

    php数组插入数据 一.总结 代码要多敲,看是看不会的 php代码直接在页面不好敲,可以去控制器里面敲 二.目标 在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式. 三.代码 (1).思 ...

  10. onvif开发实战1--总结框架搭建

    Gsoap及开发框架生成: 一:gsoap下载和编译   1.下载Gsoap:地址:http://sourceforge.net/projects/gsoap2/files/gSOAP/ 2.安装: ...