【COCOS2DX-游戏开发之三六】圆与未旋转矩形的碰撞检测(上篇)

我们以cocos2dx lua脚本来说明,原理才是重点

检测圆和矩形碰撞,首先要找到矩形上离圆的中心点最近的点
if circle.x < box.x then
   cx = box.x
end

如果圆在矩形的左边,离着圆中心点最近的矩形上的点在矩形的左边边界上

elseif circle.x > box.x + box.width then
   cx = box.x + box.width

如果圆的中心点在矩形的右边,离着圆中心点最近的矩形上的点在矩形的右边边界上

else
   cx = circle.x

如果圆心x既不在矩形的左边也不在右边, 那么cx就在矩形内

同理,找到Y方向上离着圆中心点最近的y偏移cy

    if circle_pt.y < rect.y then
        cy = rect.y
    elseif circle_pt.y > rect.y + rect.height then
        cy = rect.y + rect.height
    else
        cy = circle_pt.y
    end

最后附上lua版的圆与矩形的碰撞,圆与圆的碰撞检测

--[[--

检测圆和未旋转的矩形之间的碰撞
参考:http://lazyfoo.net/SDL_tutorials/lesson19/index.php

~~~ lua

local intersects = circleIntersectRect(cc.p(10, 10), 50, cc.rect(20, 20, 100, 100))

~~~

param: circle_pt 圆心
param: radius 半径
param: rect 矩形 {x=0,y=0,width=100,height=100}

@see 

]]
function circleIntersectRect(circle_pt, radius, rect)
    local cx = nil
    local cy = nil

    -- Find the point on the collision box closest to the center of the circle
    if circle_pt.x < rect.x then
        cx = rect.x
    elseif circle_pt.x > rect.x + rect.width then
        cx = rect.x + rect.width
    else
        cx = circle_pt.x
    end

    if circle_pt.y < rect.y then
        cy = rect.y
    elseif circle_pt.y > rect.y + rect.height then
        cy = rect.y + rect.height
    else
        cy = circle_pt.y
    end

    if cc.pGetDistance(circle_pt, cc.p(cx, cy)) < radius then
        return true
    end

    return false
end

--[[--

检测圆之间的碰撞

~~~ lua

local intersects = circleIntersects(cc.p(10, 10), 10, cc.p(20,20), 20)

~~~

@param: circle_pt_a 圆A中心
@param: radius_a 圆A半径
@param: circle_pt_b 圆B中心
@param: radius_b 圆B半径

@return 是否碰撞

@see 

]]
function circleIntersects(circle_pt_a, radius_a, circle_pt_b, radius_b)
    -- If the distance between the centers of the circles is less than the sum of their radius
    if cc.pGetDistance(circle_pt_a, circle_pt_b) < (radius_a + radius_b) then
        return true
    end
    return false
end

参考:http://lazyfoo.net/SDL_tutorials/lesson19/index.php

下一篇 【COCOS2DX-游戏开发之三七】圆与旋转矩形的碰撞检测(下篇)

【COCOS2DX-游戏开发之三六】圆与未旋转矩形的碰撞检测(上篇)

时间: 2024-10-09 18:04:51

【COCOS2DX-游戏开发之三六】圆与未旋转矩形的碰撞检测(上篇)的相关文章

cocos2dx游戏开发&mdash;&mdash;微信打飞机学习笔记(十)&mdash;&mdash;碰撞检测的搭建

