效果演示

项目使用介绍

主要源码如下

import BitmapData from "openfl/display/BitmapData";
import Sprite from "openfl/display/Sprite";
import Tilemap from "openfl/display/Tilemap";
import Tileset from "openfl/display/Tileset";
import Event from "openfl/events/Event";
import MouseEvent from "openfl/events/MouseEvent";
import * as Stats from "stats-js";
import Bunny from "./Bunny";


export class Main extends Sprite {


	private addingBunnies: boolean;
	private bunnies: Array<Bunny>;
	private gravity: number;
	private minX: number;
	private minY: number;
	private maxX: number;
	private maxY: number;
	private stats: Stats;
	private tilemap: Tilemap;
	private tileset: Tileset;


	constructor() {

		super();

		this.bunnies = [];

		BitmapData.loadFromFile("wabbit_alpha.png")
			.onComplete((bitmapData) => this.start(bitmapData))
			.onError((e) => console.error(e));

	}


	private start(bitmapData: BitmapData): void {

		this.minX = 0;
		this.maxX = this.stage.stageWidth;
		this.minY = 0;
		this.maxY = this.stage.stageHeight;
		this.gravity = 0.5;

		this.tileset = new Tileset(bitmapData);
		this.tileset.addRect(bitmapData.rect);

		this.tilemap = new Tilemap(this.stage.stageWidth, this.stage.stageHeight, this.tileset);
		//this.tilemap.tileAlphaEnabled = false;
		//this.tilemap.tileColorTransformEnabled = false;
		this.addChild(this.tilemap);

		this.stats = new Stats();
		this.stats.domElement.style.position = 'absolute';
		this.stats.domElement.style.left = '0px';
		this.stats.domElement.style.top = '0px';
		document.body.appendChild(this.stats.domElement);

		this.stage.addEventListener(MouseEvent.MOUSE_DOWN, this.stage_onMouseDown);
		this.stage.addEventListener(MouseEvent.MOUSE_UP, this.stage_onMouseUp);
		this.stage.addEventListener(Event.ENTER_FRAME, this.stage_onEnterFrame);

		for (var i = 0; i < 10; i++) {

			this.addBunny();

		}

	}


	private addBunny(): void {

		var bunny = new Bunny();
		bunny.x = 0;
		bunny.y = 0;
		bunny.speedX = Math.random() * 5;
		bunny.speedY = (Math.random() * 5) - 2.5;
		this.bunnies.push(bunny);
		this.tilemap.addTile(bunny);

	}




	// Event Handlers




	stage_onEnterFrame = (event: Event) => {

		this.stats.begin();

		for (var i = 0; i < this.bunnies.length; i++) {

			var bunny = this.bunnies[i];
			bunny.x += bunny.speedX;
			bunny.y += bunny.speedY;
			bunny.speedY += this.gravity;

			if (bunny.x > this.maxX) {

				bunny.speedX *= -1;
				bunny.x = this.maxX;

			} else if (bunny.x < this.minX) {

				bunny.speedX *= -1;
				bunny.x = this.minX;

			}

			if (bunny.y > this.maxY) {

				bunny.speedY *= -0.8;
				bunny.y = this.maxY;

				if (Math.random() > 0.5) {

					bunny.speedY -= 3 + Math.random() * 4;

				}

			} else if (bunny.y < this.minY) {

				bunny.speedY = 0;
				bunny.y = this.minY;

			}

		}

		if (this.addingBunnies) {

			for (var i = 0; i < 100; i++) {

				this.addBunny();

			}

		}

		this.stats.end();

	}


	private stage_onMouseDown = (event: MouseEvent) => {

		this.addingBunnies = true;

	}


	private stage_onMouseUp = (event: MouseEvent) => {

		this.addingBunnies = false;
		console.log(this.bunnies.length + " bunnies");

	}


}


export default Main;