Использование прыгающего шарика в тестовом сценарии 3
У меня есть этот код, который заставляет мяч отскочить, но я ищу стрелять пулями с земли, и как только они ударяют мяч, они должны отскочить назад. Цель - не дать мячу упасть на землю. Я уверен, что это было сделано раньше, но я думаю, что слишком глуп, чтобы понять это.
Код:
package {
public class ball extends MovieClip {
var timer:Number=0;
var initialPos:Number=0;
var finalPos:Number=0;
var currentPos:Number=0;
var initialSpeed:Number=0;
function ball() {
startFallingBall();
}
function moveBallDown(e:Event) {
timer+=1;
this.y = initialPos + .5 *(timer * timer);
checkBottomBoundary();
}
function moveBallUp(e:Event) {
timer+=1;
var posA=this.y;
this.y = currentPos - initialSpeed*timer + .5*(timer * timer);
var posB=this.y;
checkTopBoundary(posA, posB);
}
function checkBottomBoundary() {
if (this.y+this.height>stage.stageHeight) {
finalPos=this.y;
stopFallingBall();
}
}
function checkTopBoundary(firstPos:Number, secondPos:Number) {
if (secondPos>firstPos) {
stopRisingBall();
startFallingBall();
}
}
function startFallingBall() {
timer=0;
initialPos=this.y;
this.addEventListener(Event.ENTER_FRAME, moveBallDown);
}
function stopFallingBall() {
this.removeEventListener(Event.ENTER_FRAME, moveBallDown);
if (finalPos-initialPos<.1*this.height) {
stopRisingBall();
} else {
startRisingBall();
}
}
function startRisingBall() {
initialSpeed=Math.sqrt(Math.abs(finalPos-initialPos));
timer=0;
currentPos=this.y;
this.addEventListener(Event.ENTER_FRAME, moveBallUp);
}
function stopRisingBall() {
this.removeEventListener(Event.ENTER_FRAME, moveBallUp);
}
function stopEverything() {
this.removeEventListener(Event.ENTER_FRAME, moveBallUp);
this.removeEventListener(Event.ENTER_FRAME, moveBallDown);
}
}
}
2 ответа
Простой способ - использовать hitTestObject для DisplayObject. Это проверяет на совпадение. Конечно, вы можете написать что-то более продвинутое самостоятельно.
Для каждого обновления игры вы проверяете, попали ли пули в мяч, и принимайте меры, если они это сделали. Вам также следует рассмотреть возможность разделения игровой логики и обновления дисплея. Посмотрите на использование таймера.
package {
public class BallGame extends Sprite
{
private var ball:Ball;
private var bullets:Array;
public function BallGame() {
addEventListener(Event.ENTER_FRAME, checkCollision);
addEventListener(MouseEvent.CLICK, fireBullet);
}
private function fireBullet(e:MouseEvent):void {
// adds a fired bullet to an array so we can loop over all bullets
bullets.push(new Bullet());
}
private function checkCollision(e:Event):void {
// loops through all bullets in play
for each(var bullet:Bullet in bullets) {
// check if the bullet is inside the ball
if (ball.hitTestObject(bullet)) {
// the bullet hit the ball
ball.startRisingBall();
// TODO: remove the bullet :)
}
}
}
}
}
Есть функция для предварительного тестирования, которую вы можете прочитать здесь: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html
Хотя с кругами это довольно легко, если вы знаете радиус, если расстояние между центрами меньше, чем сумма их радиусов; они касаются друг друга.
Но, глядя на ваш код, вы должны правильно переписать все это. Мяч действительно не должен обрабатывать внутреннюю логику столкновения и движения. Он должен иметь только вектор положения и скорости, а логика движения и коллизии должна быть в других классах.
Что касается кода для реакции, это зависит от того, насколько сложным вы хотите его. И это может быть просто от переворота части вектора скорости до довольно сложной математики.
В этой области много примеров и примеров. Думаю, вам лучше найти их в Google и поиграть с ними. Тогда напишите свое.