一.七说八说        大家都发现了= =,做了那么多,发现就是摆设,完全没有打飞机的感觉,没有实现碰撞的监测.比如说呢,子弹和敌机,玩家与敌机就是需要有碰撞检测的说,然后在这篇我想会很长很长的教程中我们一步步的进行完善的说~. 二.子弹与灰机的碰撞检测 (1)加入爆炸的动画~(加到EnemyLayer中) a.通用的敌人爆炸动画的创建函数~ Animate* EnemyLayer::playAnimation(std::string formatstring, int count) { a

Cocos2d-x游戏开发技术精解读书摘要(2016-5-27 10:52)

 Cocos2d-x游戏开发技术精解 刘剑卓 著 2013年6月第1版 chap2 Cocos2d-x引擎的开发环境 2.1跨平台的开发 2.2建立开发环境 2.2.1 PC开发环境 2.2.2 Android开发环境 2.2.3 iOS开发环境 2.3引擎中的混合编译 2.3.1 Java与C++的混合编译 2.3.2 Objective-C与C++的混合编译 2.4引擎的起点 2.4.1应用程序入口 2.4.2引擎应用入口 2.5丰富的示例程序 2.5.1 TestCpp示例项目 2.5

《实例妙解 Cocos2d-x 游戏开发》反馈勘误

我的新书 <实例妙解 Cocos2d-x 游戏开发>已经上市了. 大家可以在书店或者网上购买: 部分购买地址: china-pub当当网京东 这个页面主要用于发布勘误.书中遇到了问题可以在 我的博客网站 或者 csdn博客页面 留言.当然更好的方式是加QQ群:305889963 与大家交流讨论. 书中Github代码网址:https://github.com/fansongy/Example-of-Cocos2DX

cocos2dx游戏开发学习笔记3-lua面向对象分析

在lua中,可以通过元表来实现类.对象.继承等.与元表相关的方法有setmetatable().__index.getmetatable().__newindex. 具体什么是元表在这里就不细说了,网上很多介绍,这里主要讲与cocos2dx相关联的部分. 在lua-binding库中extern.lua里,有如下方法: --Create an class. function class(classname, super) local superType = type(super) local c

cocos2dx游戏开发学习笔记1-基本概念

这里主要讲构建整个游戏需要的基本元素,很大部分都摘自cocos2dx官网. 1.Director 导演 导演,顾名思义,就是对整个游戏进行整体控制的. "Director"是一个共享的(单元素集)对象,负责不同场景之间的控制.导演知道当前哪个场景处于活动状态,允许你改变场景,或替换当前的场景,或推出一个新场景.当你往场景堆中推出一个新场景时,"Director"会暂停当前场景,但会记住这个场景.之后场景堆中最顶层的场景跳离时,该场景又会继续活跃.此外"Di

cocos2dx游戏开发学习笔记2-从helloworld开始

一.新建工程 具体安装和新建工程的方法在cocos2dx目录下的README.md文件中已经有详细说明,这里只做简单介绍. 1.上官网下载cocos2dx-3.0的源码,http://www.cocos2d-x.org/ 2.安装python2.7 3.运行setup.py安装 4.执行cocos new helloworld -p helloworld -l cpp,生成新工程 二.新建工程中包含的东西 -Classes AppDelegate.cpp      -----游戏真正开始执行的地

《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内容主要都是介绍如何在屏幕上显示图像,事实上除了图像之外,音乐的播放也可以被理解为一种显示的方式,本节将学习在Cocos2d-x中播放声音的方法. (1)在HelloWorld.h中对HelloWorld类进行如下定义: class HelloWorld : public Cocos2d::Layer { pu

cocos2dx游戏开发&mdash;&mdash;微信打飞机学习笔记(三)&mdash;&mdash;WelcomeScene的搭建

一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何划分好游戏的场景,是开始动手做游戏的第一步. 3.一个场景会有很多层,用来处理场景不同的功能. 4.而精灵则是最小的单位,比如子弹,飞机,敌机都是一个个的精灵所组成的.   二.WelcomeScene的搭建: 1.场景和层的二种搭建方法: (1)一种就是跟HelloWorld示例一样的方法,以一个

cocos2dx游戏开发——微信打飞机学习笔记(二)——游戏框架

一.游戏的基本框架: WelcomeScene    ——>    GameScene   ——>   GameOverScene ||                                       ||                                    || ∨                                      ∨                                   ∨ WelcomeLayer