2009-08-08 1 views
3

Ну, во-первых, я удивлен, что actionScript 3.0 не имеет обнаружение столкновений на основе пикселей.Как вы выполняете обнаружение столкновений с помощью ActionScript 3.0? (С видео)

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

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

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

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

ответ

4

На сайте reddit.com была опубликована статья о pixel perfect collision detection in 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.

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

+1

Благодарим за помощь! Я фактически переключился на эту библиотеку обнаружения пикселей, которую вы упомянули. То, что я закончил делать, это сделать границу, а затем сделать мою землю двумя разными объектами. Так что, если мой игрок попадает на границу, тогда гравитация перестает тянуть ect ... но если мой игрок находится в «заполнении» (мимо границы), он продолжает толкать его на 3 пикселя, пока он не окажется выше него.Пока граница думает, что это работает на удивление хорошо. Чем меньше число пикселей вверх, тем более гладкое оно ощущается, но также требуется больше времени, чтобы продвинуться выше границы. –

2

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

Смежные вопросы