点对点碰撞检测

原创 2012年03月22日 10:30:05
-(BOOL) pixelMaskIntersectsRegularNode:(CCNode*)other
{
   CGRect intersectRect = [self intersectRectInPixels:self otherNode:other];
   
   // check if any of the flags in the pixelMask are set in intersection
   NSUInteger maxX = intersectRect.origin.x + intersectRect.size.width;
   NSUInteger maxY = intersectRect.origin.y + intersectRect.size.height;
   for (NSUInteger y = intersectRect.origin.y; y < maxY; y++)
   {
      for (NSUInteger x = intersectRect.origin.x; x < maxX; x++)
      {
         NSUInteger index = y * pixelMaskWidth + x;
         return pixelMask[index];
      }
   }
   
   return NO;
}


-(CGRect) intersectRectInPixels:(CCNode*)node otherNode:(CCNode*)other
{
   CGRect myBBox = [node boundingBox];
   CGRect otherBBox = [other boundingBox];
   CGRect intersectRect = CGRectIntersection(myBBox, otherBBox);
   
   // transform the rect to the sprite's space and convert points to pixels
   intersectRect.origin = [node convertToNodeSpace:intersectRect.origin];
   return CC_RECT_POINTS_TO_PIXELS(intersectRect);
}

-(BOOL) pixelMaskIntersectsPixelMaskSprite:(KKPixelMaskSprite*)other
{
   CGRect intersectSelf = [self intersectRectInPixels:self otherNode:other];
   CGRect intersectOther = [self intersectRectInPixels:other otherNode:self];
   NSUInteger originOffsetX = intersectOther.origin.x - intersectSelf.origin.x;
   NSUInteger originOffsetY = intersectOther.origin.y - intersectSelf.origin.y;
   NSUInteger otherPixelMaskWidth = other.pixelMaskWidth;
   BOOL* otherPixelMask = other.pixelMask;
   // check if any of the flags in the pixelMask are set in intersection area
   NSUInteger maxX = intersectSelf.origin.x + intersectSelf.size.width;
   NSUInteger maxY = intersectSelf.origin.y + intersectSelf.size.height;
   for (NSUInteger y = intersectSelf.origin.y; y < maxY; y++)
   {
      for (NSUInteger x = intersectSelf.origin.x; x < maxX; x++)
      {
         NSUInteger index = y * pixelMaskWidth + x;
         
         if (pixelMask[index])
         {
            // check if there's a pixel set at the same location
            // in the pixelMask of the other sprite
            NSUInteger otherX = x + originOffsetX;
            NSUInteger otherY = y + originOffsetY;
            NSUInteger otherIndex = otherY * otherPixelMaskWidth + otherX;
            
            if (otherPixelMask[otherIndex])
            {
               return YES;
            }
         }
      }
   }
   return NO;
}


-(BOOL) pixelMaskIntersectsNode:(CCNode*)other
{
   if (rotation_ != 0.0f || other.rotation != 0.0f ||
        self.scale != 1.0f || other.scale != 1.0f)
   {
      CCLOG(@"either or both nodes are rotated and/or scaled, returning NO!");
      return NO;
   }
   
   if ([self intersectsNode:other])
   {
      if ([other isKindOfClass:PixelMaskSpriteClass])
      {
         KKPixelMaskSprite* maskSprite = (KKPixelMaskSprite*)other;
         return [self pixelMaskIntersectsPixelMaskSprite:maskSprite];
      }
      else
      {
         return [self pixelMaskIntersectsRegularNode:other];
      }
   }
   
   return NO;
}

浅谈Unity中的碰撞检测

欢迎大家来到我的博客http://unity.gopedu.com/home.php?mod=space&uid=3352&do=blog&view=me&from=space 碰撞检测 ...
  • gy4564349
  • gy4564349
  • 2014年12月20日 23:28
  • 4567

如何实现即时通讯的点对点聊天需求

在IM通讯中,通常需要管理自己的小伙伴,经常联系的,重要的用户需要标识在同一用户列表里,方便自己快速联系以及查看好友动态。那么如何可以做到类似QQ的好友列表功能呢,下面以一款在市面上功能强大的SDK为...
  • little_rui
  • little_rui
  • 2014年09月26日 14:17
  • 2504

unity代码示例和碰撞检测

1.[AddComponentMenu("MyGame/Player")] //在Component菜单中加入“MyGame/Player”选项 2.Time.deltaTime表示每帧的经...
  • liuxiongtao_1124
  • liuxiongtao_1124
  • 2016年12月02日 10:05
  • 4319

【3D算法】相交碰撞检测分析

一、基本原理 二、应用分析 参考:射线和三角形的相交检测
  • sxyaxy
  • sxyaxy
  • 2014年02月27日 12:12
  • 2879

三维物体AABB碰撞检测算法

/**************************************************************************** Copyright (c) 2014 C...
  • u012419410
  • u012419410
  • 2014年12月13日 16:42
  • 2873

2D游戏中的碰撞检测:圆形与矩形碰撞检测(Javascript&C++版)

这几天放寒假了,时间也多了起来,当然又有时间搞搞程序了。哈哈~ 昨天在开发我的塔防游戏时突然发现人物实际攻击范围比规定的范围小,按理说应该是一样大的,但偏偏不准,我被这个问题搞得糊里糊涂的。最后询问了...
  • yorhomwang
  • yorhomwang
  • 2014年01月13日 16:26
  • 31471

怎么用C++实现点对点通信

怎么用C++实现点对点通信 1、使用c++TCP /IP 编程 ,socket 或者 RemoteFuncationsCall 远程方法调用 (RPC)。  2、服务器端: ...
  • DDFFR
  • DDFFR
  • 2016年10月22日 22:29
  • 1442

游戏里实现碰撞检测方法

标签: C++, 代码, 实例, 游戏编程, 碰撞检测, 3D   几乎所有的3D游戏都离不开碰撞检测——无论是各物体之间的碰撞检测,还是物体与场景之间的碰撞检测。在真实世界中,你是很自然地不能穿墙...
  • u013468790
  • u013468790
  • 2014年04月09日 13:12
  • 1381

[图形学] 《Real-Time Rendering》碰撞检测(二)

reference:《Real-Time Rendering》 目录 17   前言 17.1 和射线的碰撞检测 17.2 使用BSP树的动态碰撞检测 17.3 一般层次的碰撞检测 ...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2016年08月31日 19:24
  • 3209

UGUI Image的2d碰撞检测

2d的碰撞检测和3d的碰撞检测比较相似,发生碰撞的两个对象至少有一个带有刚体组件,两个对象都要有碰撞器,和3d不同之处在于2d碰撞的刚体使用的是rigidbody2D,碰撞器使用的是BoxCollid...
  • u011484013
  • u011484013
  • 2017年03月14日 12:11
  • 1806
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:点对点碰撞检测
举报原因:
原因补充:

(最多只允许输入30个字)