You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

76 lines
2.0 KiB

import Rx, { Observable } from 'rxjs';
import AnimationBase from './animation0';
import DOM from './dom';
import Store from './store';
const evtScare = (scareX, scareY) => new CustomEvent("scare", { detail: { scareX, scareY } });
const particleDiv = document.createElement('div');
particleDiv.className = 'particle';
function checkScare([evt, store]) {
const state = store.get();
const { evtX, evtY } = DOM.getEventOffsetCoords(evt, DOM.containerBounds);
const diffX = Math.abs(state.x - evtX);
const diffY = Math.abs(state.y - evtY);
if (diffX < 50 && diffY < 50) {
DOM.container.dispatchEvent(evtScare(evtX, evtY));
}
};
function flee([evt, store]) {
const initialState = store.get();
const { scareX, scareY } = evt.detail;
const fps$ = Rx.Observable.interval(1000 / 32);
fps$
.scan((acc, i) => {
return store.set({ x: acc.x + acc.dx, y: acc.y + acc.dy })
}, initialState)
.takeWhile(state => {
const xDanger = Math.abs(initialState.x - state.x) < 150;
const yDanger = Math.abs(initialState.y - state.y) < 150;
return xDanger && yDanger;
})
.subscribe(state => {
particleDiv.style.left = `${state.x}px`;
particleDiv.style.top = `${state.y}px`;
})
};
function reset() {
if (particleDiv.parentNode) {
DOM.container.removeChild(particleDiv);
}
const store = new Store({ x: 10, y: 10, dx: 5, dy: 5 });
const state = store.get();
particleDiv.style.top = `${state.y}px`;
particleDiv.style.left = `${state.x}px`;
DOM.container.appendChild(particleDiv);
return store;
};
function init() {
const store = reset();
const click$ = Rx.Observable
.fromEvent(DOM.container, 'click')
.map(evt => [evt, store])
.subscribe(checkScare);
Rx.Observable
.fromEvent(DOM.container, 'scare')
.map(evt => [evt, store])
.subscribe(flee);
};
const Animation2 = Object.assign(AnimationBase, { init, reset });
export default Animation2;