Actionscript 3 循环问题的冲突检测,仅测试一个数组项?
[如果这不是一个真正深入的问题,我深表歉意,但我想一劳永逸地解决这个问题] 我试图查看四叉树,但在没有任何优化的情况下,碰撞检测已经遇到了问题。进行了搜索,发现了一个非常简洁的示例: (主要是内部框架C部分) 试图模仿这一点,它不会起同样的作用。 在特定对象之间只检测到一些碰撞。当物体不移动时,出于某种原因,它似乎工作得更好 我真的搞不清楚问题出在哪里,代码基本上与示例相同。我没有盲目复制粘贴它,我知道除了这一部分发生了什么:Actionscript 3 循环问题的冲突检测,仅测试一个数组项?,actionscript-3,collision-detection,Actionscript 3,Collision Detection,[如果这不是一个真正深入的问题,我深表歉意,但我想一劳永逸地解决这个问题] 我试图查看四叉树,但在没有任何优化的情况下,碰撞检测已经遇到了问题。进行了搜索,发现了一个非常简洁的示例: (主要是内部框架C部分) 试图模仿这一点,它不会起同样的作用。 在特定对象之间只检测到一些碰撞。当物体不移动时,出于某种原因,它似乎工作得更好 我真的搞不清楚问题出在哪里,代码基本上与示例相同。我没有盲目复制粘贴它,我知道除了这一部分发生了什么: if (j <= i)
if (j <= i)
continue;
方格
package com.martino.objects
{
import flash.display.Sprite;
/**
* ...
* @author Martino Wullems
*/
public class Square extends CollisionObject
{
public var hitGraphic:Sprite;
public function Square(Size:int)
{
size = Size;
drawSquare();
}
private function drawSquare():void
{
graphic = new Sprite();
graphic.graphics.beginFill(0xFF0000);
graphic.graphics.drawRect(0, 0, size, size);
graphic.graphics.endFill();
addChild(graphic);
hitGraphic = new Sprite();
hitGraphic.graphics.beginFill(0x0066FF);
hitGraphic.graphics.drawRect(0, 0, size, size);
hitGraphic.graphics.endFill();
addChild(hitGraphic);
hitGraphic.visible = false;
}
override public function Collision():void {
trace("I collided with a friend (inside joke)");
}
public override function debugDraw():void {
if (isHit) {
graphic.visible = false;
hitGraphic.visible = true;
}else {
graphic.visible = true;
hitGraphic.visible = false;
}
}
}
}
如果您有任何帮助,我们将不胜感激,希望进一步了解
编辑:更改了一些内容,虽然有所进展,但我仍然不清楚强> 在TestWorld.as中更改了一些内容:
package com.martino.world
{
import com.martino.objects.Ball;
import com.martino.objects.CollisionObject;
import flash.display.MovieClip;
import flash.events.Event;
/**
* ...
* @author Martino Wullems
*/
public class TestWorld extends MovieClip
{
public var objects:Array;
public function TestWorld()
{
initWorld();
}
private function initWorld():void
{
objects = new Array();
addEventListener(Event.ENTER_FRAME, loopWorld);
}
private function loopWorld(e:Event):void
{
var object:*;
for (var i:int = 0; i < objects.length; i++) {
MoveObject(objects[i]);
//CheckCollision(i);// doesn't work here for some reason [case 1]
}
CheckCollision(0); //[case 2]
}
private function CheckCollision(i:int):void
{
//test collision
for (var i:int = 0; i < objects.length; i++){ //only use in case 2
var elementA:CollisionObject;
var elementB:CollisionObject;
elementA = objects[i];
for (var j:int = i + 1; j < objects.length; j++) {
if (j <= i){
continue; //j resets each I loop and therefor sets collision to false while it could be true
}
elementB = objects[ j ]// as ObjSprite;
if (elementA.hitTestObject(elementB)) {
elementA.isHit = elementB.isHit = true;
}
}
} //[case 2]
}
private function MoveObject(object:CollisionObject):void
{
object.x += object.vx;
object.y += object.vy;
////////////////////
//check boundaries//
////////////////////
if (object.x > stage.stageWidth)
{
object.vx *= -1;
}else if (object.x < 0)
{
object.vx *= -1;
}else if (object.y > stage.stageHeight)
{
object.vy *= -1;
}else if (object.y < 0)
{
object.vy *= -1;
}
object.isHit = false;// where do we check when it isn't colliding? this seems messy!
}
public function addObject(object:CollisionObject):void
{
objects.push(object);
addChild(object);
}
}
}
package com.martino.world
{
导入com.martino.objects.Ball;
导入com.martino.objects.CollisionObject;
导入flash.display.MovieClip;
导入flash.events.Event;
/**
* ...
*@作者Martino Wullems
*/
公共类TestWorld扩展了MovieClip
{
公共变量对象:数组;
公共函数TestWorld()
{
initWorld();
}
私有函数initWorld():void
{
对象=新数组();
addEventListener(Event.ENTER_FRAME,loopWorld);
}
私有函数loopWorld(e:事件):void
{
var对象:*;
for(变量i:int=0;istage.stageHeight)
{
object.vy*=-1;
}else if(object.y<0)
{
object.vy*=-1;
}
object.isHit=false;//当它没有碰撞时,我们在哪里检查?这看起来很混乱!
}
公共函数addObject(对象:CollisionObject):void
{
对象。推(对象);
addChild(object);
}
}
}
在collisionobject中还添加了setter和getter(编辑之前的so部分)
不确定为什么我不能将checkcollision放在enter frame函数的循环中?(如果我不这样做,则不会显示碰撞)。并且将“isHit=false”放在moveobjects中以重置命中检查似乎也很混乱
我想我看不出什么时候物体没有碰撞来重置它们。
在hittest上做一个else语句来检查是否没有冲突是不可行的,这似乎是合乎逻辑的,因为hittestcheck中可能有两个以上的项目发生冲突
有什么想法吗?我必须查看原始资料才能理解这一点。下面是供参考的 这条线
if (j <= i) continue;
if(j元素b.rect.y+元素b.rect.height){
}否则{
elementA.isHit=elementB.isHit=true;
}
}
}
(值得一提的是,我认为这家伙的代码实际上是在检查对象与自身的碰撞情况——他应该在查看他的代码并检查代码之后,更改“if j两件事 这一部分是必要的,以确保您不会浪费时间遍历循环并重新检查已比较的项目
if (j <= i)
continue;
if(j Right,我现在不明白了!在阅读您的文章之前,请看我的更新代码!在您的新编辑中,在“CheckCollision(I:int)”中,您传递了参数“I”,但您在“for”循环中用“for”(var I:int=0;“。您需要做的是检查每一项,确保没有重复检查(即,这是j@Dominic关于重置var i的好方法的要点,但他不应该需要j i实际注释掉整个循环,因此它捕捉到传递的“i”直接。对不起,应该注意到了。你能编辑这篇文章以便我们能看到最新的代码吗?我不确定最新的代码是什么。谢谢,我现在明白了:)我真的不想为hittest的方法烦恼,只是想知道为什么它不能正常工作。谢谢你的回复!
package com.martino.world
{
import com.martino.objects.Ball;
import com.martino.objects.CollisionObject;
import flash.display.MovieClip;
import flash.events.Event;
/**
* ...
* @author Martino Wullems
*/
public class TestWorld extends MovieClip
{
public var objects:Array;
public function TestWorld()
{
initWorld();
}
private function initWorld():void
{
objects = new Array();
addEventListener(Event.ENTER_FRAME, loopWorld);
}
private function loopWorld(e:Event):void
{
var object:*;
for (var i:int = 0; i < objects.length; i++) {
MoveObject(objects[i]);
//CheckCollision(i);// doesn't work here for some reason [case 1]
}
CheckCollision(0); //[case 2]
}
private function CheckCollision(i:int):void
{
//test collision
for (var i:int = 0; i < objects.length; i++){ //only use in case 2
var elementA:CollisionObject;
var elementB:CollisionObject;
elementA = objects[i];
for (var j:int = i + 1; j < objects.length; j++) {
if (j <= i){
continue; //j resets each I loop and therefor sets collision to false while it could be true
}
elementB = objects[ j ]// as ObjSprite;
if (elementA.hitTestObject(elementB)) {
elementA.isHit = elementB.isHit = true;
}
}
} //[case 2]
}
private function MoveObject(object:CollisionObject):void
{
object.x += object.vx;
object.y += object.vy;
////////////////////
//check boundaries//
////////////////////
if (object.x > stage.stageWidth)
{
object.vx *= -1;
}else if (object.x < 0)
{
object.vx *= -1;
}else if (object.y > stage.stageHeight)
{
object.vy *= -1;
}else if (object.y < 0)
{
object.vy *= -1;
}
object.isHit = false;// where do we check when it isn't colliding? this seems messy!
}
public function addObject(object:CollisionObject):void
{
objects.push(object);
addChild(object);
}
}
}
if (j <= i) continue;
for (var j:int = i + 1; i < objects.length; j++) {
for (i = 0; i < myrects.length; i++) {
elementA = myrects[ i ] as ObjMyRect;
for (j = 0; j < myrects.length; j++) {
if (j <= i)
continue;
elementB = myrects[ j ] as ObjMyRect;
if (elementA.rect.x + elementA.rect.width < elementB.rect.x) {
} else if (elementA.rect.x > elementB.rect.x + elementB.rect.width) {
} else if (elementA.rect.y + elementA.rect.height < elementB.rect.y) {
} else if (elementA.rect.y > elementB.rect.y + elementB.rect.height) {
} else {
elementA.isHit = elementB.isHit = true;
}
}
}
if (j <= i)
continue;