Archief - AS3 HitTestObject van een Array

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

mXXX

Legacy Member
W0utR zei:
Om een hittest uit te voeren heb je wel 2 objecten nodig, dus iets van:

Inderdaad. Maar mijn objecten zitten allemaal in mijn array. Daardoor zit ik dus vast :s

ik heb ook al
Code:
for (var i = 1; i < allBlocks.length; i++)
			{
				if (this.hitTestObject(allBlocks[i]))
				{
					trace("check " + i);
					
				}

geprobeerd. Maar zelfde resultaat...

W0utR

Legacy Member
Dan ga je eventueel 2 for loops moeten hebben, ongeveer zoiets als dit:
Code:
for(var i = 0; i < allBlocks.length; i++)
{
  for(var j = 0; j < allBlocks.length; j++) 
  {
     if(allBlocks[i] != allBlocks[j])
     {
        if(allBlocks[i].hitTestObject(allBlocks[j])) {
             // hit
        }
      }
  }
}

YaMo

Legacy Member
Als het blok waarvan je checkt of het geraakt wordt ook in die array zit, moet je waarschijnlijk dit doen:

Code:
for (var i = 0; i < allBlocks.length; i++)
{
	if (this!=allBlocks[i] && this.hitTestObject(allBlocks[i]))
	{
		trace("check " + i);
					
	}
}

Anders zou het kunnen dat de bounding box van je blokken veel te groot is.
Dan moet je eens kijken in je symbol genaamd Block en je ervan vergewissen dat alle gekleurde pixels rond je blok zeker uitgegomd zijn.

W0utR

Legacy Member
Oh, ik had niet gezien dat je die code uitvoert in de classe Block zelf, daarom is mijn code ook fout voor dit probleem.

Maar zoals YaMo zegt, je moet gewoon kijken dat je de huidige blok ook niet pakt, anders ga je altijd een hit krijgen.

mXXX

Legacy Member
YaMo zei:
Als het blok waarvan je checkt of het geraakt wordt ook in die array zit, moet je waarschijnlijk dit doen:

Code:
for (var i = 0; i < allBlocks.length; i++)
{
	if (this!=allBlocks[i] && this.hitTestObject(allBlocks[i]))
	{
		trace("check " + i);
					
	}
}

Anders zou het kunnen dat de bounding box van je blokken veel te groot is.
Dan moet je eens kijken in je symbol genaamd Block en je ervan vergewissen dat alle gekleurde pixels rond je blok zeker uitgegomd zijn.
Bedankt dit heeft mij geholpen! Nu zoals je zegt, als ze naast mekaar vallen worden ze ook gehit. Dus dat ga ik nu eens proberen op te lossen ;)
Bedankt voor uw hulp!


W0utR zei:
Oh, ik had niet gezien dat je die code uitvoert in de classe Block zelf, daarom is mijn code ook fout voor dit probleem.

Maar zoals YaMo zegt, je moet gewoon kijken dat je de huidige blok ook niet pakt, anders ga je altijd een hit krijgen.
Bedankt voor uw hulp en uitleg!!

W0utR

Legacy Member
Als ik het concept van je spel zo lees zou je misschien gemakkelijk Box2D kunnen gebruiken, een heel deel van je spel zal zo al gemaakt zijn.
Tevens is de collision detection daar net iets beter, maar dat kan je wss doen als je wat meer ervaren bent met AS3. (Zag dat het nog maar je eerste game is) AS3 Flash Physics Engine Box2DFlashAS3 2.0.1

mXXX

Legacy Member
W0utR zei:
Als ik het concept van je spel zo lees zou je misschien gemakkelijk Box2D kunnen gebruiken, een heel deel van je spel zal zo al gemaakt zijn.
Tevens is de collision detection daar net iets beter, maar dat kan je wss doen als je wat meer ervaren bent met AS3. (Zag dat het nog maar je eerste game is) AS3 Flash Physics Engine Box2DFlashAS3 2.0.1

