经典的入门小游戏。这里用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. LeetCode102 Binary Tree Level Order Traversal Java

    题目: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ri ...

  2. C#定义变量

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. 49.大量qq号及qq密码挖掘到结构体并实现精确分配内存以及快速排序

    原数据: 处理后的数据: 完整代码: //思路; //数据清洗(把空格替换成'\0') -> 精确获取每一行(要提前获取source的总长度) -> 获取出每一行再精确分割并把分割后的数据 ...

  4. JCameraView 仿微信拍照Android控件(点击拍照,长按录小视频)

    JCameraView 控件介绍 这是一个模仿微信拍照的Android开源控件,主要的功能有如下: 点击拍照. 前后摄像头的切换. 长按录视频(视频长度为10秒内). 长按录视频的时候,手指上滑可以放 ...

  5. deep-in-es6(一)

    一 迭代器和for-of循环 以前的一些遍历数组: function c(n) { console.log(n); } 方法一: for(let i = 0;i < arr.length;i++ ...

  6. 新版mysql修改root密码

  7. ubuntu-虚拟机跟主机资源共享的实现方法

    之前自己的虚拟机跟主机资源共享的时候,使用的是非常笨的方法,就是通过创建两个飞鸽,然后在两个飞鸽之间进行文件的传输,今天工作相对轻松一些,就趁机完善一下自己的工作环境,在网上搜索了关于资源共享的方法, ...

  8. DG Cascade Standby

    SUMMARY 1. logical standby不支持cascading standby 2. 11.2.0.2之前版本cascading standby不支持RAC 3. 11.2.0.3之前版 ...

  9. VUE错误记录 - 小球模拟购物车

    <body> <div id="app"> <input type="button" value="Add to Car ...

  10. Appium_pytest fixture的使用

    一.定义fixture方法 # -*- coding:utf-8 -*-import pytestfrom baseutil.DriverUtil import DriverConfig @pytes ...