Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не работает hitTestPoint (http://www.flasher.ru/forum/showthread.php?t=215813)

Alexey25 26.06.2022 17:51

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

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

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

Вот пример hitTestPoint:
Код AS3:

        if (platform1.hitTestPoint(shape.x, shape.y) && !jumpsetup) 
        {
 
                        shape.x = platform1.x;
                        onground = true;
            jumping = false;
            var i = 0;
            var objy = Math.floor(y1);
 
 
 
                }

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

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;
3. Не забываем читать доку по API, она даже на русском.

Alexey25 09.07.2022 14:28

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

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

Tails 19.07.2022 19:56

Он написан на Haxe, исходник тут. Это такой язык, который транслируется в JS, AS3, PHP и т.д.
Но для вас это не имеет особого значения, вы просто подключаете SWC и используете его классы у себя в AS3 как обычно.


Часовой пояс GMT +4, время: 14:53.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.