Ziet er inderdaad leuk en cool uit!
Maar ik ga het momenteel toch nog zonder doen :)
Momenteel heb ik 4 type blokjes en ze vallen al op mekaar, dus er is vooruitgang :)
Nu ga ik CollisionDetection implementeren tussen mijn blokjes en mijn Player. Hopen dat dat ook goed lukt en ik kan vandaag met een gerust hart gaan slapen :)

mXXX

Legacy Member
Iemand die mij hier ff mee kan helpen. Zit er eigenlijk sinds gisteren mee vast, was het dan beu en gaan slapen... Vandaag er nog ff mee bezig geweest Maar verder geraak ik niet echt...
Code:
			if (key.isDown(Keyboard.LEFT))
			{
				//voorkomen dat Player buiten de scene komt langs de linker kant
				if (this.x > stageRef.stageWidth - stageRef.stageWidth + this.width / 2)
				{
					//Naar links stappen
					this.x -=  10;

					for (var i = 0; i < allBlocks.length; i++)
					{
						if (this.hitTestObject(allBlocks[i]))
						{
							trace("collision detection - LEFT");
						}
					}
				}
			}

ik test of this(= mijnPlayer) een collision maakt met mijn array van blocks. Dit werkt wel perfect (ik krijg de trace te zien als hij het blokje raakt). Maar hoe laat ik hem stoppen met wandelen als er een collision is?
Ik dacht iets van

Code:
if (this.hitTestObject(allBlocks[i]))
						{
							trace("collision detection - LEFT");
						}
else
{
this.x -=10;
}
dus om this.x -=10 boven weg te halen en in de else te steken indien er geen collision is. Maar dan gaat hij nét super snel naar links :s
Wat doe ik verkeerd?

YaMo

Legacy Member
mXXX zei:
Iemand die mij hier ff mee kan helpen. Zit er eigenlijk sinds gisteren mee vast, was het dan beu en gaan slapen... Vandaag er nog ff mee bezig geweest Maar verder geraak ik niet echt...

ik test of this(= mijnPlayer) een collision maakt met mijn array van blocks. Dit werkt wel perfect (ik krijg de trace te zien als hij het blokje raakt). Maar hoe laat ik hem stoppen met wandelen als er een collision is?

dus om this.x -=10 boven weg te halen en in de else te steken indien er geen collision is. Maar dan gaat hij nét super snel naar links :s
Wat doe ik verkeerd?

Als je het zoals in je bovenste voorbeeld doet, werkt het bewegen goed, buiten de collision detection?
Dan zal je zoiets moeten doen, waarschijnlijk:

Code:
var hit:Boolean = false;
for (var i = 0; i < allBlocks.length; i++)
{
  if (!hit && this.hitTestObject(allBlocks[i]))
    {
      trace("collision detection - LEFT");
      hit = true;
    }
}
if(!hit)
{
  this.x -= 10;
}

Beter zou zijn om die hele forlus ook in een aparte functie isHit() ofzo te steken.

mXXX

Legacy Member
YaMo zei:
Als je het zoals in je bovenste voorbeeld doet, werkt het bewegen goed, buiten de collision detection?
Dan zal je zoiets moeten doen, waarschijnlijk:

Code:
var hit:Boolean = false;
for (var i = 0; i < allBlocks.length; i++)
{
  if (!hit && this.hitTestObject(allBlocks[i]))
    {
      trace("collision detection - LEFT");
      hit = true;
    }
}
if(!hit)
{
  this.x -= 10;
}

Beter zou zijn om die hele forlus ook in een aparte functie isHit() ofzo te steken.

Merci :)
Je was niet iets te laat, had het gisteren nacht al gevonden. Inderdaad heb het op deze manier gevonden, na zéér lang zoeken en denken :p
achja... Oefenen is de boodschap, toch?:)
Ik heb mijn code toch wel geoptimaliseerd door de forlus in een functie te steken zoals je zegt :)

Nu nog enkele foutjes eruit en collision is dan ook volledig afgewerkt :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan