- 浏览: 1087231 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (695)
- 心情日记 (14)
- AS开发工具 (12)
- 文章转载 (99)
- AIR (5)
- 问题总结 (46)
- SWF格式 (7)
- 测试总结 (10)
- 外文资料 (9)
- 算法技术 (33)
- AS3常用开源库 (43)
- 源码范例 (102)
- FLEX (72)
- FLASH 优化 (33)
- 游戏开发 (49)
- 开发技术 (11)
- 工作应用 (34)
- AS3收集 (140)
- WebBase (0)
- 开发构想 (4)
- 设计模式 (2)
- 框架和框架范例 (19)
- RED5 (3)
- java开发 (3)
- JAVA (1)
- FLASH-3D (23)
- 3D (6)
- 书籍 (10)
- 业界信息资料 (3)
- C# (1)
- JavaScript (12)
- HTML5 (6)
- Flixel (1)
- D5Power RPG网页游戏引擎 (0)
- ColorMatrixFilter - 获得相应颜色的色调 函数 (0)
- Starling (0)
最新评论
-
老顽童203:
字体
水果忍者鼠标跟随特效制作[转载] -
hairball00:
[转] 放出超多的Flash组件源代码 -
he74552775:
flash AS3 RegExp简单功能用法(转) -
hanshuai1232000:
第四点,有利也有弊,等你做了大型的aprg,你就知道了
[转]位图数据内存优化 -
yangfantao:
太感谢
[转] 放出超多的Flash组件源代码
第二个是书中的源代码给出了一个Collision类,其中的block方法可以实现两个物体之间的碰撞检测。
有趣的是,Collsion.block方法有两个参数,第一个是被阻碍物,第二个是障碍物,在这个演示中,山上有两块石板。
对于左边的石板,石板是被阻碍物,小猪是障碍物,产生的效果就是小猪可以推着石板走。
对于右边的石板,小猪是被阻碍物,石板是障碍物,产生的效果就是小猪撞到墙上就不能动了,很有意思。
http://bbs.9ria.com/viewthread.php?tid=88769&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000
package |
{ |
import flash.display.MovieClip; |
import flash.geom.Point; |
|
public class Collision |
//0.2 (March 20, 2009) |
{ |
public function Collision() |
{ |
} |
|
//Block objects |
static public function block(objectA:MovieClip, objectB:MovieClip):void |
{ |
var objectA_Halfwidth:Number = objectA.width / 2; |
var objectA_Halfheight:Number = objectA.height / 2; |
var objectB_Halfwidth:Number = objectB.width / 2; |
var objectB_Halfheight:Number = objectB.height / 2; |
var dx:Number = objectB.x - objectA.x; |
var ox:Number = objectB_Halfwidth
+ objectA_Halfwidth - Math.abs(dx); |
if (ox > 0) |
{ |
var dy:Number = objectA.y - objectB.y; |
var oy:Number = objectB_Halfheight
+ objectA_Halfheight - Math.abs(dy); |
if (oy > 0) |
{ |
if (ox < oy) |
{ |
if (dx < 0) |
{ |
//Collision on right |
oy = 0; |
} |
else |
{ |
//Collision on left |
oy = 0; |
ox *= -1; |
} |
} |
else |
{ |
if (dy < 0) |
{ |
//Collision on Top |
ox = 0; |
oy *= -1; |
} |
else |
{ |
//Collision on Bottom |
ox = 0; |
} |
} |
|
//Use the
calculated x and y overlaps to |
//Move objectA
out of the collision |
|
objectA.x += ox; |
objectA.y += oy; |
} |
} |
} |
|
//General purpose method for
testing Axis-based collisions. Returns true or False |
static public function test(objectA:Object,objectB:Object):Boolean |
{ |
var objectA_Halfwidth=objectA.width/2; |
var objectA_Halfheight=objectA.height/2; |
var objectB_Halfwidth=objectB.width/2; |
var objectB_Halfheight=objectB.height/2; |
var dx=objectB.x-objectA.x; |
var ox=objectB_Halfwidth+objectA_Halfwidth-Math.abs(dx); |
if (0<ox) |
{ |
var dy=objectA.y-objectB.y; |
var oy=objectB_Halfheight+objectA_Halfheight-Math.abs(dy); |
if (0<oy) |
{ |
return true; |
} |
} |
else |
{ |
return false; |
} |
return false; |
} |
|
//Collisions between the
player and platform |
static public function playerAndPlatform(player:MovieClip,
platform:MovieClip, bounce:Number,
friction:Number):void |
{ |
//This method requires the
following getter and |
//setter properties in the
player object: |
//objectIsOnGround:Boolean,
vx:Number, vy:Number, |
//bounceX:Number,
bounceY:Number |
|
//Decalre variables needed
for the player's |
//position and
dimensions |
var player_Halfwidth:Number; |
var player_Halfheight:Number; |
var player_X:Number; |
var player_Y:Number |
|
//Decalre variables needed
for the physics calculations |
var bounceX:Number; |
var bounceY:Number; |
var frictionX:Number; |
var frictionY:Number; |
|
//Find out whether the player
object has a collisionArea |
//subobject
defined |
if(player.collisionArea
!= null) |
{ |
//If it does, find out
its width and height |
player_Halfwidth = player.collisionArea.width / 2; |
player_Halfheight = player.collisionArea.height / 2; |
|
//Convert the
collisionArea's local x,y coordinates to global coordinates |
var player_Position:Point = new Point(player.collisionArea.x, player.collisionArea.y); |
player_X
= player.localToGlobal(player_Position).x; |
player_Y = player.localToGlobal(player_Position).y; |
} |
else |
{ |
//If there's no
collisionArea subobject |
//Use the player's main
height, width, x and y |
player_Halfwidth = player.width / 2; |
player_Halfheight = player.height / 2; |
player_X = player.x; |
player_Y = player.y; |
} |
//Find the platform's
dimensions |
var platform_Halfwidth:Number =
platform.width / 2; |
var platform_Halfheight:Number =
platform.height / 2; |
|
//Find the distance between
the player and platfrom on the x axis |
var dx:Number =
platform.x -
player_X; |
|
//Find the amount of overlap
on the x axis |
var ox:Number = platform_Halfwidth
+ player_Halfwidth - Math.abs(dx); |
|
//Check for a collision on
the x axis |
if (ox > 0) |
{ |
//If the objects
overlap on the x axis, a collision might be occuring |
//Define the variables
you need to check for a collision on the y axis |
var dy:Number = player.y - platform.y; |
var oy:Number = platform_Halfheight
+ player_Halfheight - Math.abs(dy); |
|
//Check for a y axis
collision. We know a collision must be |
//occuring if there's a
collision on both the x and y axis |
if (oy > 0) |
{ |
//Yes, a
collision is occuring! |
//Now you need
to find out on which side |
//of the
platform it's occuring on. |
if (ox < oy) |
{ |
if (dx < 0) |
{ |
//Collision on right |
oy = 0; |
dx = 1; |
dy = 0 |
} |
else |
{ |
//Collision on left |
oy = 0; |
ox *= -1; |
dx = -1; |
dy = 0 |
} |
} |
else |
{ |
if (dy < 0) |
{ |
//Collision on Top |
ox = 0; |
oy *= -1; |
dx = 0; |
dy = -1; |
//set the player's isOnGround property to |
//true to enable jumping |
player.isOnGround
= true; |
} |
else |
{ |
//Collision on Bottom |
ox = 0; |
dx = 0; |
dy = 1; |
} |
} |
|
//Find the
direction of the collision ("dot product") |
var directionOfCollision:Number = player.vx * dx + player.vy * dy; |
|
//Calculate the
new direction for the bounce ("projection") |
var newDirection_X:Number =
directionOfCollision * dx; |
var newDirection_Y:Number =
directionOfCollision * dy; |
|
//Find the
"tangent velocity": |
//the speed in
the direction that the object is moving. |
//It's used for
calculating additional platform friction. |
var tangent_Vx:Number = player.vx - newDirection_X; |
var tangent_Vy:Number = player.vy - newDirection_Y; |
|
//Apply
collision forces if the object is moving into a collision |
if (directionOfCollision
< 0) |
{ |
//Calculate the friction |
frictionX = tangent_Vx
* friction; |
frictionY = tangent_Vy
* friction; |
|
//Calculate the amount of bounce |
bounceX = newDirection_X
* bounce; |
bounceY = newDirection_Y
* bounce; |
} |
else |
{ |
//Prevent forces from being applied if the object is |
//moving out of a collision |
bounceX = 0; |
bounceY = 0; |
frictionX = 0; |
frictionY = 0; |
} |
//Apply
platform friction |
player.vx += ox - frictionX; |
player.vy += oy - frictionY; |
|
//Move the
player out of the collision |
player.x += ox; |
player.y += oy; |
|
//Bounce the
player off the platform |
player.bounceX = bounceX; |
player.bounceY = bounceY; |
} |
} |
} |
} |
} |
发表评论
-
greenSock新老库
2012-08-07 13:25 0老库-做项目的时候比新库完全不抖啊 -
Starling开发的游戏源码
2012-07-26 17:13 0Starling开发的游戏源码 -
一个基于STARLING的TOWER塔防游戏
2012-07-24 15:27 0一个基于STARLING的TOWER塔防游戏 -
HttpStatusConfig --一个HTTP 协议返回的 解析说明类
2012-04-18 16:40 0package guwanyuan.qicool.game ... -
[转] [Flash/Flex] 加载SWF性能VS影片剪辑性能
2012-03-15 22:29 0http://bbs.9ria.com/viewthread. ... -
水果忍者鼠标跟随特效制作[转载]
2012-03-01 16:06 2456实现这效果其实比较简单,主要是思路~! package ... -
greensock-as3
2012-02-23 21:26 0greensock-as3 -
禁止输入文本可以粘贴
2012-02-10 13:15 2320//禁止输入文本粘贴动作 private static ... -
江湖情缘游戏里的跳的类
2012-02-08 23:55 0package com.app.role.montions ... -
ColorMatrixFilter - 获得相应颜色的色调 函数
2012-02-08 23:03 0/**获得相应颜色的色调的滤镜**/ public sta ... -
[教程] 路点导航(Waypoint Navigation)
2011-12-31 00:51 0前言:这个不难,所以知道的童鞋不要喷,不知道的童鞋也不要怕,要 ... -
ARPG游戏引擎设计思路
2011-12-31 00:48 00.整体结构 下载 (32.92 KB ... -
Embed绑定XML与txt文本文件
2011-12-28 15:54 4654使用Embed标签可以将图片绑定到swf中并显示,那么我 ... -
弹弹堂测试
2011-12-08 04:21 0弹弹堂测试弹弹堂测试 -
一些DEMO
2011-11-28 17:42 0一些DEMO一些DEMO -
[转]三次贝尔曲线
2011-11-10 01:09 1929http://bbs.9ria.com/viewt ... -
[心得] 完美解决as3在ie中初始化时stageWidth和stageHeight为0的问题
2011-11-03 00:46 2941先看下面的一段脚本,这是比较经典的初始化脚本: pa ... -
五子棋算法详解
2011-10-31 04:14 0五子棋算法详解五子棋算法详解五子棋算法详解 -
[转]服务器端ActionScript语言参考
2011-10-31 00:29 0服务器端ActionScript语言参考 -
[转]FLASH与JS序列简单应用
2011-10-28 01:03 2092FLASH与JS序列简单应用 (一) 用swfob ...
相关推荐
fcl flexible collision library 碰撞检测库源码
总之,Unity3D提供了多种方式来判断两个物体是否相交,开发者可以根据具体需求选择最适合的方法,以确保游戏性能的同时实现预期的交互效果。理解并熟练运用这些技巧,能够帮助开发者创建出更加流畅且响应迅速的游戏...
在Unity引擎中,碰撞检测是游戏开发中的一个关键部分,它允许我们识别并响应游戏对象之间的交互。Unity提供了强大的碰撞检测系统,可以帮助开发者创建出丰富多样的交互式体验。以下是对这一主题的详细阐述。 首先,...
碰撞检测的基本思想是判断两个或多个对象在三维空间中的位置关系,以确定它们是否发生接触。对于点和平面的碰撞检测,我们需要明确以下几个关键概念: 1. **点和平面的表示**:在计算机中,点通常用三维坐标(x, y, ...
碰撞检测的主要目标是判断游戏中的两个或多个物体是否发生接触,从而触发相应的事件,如角色受到伤害、物体间的相互作用等。这个过程通常分为两个阶段:粗略检测和精确检测。 1. **粗略检测**:在大规模场景中,...
这个技术主要用于确定两个或多个椭球是否在空间中相互接触或者交叉,这对于实现复杂物体间的交互至关重要。椭球碰撞检测相比球体碰撞检测更具有普适性,因为它可以近似地表示各种形状不规则的物体。 在实现椭球碰撞...
除了基本的碰撞检测,FCL还提供了距离计算功能,可以计算两个几何体之间的最近点距离,这对于计算力反馈或者求解约束问题非常有用。同时,FCL还能生成接触点信息,这在物理模拟和机器人控制中是必不可少的。 在实际...
通过比较两个物体的k-DOPs是否有重叠,可以快速排除大部分无碰撞的情况,显著减少了全面细致的几何碰撞检查次数。 然后,文档会讲解如何利用k-DOPs构建包围体积层次结构(Bounding Volume Hierarchy,简称BVH)。...
6. **GJK(Gillies' Algorithm for Collision Detection Between Convex Objects)** 和 **Minkowski 差**:这些方法适用于处理复杂的凸形物体碰撞,计算出精确的接触点,但计算量较大。 7. **SAT(Separating Axis...
这个过程可以被看作是在两个凸集之间构建一个支撑超平面序列。首先,选择一个起点向量,然后反复迭代,直到找到最近点或者判断出无交集。MATLAB中,我们可以利用向量运算和线性代数库来高效实现这些步骤。 1. **...
假设我们有两个立方体(Cube1 和 Cube2),并且希望通过脚本来检测这两个立方体之间的碰撞。 ```csharp using UnityEngine; using System.Collections; public class TestCollider : MonoBehaviour { public ...
在标题"两个实体之间的碰撞"中,我们讨论的是如何在C++编程环境下,使用Visual Studio 2008进行碰撞检测的实现。 首先,我们需要理解“实体”(Entity)的概念。在编程和游戏开发中,实体通常是指具有特定属性和...
在计算机图形学中,碰撞检测是一项基础且重要的技术,它被广泛应用于游戏开发、物理模拟、虚拟...通过对这些知识点的理解和应用,我们可以实现高效且准确的碰撞检测系统,从而在各种应用场景中实现物体间的真实交互。
它涉及到如何准确且高效地判断两个或多个物体是否在空间上发生了接触或碰撞,这对于实现动态环境中的真实感模拟至关重要。 ### 核心概念 **碰撞检测算法**:旨在检测两个或多个几何模型之间是否存在重叠或接触,...
本文将深入探讨Android平台下游戏碰撞检测的原理与实现方法。 一、基本概念 碰撞检测是游戏编程中的核心部分,其目的是判断游戏中的两个或多个物体(如角色、障碍物等)是否发生接触。根据复杂程度,碰撞检测可以...
OpenGL碰撞检测教程主要关注在2D空间中如何实现物体之间的碰撞检测。这是一项重要的技能,尤其在游戏开发、物理模拟和可视化应用中。本教程由Olivier Renault编写,通过图解和源代码的方式深入浅出地讲解了相关概念...
3. **连续碰撞检测(Continuous Collision Detection, CCD)**:与广义离散碰撞检测不同,CCD考虑了物体在两个时间点之间的运动轨迹,能够在物体间发生碰撞之前预测碰撞点,从而避免了“穿透”问题的发生。...
通过实践这个"Unity3D入门:简单的碰撞检测"的DEMO,你可以亲手创建两个带有Collider的游戏对象,设置碰撞事件,观察并理解这些事件如何工作。不断尝试不同的碰撞器类型和刚体组合,以加深对碰撞检测的理解。记住,...
例如,我们可以在文档中找到关于`Body`类的方法`collidesWith()`,它是用于检测两个物理体之间是否发生碰撞的关键函数。 最后,“lib”目录下的文件是APE库的AS3源代码。开发者可以直接查看这些源码,深入理解其...
本文提出了一种新型的连续碰撞检测算法,该算法充分利用了图形硬件的计算能力,实现在多个时间区间的实时处理,并通过一系列优化方法,显著提升了碰撞检测的速度与精确度。 算法的核心思想是在每个时间区间上进行...