2015-11-19 3 views
0

Итак, я создал хорошую систему столкновений, показанную here. Теперь у меня есть собственный персональный спрайт, который испортил столкновение со всех сторон.Столкновение с растровым изображением AS3

Редактировать: потому что люди неправильно понимают, что я хочу, Я ХОЧУ, чтобы он перекрывался на дне и вершине, он придает ему 3D-эффект. Моя проблема заключается в том, что это неправильно сталкиваясь с растровым

Я попытался с помощью пиксельной совершенной системы столкновений, но у меня есть проблема с этим:

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

код отвечает за текущее столкновение (он имел некоторые другие вещи, но это было удален):

for each (var wall in Walls) 
    { 
     if (wall.hitTestPoint(Character.x, Character.y, true)) //col right 
     { 
      Character.x+=CharacterSpeed; 
     } 
     if (wall.hitTestPoint(Character.x, Character.y, true)) //col left 
     { 
      Character.x-=CharacterSpeed; 
     } 
     if (wall.hitTestPoint(Character.x , Character.y, true)) //col bottom 
     { 
      Character.y+=CharacterSpeed; 
     } 
     if (wall.hitTestPoint(Character.x, Character.y, true)) //col top 
     { 
      Character.y -= CharacterSpeed; 
     } 
    } 

ответ

0

Это правильно (я имею в виду, что это то, что делает этот код), и что эффект зависит от частоты кадров, как Что ж.

Принцип легко понять. ex: вы перемещаете объект на 5 пикселей, сталкивающийся объект на 3 пикселя, когда вы проверяете на столкновение, у вас есть перекрытие в 2 пикселя. Чтобы исправить это, вам понадобится алгоритм TOI (время воздействия).

На данный момент исправление кода отсутствует, потому что вы применяете движение, это обратный путь, который он должен работать. Сначала вы двигаетесь, затем проверяете, когда вы правильно проводите тест, затем двигаетесь. Например:

  1. Вы собираетесь перемещать объект по пикселям.
  2. проверить, будет ли объект + x пикселей сталкиваться.
  3. если он столкнется, подсчитайте, сколько вы должны переместить, а затем переместите его на пиксели с пикселями x.
  4. если он не столкнется, переместите его на x пикселей.

Как вы видите, вы делаете противоположное:

  1. движение по х пикселей.
  2. тест для столкновения.

Результат - перекрывающиеся объекты.

Что вы можете сделать, как взломать без изменения кода, рассчитать перекрытие, а затем исправить положение объекта.

+0

Я думаю, вы поняли, что я сказал. Я ХОЧУ, чтобы он накладывался на нижнюю и верхнюю части, как псевдо-3D-система столкновения в 2D-игре. Проблема, с которой я сталкиваюсь, заключается в том, что она не сталкивается правильно (сталкивается слишком далеко от стены, перекрывает стороны и т. Д.), – Badfitz66

0

вы можете попробовать сделать свои объекты в использовании метода BitmapData BitmapData.draw, а не использовать BitmapData.hittest, вот пример:

import flash.display.BitmapData; 
import flash.geom.Point; 

var myBitmapData:BitmapData = new BitmapData(100, 80, false, 0x00CCCCCC); 

var mc_1:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth()); 
mc_1.attachBitmap(myBitmapData, this.getNextHighestDepth()); 

var mc_2:MovieClip = createRectangle(20, 20, 0xFF0000); 

var destPoint:Point = new Point(myBitmapData.rectangle.x, myBitmapData.rectangle.y); 
var currPoint:Point = new Point(); 

mc_1.onEnterFrame = function() { 
    currPoint.x = mc_2._x; 
    currPoint.y = mc_2._y; 
    if(myBitmapData.hitTest(destPoint, 255, currPoint)) { 
     trace(">> Collision at x:" + currPoint.x + " and y:" + currPoint.y); 
    } 
} 

mc_2.startDrag(true); 

function createRectangle(width:Number, height:Number, color:Number):MovieClip { 
    var depth:Number = this.getNextHighestDepth(); 
    var mc:MovieClip = this.createEmptyMovieClip("mc_" + depth, depth); 
    mc.beginFill(color); 
    mc.lineTo(0, height); 
    mc.lineTo(width, height); 
    mc.lineTo(width, 0); 
    mc.lineTo(0, 0); 
    return mc; 
} 
Смежные вопросы