Как вы делаете «подпрыгивание» обнаружения столкновений с Actionscript 3.0? (С видео) - PullRequest
3 голосов
/ 09 августа 2009

Ну, во-первых, я удивлен, что Actionscript 3.0 не обнаруживает столкновения на пиксельной основе.

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

Я записал видео , чтобы лучше показать, что я пытаюсь сделать, короче говоря, я делаю игру с боковой прокруткой (например, Марио) и хочу, чтобы моя площадка (пол) действовала так же, как земля делает ... когда пользователь идет, он идет по земле, смеется

Сначала я думал о том, чтобы сделать эффект "отскока", когда "если пользователь находится на расстоянии X ниже поверхности земли, то подтолкните его вверх". Кажется, все в порядке, но единственный способ, который я нашел, это заставить моего пользователя просто продолжать прыгать, как только он касается земли (не на видео).

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

Ответы [ 2 ]

4 голосов
/ 09 августа 2009

Сегодня на reddit.com была опубликована статья о точном пиксельном обнаружении столкновений в ActionScript 3 , которое делает часть обнаружения столкновений вашей проблемой.

Настоящая логика будет в том, что делать при обнаружении столкновения. Однако, вы когда-нибудь замечали, как в большинстве игр с боковой прокруткой используется плоская поверхность для ходьбы?

Одна идея (которая не требует обнаружения столкновений) - использовать карту высот, как идею. Вы можете использовать массив (или пиксели в текстуре), чтобы определить высоту каждого участка земли вдоль вашей поверхности. Когда ваш персонаж перемещается по сцене, вы просто индексируете положение персонажа в вашей карте высот.

// How many pixels each index of the heightMap contains.
// You'll probably want to use the same value as the distance
// your character moves when the move left/right key is pressed.
const SECTION_SIZE:int = 10; 

// Fill this as a huge array with all the heights and
// the size of this will be (mapHorizontalLengthInPixels / SECTION_SIZE).
// Each element will be the distance from the top of the screen to 
// place the character so it looks like it is standing on the ground.
var heightMap:Array = [ /* ... */ ];

// TODO: you might want to Tween to this value so it doesn't look chunky
character.y = heightMap[character.x / SECTION_SIZE];

Чтобы использовать текстуру вместо массива, вы просто помещаете каждый int, который был бы помещен в массив heightMap, в один пиксель объекта BitmapData. Преимущество использования текстуры в том, что вы можете хранить огромное количество информации в небольшом объекте BitmapData и использовать getPixel32 () для ее считывания. Вы можете сгенерировать карту один раз, сохранить ее (например, в виде png), а затем вставить ее в SWF.

Если вы хотите получить фантазию, и, возможно, вы захотите, если вам нужны платформы, мосты, движущиеся объекты и многое другое ... тогда используйте физический движок 2d. Есть несколько проектов с открытым исходным кодом, в том числе APE , Box2dAS3 , Fisix и FOAM . Кривая обучения будет выше, а кодирование сложнее, но в итоге оно может окупиться. Черт возьми, это сам опыт, чтобы написать один с нуля, если вы заинтересованы!

2 голосов
/ 09 августа 2009

Похоже, вы обнаруживаете вертикальные столкновения с землей, но игнорируете горизонтальные столкновения. Но вместо того, чтобы просто останавливаться при ударе по горизонтальному объекту (т. Е. Изменение на 1 пиксель в полу будет восприниматься так же, как стена, и вам придется перепрыгивать через нее), вам необходимо подтолкнуть игрока к вершине. объекта. Вы также хотели бы иметь отсечение, чтобы игрок не столкнулся с вершиной стен, когда они их ударили. Таким образом, что-то вроде того, когда обнаруживается горизонтальное столкновение, переместите игрока к вершине объекта, если вершина объекта не> 10 пикселей от текущего местоположения.

...