PDA

Просмотр полной версии : Не работает hitTestPoint


Alexey25
26.06.2022, 17:51
Решил сделать платформер на flash, столкнулся с проблемой что hitTestPoint не работает. В чем может быть проблема?

Герой у меня создается с помощью графики “graphics”.

P.S. Честно говоря не помню какая там проблема была, уже сталкивался с ней очень давно, сейчас позабыл.

Вот пример hitTestPoint:

if (platform1.hitTestPoint(shape.x, shape.y) && !jumpsetup)
{

shape.x = platform1.x;
onground = true;
jumping = false;
var i = 0;
var objy = Math.floor(y1);



}

А вот полностью код:

var shape:Sprite = new Sprite();
var x1 = 0;
var y1 = 0;
var dx = 0;
var dy = 0;
var jumpsetup = false;
var onground = false;
var jumping = false;
var shooting = false;
var left_key_down: Boolean = false;
var right_key_down: Boolean = false;
var jump_key_down: Boolean = false;
function createHero()
{


shape.graphics.lineStyle(1, 0x000000, 1);
shape.graphics.beginFill(0x00FFFF, .5);
shape.graphics.drawCircle(0, 0, 20);
shape.x = 150;
shape.y = 150;

addChild(shape);
}



function init()
{
createHero();
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame1);
stage.addEventListener( KeyboardEvent.KEY_DOWN, on_keydown);
stage.addEventListener( KeyboardEvent.KEY_UP, on_keyup);
}
function on_keydown( e : KeyboardEvent ) : void {
//LEFT Key
if (e.keyCode == 37) {
left_key_down = true;
}
//RIGHT Key
else if (e.keyCode == 39) {
right_key_down = true;
}
//Up Key
else if (e.keyCode == 38) {
jump_key_down = true;
}
}
function on_keyup( e : KeyboardEvent ) : void {
//LEFT Key
if (e.keyCode == 37) {
left_key_down = false;
}
//RIGHT Key
else if (e.keyCode == 39) {
right_key_down = false;
}
//Up Key
else if (e.keyCode == 38) {
jump_key_down = false;
}
}

function onEnterFrame1(evn:Event)
{

dy = dy + 0.5;
var y1 = Math.ceil(shape.y + dy);

onground = false;
if (dy >= 0)
{
trace(shape.y);
if (platform1.hitTestPoint(shape.x, shape.y) && !jumpsetup)
{

shape.x = platform1.x;
onground = true;
jumping = false;
var i = 0;
var objy = Math.floor(y1);



}
else
{
if (dy > 5 && !shooting)
{

}
}
}
else
{


}
if (dy > 9)
{
dy = 9;
}
if (!jumpsetup)
{
shape.x = shape.x + dx;
shape.y = shape.y + dy;
}
if (right_key_down) {
if (jumping)
{
dx = dx + 0.4;
}
else
{
dx = dx + 1;
}
}
else
{
if (left_key_down && !shooting)
{
if (jumping)
{
dx = dx - 0.4;
}
else
{
dx = dx - 1;
}

}
else
{
dx = dx * 0.7;
}
}
if (dx > 7)
{
dx = 7;
}
if (dx < -7)
{
dx = -7;
}
if (!jumpsetup && !jumping && !shooting && onground)
{
if (Math.abs(dx) < 0.5)
{
dx = 0;
}
else
{
dy = -9;
jumpsetup = false;
}
}
if (jump_key_down && dy >= 0 && dy < 1 && !jumping)
{
trace("dawad2");
onground = false;
shooting = false;
jumping = true;
jumpsetup = true;

}
shape.x = Math.floor(shape.x);
shape.y = Math.floor(shape.y);
}
init();

Tails
28.06.2022, 03:13
Ваш код не запускал, но:
1. Я не вижу, где вы заполняете спрайт platform1 контентом, он у вас пустой? Тогда ясное дело, что результатом проверки любой точки будет отсутствие пересечения.

И так ещё:
1. Вычисление условия в if происходит слева на право и прерывается, если результат условия уже известен до его полного вычисления. Для повышения производительности лучше простые проверки выполнять первыми (сделать сравнение с флагом: jumpsetup до вызова hitTestPoint)
2. Делать физику на простых хит тестах не очень удобно, был клёвый 2д физ. движок - Nape (https://joecreates.github.io/napephys/);
3. Не забываем читать доку по API (https://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#hitTestPoint()), она даже на русском.

Alexey25
09.07.2022, 14:28
Спасибо за библиотеку Nape, буду изучать. У этой библиотеки закрытый исходный код, а то я на сайте обнаружил вместо .as формат .swc?

Хотелось бы посмотреть как библиотека работает изнутри (исходный код).

Tails
19.07.2022, 19:56
Он написан на Haxe, исходник тут (https://github.com/deltaluca/nape). Это такой язык, который транслируется в JS, AS3, PHP и т.д.
Но для вас это не имеет особого значения, вы просто подключаете SWC и используете его классы у себя в AS3 как обычно.