Полное удаление объекта после события столкновения в скрипте действия 3.0 - PullRequest
0 голосов
/ 25 декабря 2011

У меня есть базовая игровая функция, которая отбрасывает шар каждые 500 миллисекунд (с событием таймера) и предполагает избавиться от него, когда он ударяет по тарелке, которая тащит за мышью.Дело в том;Я попытался использовать функцию deleteChild();, но она только удаляет внешний вид объекта шара, не останавливая его функциональность, что вызывает пару проблем:

  1. Мяч продолжает движение и вызываетсобытие удара по полу.
  2. DropBall ();функция, которая оживляет падающий шар, фактически не оживляет новый шар.

это полный сценарий:

//imports:
import flash.events.Event;
import fl.transitions.Tween;
import flash.text.TextField;
import flash.utils.Timer;
import flash.events.TimerEvent;

//the function 'startGame, handles all basic game functions.
function startGame() {

//inisializes the variable 'Score' and gives it a value of 0.
var Score = 0;


//enter_frame listener. calls 'movePlate'
stage.addEventListener(Event.ENTER_FRAME, movePlate);


//function 'movePlate'. makes the plate follow the mouse
function movePlate(event:Event):void {
    plate.x = mouseX;
}


//calls the dropBall function
dropBall()


//the function 'dropBall'. animates the droping ball
function dropBall() {
    var oldpost = 0;
    var randomNum:Number = Math.random() * 550;
    var xAxis:int = Math.round(randomNum);
    trace(randomNum);
    trace(xAxis);
    ball.x = xAxis;
    base.x = xAxis;
    var oldpost = xAxis;
    var ballTween:Tween = new Tween(ball, "y", null, 0, 500, 1.2, true); 
    oldpost = xAxis;
}

//function 'gameTime'. the timer function that controlls the intervals between falling eggs and ratio of good to bad eggs.
var gameTime1:Timer = new Timer(1000);
gameTime1.addEventListener(TimerEvent.TIMER, gameTimer1Function)

function gameTimer1Function(evt:TimerEvent):void {
    dropBall();
}

gameTime1.start();

//enter frame event listener. calls  'checkCollision'
addEventListener(Event.ENTER_FRAME,checkCollision);


//function checl collision. checks if the ball hits the plate
function checkCollision(event: Event):void {
    if(ball.hitTestObject(plate)) collisionDetected();
}


//function collision detected
function collisionDetected():void {
    Score ++;
    trace(Score);
    scoreText.text = Score;

}


//enter frame event listener. calls  'checkGameOver'.
addEventListener(Event.ENTER_FRAME,checkGameOver);
 //function 'checkGameOver.
function checkGameOver(event: Event):void {
    if(ball.hitTestObject(floor)) gameOver();
}


//function 'gameOver'.
function gameOver():void {
    trace('GAME OVER!!! Your Score Is: ' + Score + '.');
    trace('Asta la Vista Baby :D');

}
}
startGame();

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Ваш код не работает, как вы объяснили. Это работает так:

У вас есть только один шар, и он каждую секунду теряет равновесие, ссылаясь на gameTime1 тик вызывает dropBall (), который делает следующее:

  • он заменяет единственный мяч, который у вас есть, на 0, и анимирует его в течение 1,2 секунды до дна. var ballTween:Tween = new Tween(ball, "y", null, 0, 500, 1.2, true);
  • затем счет ++ запускается независимо от движения мяча, потому что он находится в обработчике событий энтерфрейма, и каждый кадр, в который ударяет мяч по тарелке, увеличивает счет
  • ВЫ ДОЛЖНЫ ДЕЙСТВИТЕЛЬНО ПОСМОТРЕТЬ В СВОЕМ КОДЕВЕ СНОВА и переосмыслить архитектуру, как, что и когда она должна работать (в основном вам нужно не только знать, что должно делать программное обеспечение, но вам нужно объяснить это программному обеспечению.

UPDATE:

Чтобы узнать, как экспортировать movieclipt int oclass, следуйте инструкциям: http://www.kirupa.com/developer/flashcs3/movieclips_classes_AS3_pg1.htm

Тогда в вашей логике:

Функция (createBall)

  • Создать экземпляр мяча. (если вы следовали учебнику, то знаете, как)
  • запустить enterFrame, который проверяет, попал ли мяч в панель или на землю, если он остановил событие enterFrame.
  • После остановки определите, что делать в зависимости от того, что попало

Должно выглядеть так:

if ( hitPanel )
{
    increaseScrore ()
}
if ( hitFloor )
{
    decreaseLive () 
}
  • в каждой из этих функций increase... и decrease.. после того, как они все сделали, должна быть removeBall функция, а в increase.. затем вызов createBall, так что все начинает повторяться.

P.S. Без обид, пожалуйста, но вы можете выучить язык программирования, в этом случае, я вижу, вы немного знаете, но если вам не хватает какой-то логики, вы не найдете ее на форумах ... Прочитайте некоторую основную информацию о логике / архитектуре приложения и т.д ... и, пожалуйста, посмотрите, как нужно обрабатывать экземпляры.

P.S.S. Инвестируйте немного, чтобы узнать, что такое ОФП. ;)

наилучшие пожелания! Счастливых праздников:)

0 голосов
/ 25 декабря 2011

Вы пытались установить мяч на null?

...