2013-03-19 35 views
0

我一直玩闪光的一点,我通常解决我的问题相当快,但是我一直坚持在这一个几天,谷歌hasn没有用处,而且我也没有对闪存知道太多的朋友。
CS6 - Actionscript 3.0碰撞,点和缺乏凹凸

所以,我一直致力于制作一个基本的2D平台。我在计算如何实现字符和bg.hitTestPoint上的点时遇到问题。就目前来看,在我将点和所有东西都加入之前,它工作的很好。我有一个痕迹,让我知道它何时认为它与对象发生碰撞(在这种情况下是墙壁)。


字符的尺寸是:
顶中心:(42,0)
博特中心:(42112)
R.中心:(84,56)
L.中心:(0.56)
总图片:84 X 112(PX)

字符在屏幕上的位置:
顶部中心:(46,460)
博特中心:(46,379)
L.中心:(20,440)
R.中心:(80420)

这里是块:

凸块/碰撞变量:

var leftB:Boolean = false;
var rightB:Boolean = false;
var topB:Boolean = false;
var botB:Boolean = false;

var topBPt:Point = new Point(42, 0);
var botBPt:Point = new Point(42, 112);
var leftBPt:Point = new Point(0, 56);
var rightBPt:Point = new Point(84, 56);

hitTestPoint块:(为了节省空间,我只做最上面的一块。)

if(bg.hitTestPoint(fag.x + topBPt.x, fag.y + topBPt.y, true)) 
{ 
    trace("Top Bump works."); 
    topB = true; 
} 
    else 
{ 
    topB = false; 
} 



if(topB) 
{ 
    if(ySpeed < 0) 
    { 
     ySpeed *= -0.5; 
    } 
} 



我试图用不同的维度,有一个小的机会,我可能只是不明白我在阅读网站上的完整说明。

此外,我有一种感觉,我可以通过使它成为一个hitTestObject,并手动使墙壁的每个部分不同...但我不认为这是有效或合理的。
感谢您的帮助。

+0

这是我的整个代码。 [至少它是详细的,对不对?] [http://snipt.org/zhaG4/Default] (对不起,如果它是任何人的眼睛) 这是实际的程序截至目前: (该问题的物理示例)[http://megaswf.com/s/2567034] – Kashire 2013-03-19 09:50:47

+0

snipt.org给出404错误。顺便说一下,英雄穿过矩阵中的每一个障碍像双胞胎.... cool – Ihsan 2013-03-19 09:53:57

+0

我相信我固定的链接。至少很酷。 snipt.org/zhaG4/Default – Kashire 2013-03-19 09:59:58

回答

0

找出矩形区域的碰撞的数学基本上是相同的。一眼你的代码后

首先,确定你的屏幕的对象为对象......我的意思是sublass Sprite类和属性添加到它,不要通过全局做...

像:

public class myScreenObjs extends Sprite { 
     // Add the tricky cool specialities and properties here 
} 

正常情况下,精灵会暴露它的x和y坐标。如果动态创建的x和y位于精灵的左上角,如果通过cs6,则最好从中心到左上角交叉o,以便拥有共同的参照系。当需要旋转时,居中的xy引用对于3d特别有用。

sprite还有宽度和高度属性。

假设您有精灵C(字符)和b(块凸块)

鉴于:

左侧是左的物体的X。

权利是一个对象的权利x。

顶部是对象的顶部y。

底部是对象的底部y。

我知道这不是一个非常优化的功能,但我正在为了演示目的而写它。

function bumpTest(c: Sprite, b: Sprite):Object { 
var 
    r: * = {}, 
    cLeft : int = c.x, // doing this for demonstrating you can directly use c.x 
    cRight : int = c.x + c.width, 
    cTop : int = c.y, // same 
    cBottom : int = c.y + c.height, 
    bLeft : int = b.x, // same 
    bRight : int = b.x + b.width, 
    bTop : int = b.y, // same 
    bBottom : int = b.y + b.height; 

    r.left = Boolean ((cLeft >= bLeft) && (cLeft <= bRight)); 
    r.right = Boolean ((cRight >= bLeft) && (cRight <= bRight)); 
    r.top = Boolean ((cTop  >= bTop) && (cTop <= bBottom)); 
    r.bottom = Boolean ((cBottom >= bTop) && (cBottom <= bBottom)); 
    r.bump = Boolean ((r.left || r.right)&&(r.top || r.bottom)); 
    return(r); 
} 

现在r有完整的答案,如果r.bump为false,则r中的其他值是不相关的。 如果r.bump变为true,那么你可以通过r.left等从c碰到b来检查。因为:

r.left true表示c左边进入或位于边界b。

r.right true表示c右侧进入或位于b的边界处。

r.top true表示c top位于或位于b的边界处。

r.bottom true表示c底部进入或位于b的边界处。

+0

虽然这个回应并没有解决我的问题,但我学到了更多,这本身就很棒。我会尽力详细说明这个问题。 – Kashire 2013-03-19 09:42:29

+0

为了解决你的问题,你必须将上面的代码构建成一个传递b和c的函数并映射坐标。例如,不用c.left,你可以这样做var cL:int = c.leftCenter.x;等等...抱歉,我不知道您在对象中使用的确切的属性名称和结构。 – Ihsan 2013-03-19 09:47:32

+0

我附上了代码,以防你想看看它。 那么,它会是这样的? [code] var playerLeft:Point = new Point(0,56); var playerRight:Point = new Point(84,56); [/ code] 我实际上是这样编码的,就像以前一样,只是用蹩脚的名字。 也许我的问题只是坐标......? – Kashire 2013-03-19 09:57:22