SWiSH Forum
Forum użytkowników programów SWiSH

Skrypty do programu SWiSH2 i SWISHmax - Jak zatrzymać obiekt?

roland - Sro 24 Cze, 2009 08:30
Temat postu: Jak zatrzymać obiekt?
Jak zatrzymać obiekt?

Zakładam, że wykorzystujemy do poniższych rozważaniach jedynie właściwości fizyczne obiektu. Gwoli przypomnienia, aby używać właściwości fizycznych w animacji:
1. Wybieramy zakładkę Export (to ta z prawej strony ekranu). Z listy rozwijanej Export options for wybieramy Script i zaznaczamy Support physics properties.
2. Wskazujemy duszka i ponownie przechodzimy do zakładki Export.
3. Z rozwijanej listy Export options for wybieramy Selected Object.
4. Zaznaczamy Uses physics properties.

OK. A teraz przykład. Tworzę duszka o nazwie Czerwona. W Scene_1 wpisuję następujący skrypt:
Kod:
onLoad () {
    Czerwona._vx = 50;
  }

Czyli, w momencie uruchomienia animacji nadaję duszkowi Czerwona prędkość poziomą 50. Będzie się on poruszał ze stałą prędkością. Chciałbym jednak, aby zatrzymał się, gdy osiągnie współrzędną 500. Dla tego duszka tworzę więc skrypt:
Kod:
onEnterFrame(includingFirstFrame) {
    if (this._x > 500) {
        this._vx = 0;
    }
}

Czyli, jeżeli współrzędna przekroczy wartość 500, ustawiam prędkość 0. Duszek się zatrzymuje.

Dorysujmy jednak drugiego duszka o nazwie Niebieska. Zmodyfikujmy skrypt wykonywany dla Scene_1, tak aby nadać mu przyspieszenie:
Kod:
onLoad () {
    Czerwona._vx = 50;
    Niebieska._ax = 50;
}

Po osiągnięciu współrzędnej 500 chcemy, aby obiekt łagodnie się zatrzymał. Wpisujemy więc następujący skrypt:
Kod:
onEnterFrame(includingFirstFrame) {
    if (this._x > 500) {
        this._ax = -100;
    }
}

Jednak obiekt po zatrzymaniu się posiada cały czas ujemne przyspieszenie, więc zaczyna się poruszać w przeciwną stronę.
Zmodyfikujmy skrypt:
Kod:
onEnterFrame(includingFirstFrame) {
    if (this._x > 500) {
        this._ax = -100;
    }
    if (this._vx < 0) {
        this._ax = 0;
        this._vx = 0;
    }
}

Czyli: jeżeli prędkość obiektu będzie mniejsza od zera, to zarówno przyspieszenie i prędkość mają zostać wyzerowane.
Na pierwszy rzut oka jest wszystko OK. Niestety obiekt Niebieska dalej będzie się poruszał wstecznym ruchem (będzie to bardzo powolny ruch).
Dlaczego? Przecież nadaliśmy mu zarówno przyspieszenie jak i prędkość równą 0. Tak ale przez ułamek skryptu nadal posiada przyspieszenie -100. To przyspieszenie nadane na początku skryptu obowiązuje przez kilka wierszy, aż je nie wyzerujemy.

Powyższy przykład znajduje się w przykładzie Movie1.

Aby zatrzymać obiekt Niebieska, należałoby dla niego zmodyfikować skrypt, na przykład na następujący:
Kod:
onEnterFrame(includingFirstFrame) {
    if (this._x > 500 and this._vx > 0) {
        this._ax = -100;
    } else if (this._x > 500) {
        this._ax = 0;
        this._vx = 0;
    }
}

Nie wymaga chyba to wyjaśnień. Plik Movie2.

I jeszcze jedno. Jak traktować właściwości fizyczne, szczególnie jeżeli chodzi o prędkość i przyspieszenie. Należy te właściwości dokładnie tak samo jak w przypadku samochodu. Jeżeli samochód ma przyspieszenie dodatnie to powoduje to tak naprawdę zwiększanie prędkości. A czy nadanie przyspieszeniu wartości 0 spowoduje zatrzymanie samochodu. Nie, samochód będzie się poruszał ze stała prędkością.

adammisiek - Sob 01 Sie, 2009 18:05

a czy można by dostać jakąś pomoc.. w zderzaniu obiektów ?
np. jedną kulką z funkcją MouseDraggingUnlocked uderzamy w drugą kulkę i ona odskakuje, a okienko animacji zachowuje się jak realny świat czyli np. ma grawitację co spowoduje, że kulki będą spadały na "ziemię" ?


Powered by phpBB modified by Przemo © 2003 phpBB Group