修复demo 空格项目无法运行问题

This commit is contained in:
yhh
2020-09-14 17:59:03 +08:00
parent 24a463b85b
commit 4ce810bdcd
8 changed files with 15 additions and 6 deletions

View File

@@ -0,0 +1,37 @@
module samples {
import Component = es.Component;
import Vector2 = es.Vector2;
export class CameraBounds extends Component {
public min: Vector2;
public max: Vector2;
constructor(min: Vector2 = Vector2.zero, max: Vector2 = Vector2.zero){
super();
this.min = min;
this.max = max;
this.setUpdateOrder(Number.MAX_VALUE);
}
public onAddedToEntity(): void {
this.entity.updateOrder = Number.MAX_VALUE;
}
public update(): void {
let cameraBounds = this.entity.scene.camera.bounds;
if (cameraBounds.top < this.min.y)
this.entity.scene.camera.position.add(new Vector2(0, this.min.y - cameraBounds.top));
if (cameraBounds.left < this.min.x)
this.entity.scene.camera.position.add(new Vector2(this.min.x - cameraBounds.left, 0));
if (cameraBounds.bottom > this.max.y)
this.entity.scene.camera.position.add(new Vector2(0, this.max.y - cameraBounds.bottom));
if (cameraBounds.right > this.max.x)
this.entity.scene.camera.position.add(new Vector2(this.max.x - cameraBounds.right, 0));
}
}
}

View File

@@ -0,0 +1,28 @@
module samples {
import Component = es.Component;
import Vector2 = es.Vector2;
import ProjectileMover = es.ProjectileMover;
import Time = es.Time;
/**
* 移动一个投射器并在它击中任何东西时摧毁它
*/
export class FireballProjectileController extends Component {
public velocity: Vector2;
public _mover: ProjectileMover;
constructor(velocity: Vector2){
super();
this.velocity = velocity;
}
public onAddedToEntity(): void {
this._mover = this.entity.getComponent<ProjectileMover>(ProjectileMover);
}
public update(): void {
if (this._mover.move(Vector2.multiply(this.velocity, new Vector2(Time.deltaTime))))
this.entity.destroy();
}
}
}

View File

@@ -0,0 +1,145 @@
module samples {
import SpriteAnimator = es.SpriteAnimator;
import Mover = es.Mover;
import VirtualButton = es.VirtualButton;
import VirtualIntegerAxis = es.VirtualIntegerAxis;
import KeyboardKey = es.KeyboardKey;
import KeyboardKeys = es.KeyboardKeys;
import OverlapBehavior = es.OverlapBehavior;
import Vector2 = es.Vector2;
import Time = es.Time;
import Keys = es.Keys;
import CollisionResult = es.CollisionResult;
import SubpixelVector2 = es.SubpixelVector2;
import ITriggerListener = es.ITriggerListener;
export class Ninja extends es.Component implements ITriggerListener{
public _animator: SpriteAnimator;
public _subpixelV2: SubpixelVector2 = new SubpixelVector2();
public _mover: Mover;
public _moveSpeed = 100;
public _projectileVelocity: Vector2 = new Vector2(175);
public _fireInput: VirtualButton;
public _xAxisInput: VirtualIntegerAxis;
public _yAxisInput: VirtualIntegerAxis;
public onAddedToEntity(): void {
let characterPng = RandomUtils.randint(1, 6);
let texture = RES.getRes(`${characterPng}_png`);
let sprites = es.Sprite.spritesFromAtlas(texture, 16, 16);
this._mover = this.entity.addComponent(new Mover());
this._animator = this.entity.addComponent(new SpriteAnimator());
this._animator.addAnimation("walkLeft", new es.SpriteAnimation([
sprites[2],
sprites[6],
sprites[10],
sprites[14]
], 4));
this._animator.addAnimation("walkRight", new es.SpriteAnimation([
sprites[3],
sprites[7],
sprites[11],
sprites[15]
], 4));
this._animator.addAnimation("walkDown", new es.SpriteAnimation([
sprites[0],
sprites[4],
sprites[8],
sprites[12]
], 4));
this._animator.addAnimation("walkUp", new es.SpriteAnimation([
sprites[1],
sprites[5],
sprites[9],
sprites[13]
], 4));
this.setupInput();
}
public onRemovedFromEntity(): void {
this._fireInput.deregister();
}
public setupInput(){
// 设置输入射击一个火球。我们允许在键盘z上使用
this._fireInput = new VirtualButton();
this._fireInput.nodes.push(new KeyboardKey(Keys.z));
this._xAxisInput = new VirtualIntegerAxis();
this._xAxisInput.nodes.push(new KeyboardKeys(OverlapBehavior.takeNewer, Keys.left, Keys.right));
this._yAxisInput = new VirtualIntegerAxis();
this._yAxisInput.nodes.push(new KeyboardKeys(OverlapBehavior.takeNewer, Keys.up, Keys.down));
}
public update(): void {
let moveDir = new Vector2(this._xAxisInput.value, this._yAxisInput.value);
let animation = "walkDown";
if (moveDir.x < 0)
animation = "walkLeft";
else if(moveDir.x > 0)
animation = "walkRight";
if (moveDir.y < 0)
animation = "walkUp";
else if(moveDir.y > 0)
animation = "walkDown";
if (!moveDir.equals(Vector2.zero)){
if (!this._animator.isAnimationActive(animation))
this._animator.play(animation);
else
this._animator.unPause();
let movement = Vector2.multiply(moveDir, new Vector2(this._moveSpeed * Time.deltaTime));
let res: CollisionResult = new CollisionResult();
this._mover.calculateMovement(movement, res);
this._subpixelV2.update(movement);
this._mover.applyMovement(movement);
}else{
this._animator.pause();
}
if (this._fireInput.isPressed){
let dir = Vector2.zero;
switch (this._animator.currentAnimationName) {
case "walkUp":
dir.y = -1;
break;
case "walkDown":
dir.y = 1;
break;
case "walkRight":
dir.x = 1;
break;
case "walkLeft":
dir.x = -1;
break;
default:
dir = new Vector2(1, 0);
break;
}
let ninjaScene = this.entity.scene as NinjaAdventureScene;
ninjaScene.createProjectiles(this.entity.transform.position, Vector2.multiply(this._projectileVelocity, dir));
}
}
public onTriggerEnter(other: es.Collider, local: es.Collider): any {
console.log(`triggerEnter: ${other.entity.name}`);
}
public onTriggerExit(other: es.Collider, local: es.Collider): any {
console.log(`triggerExit: ${other.entity.name}`);
}
}
}

View File

@@ -0,0 +1,89 @@
module samples {
import CircleCollider = es.CircleCollider;
import Flags = es.Flags;
import SpriteRenderer = es.SpriteRenderer;
import ProjectileHitDetector = es.ProjectileHitDetector;
import FollowCamera = es.FollowCamera;
import TiledMapLoader = es.TiledMapLoader;
import TiledMapRenderer = es.TiledMapRenderer;
import Vector2 = es.Vector2;
import ProjectileMover = es.ProjectileMover;
import Sprite = es.Sprite;
import SpriteAnimator = es.SpriteAnimator;
import SpriteAnimation = es.SpriteAnimation;
export class NinjaAdventureScene extends SampleScene {
public async onStart() {
super.onStart();
let tiledEntity = this.createEntity("tiled-map-entity");
TiledMapLoader.loadTmxMap(new es.TmxMap(), "tilemap_json").then(map => {
let tiledMapRenderer = tiledEntity.addComponent(new TiledMapRenderer(map, "collision"));
tiledMapRenderer.setLayersToRender("tiles", "terrain", "details");
tiledMapRenderer.renderLayer = 10;
let tiledMapDetailsComp = tiledEntity.addComponent(new TiledMapRenderer(map));
tiledMapRenderer.setLayerToRender("above-details");
tiledMapRenderer.renderLayer = -1;
let topLeft = new Vector2(map.tileWidth, map.tileWidth);
let bottomRight = new Vector2(map.tileWidth * (map.width - 1),
map.tileWidth * (map.height - 1));
tiledEntity.addComponent(new CameraBounds(topLeft, bottomRight));
});
let playerEntity = this.createEntity("player");
playerEntity.position = new es.Vector2(256 / 2, 224 / 2);
playerEntity.addComponent(new Ninja());
let collider = playerEntity.addComponent(new CircleCollider());
// 我们只希望与默认图层0上的组件发生冲突
Flags.setFlagExclusive(collider.collidesWithLayers, 0);
// 移动到第1层 保证自己的图层不会如果增加攻击方式则不会攻击到自身
Flags.setFlagExclusive(collider.physicsLayer, 1);
this.camera.entity.addComponent(new FollowCamera(playerEntity));
this.content.loadRes("moon_png").then(moonTexture => {
let moonEntity = this.createEntity("moon");
moonEntity.position = new es.Vector2(412, 460);
moonEntity.addComponent(new SpriteRenderer(moonTexture));
moonEntity.addComponent(new ProjectileHitDetector());
moonEntity.addComponent(new CircleCollider());
});
manager.AlterManager.alter_tips("Ninja 场景加载成功");
}
/**
* 创建抛射物并使其运动
* @param position
* @param velocity
*/
public createProjectiles(position: Vector2, velocity: Vector2) {
// 创建一个实体来存放投射程序及其逻辑
let entity = this.createEntity("projectile");
entity.position = position;
entity.addComponent(new ProjectileMover());
entity.addComponent(new FireballProjectileController(velocity));
let collider = entity.addComponent(new CircleCollider());
Flags.setFlagExclusive(collider.collidesWithLayers, 0);
Flags.setFlagExclusive(collider.physicsLayer, 1);
this.content.loadRes("plume_png").then(()=>{
let texture = RES.getRes("plume_png");
let sprites = Sprite.spritesFromAtlas(texture, 16, 16);
let animator = entity.addComponent(new SpriteAnimator());
animator.renderLayer = 1;
animator.addAnimation("default", new SpriteAnimation(sprites));
animator.play("default");
});
return entity;
}
}
}

View File

@@ -0,0 +1,30 @@
module es {
/**
* 简单的组件,可以检测它是否被弹丸击中。当被击中时,它会闪烁并在被击中一定次数后自我毁灭。
*/
export class ProjectileHitDetector extends Component implements ITriggerListener{
public hitsUntilDead: number = 10;
public _hitCounter: number;
public _sprite: SpriteRenderer;
public onAddedToEntity(): void {
this._sprite = this.entity.getComponent<SpriteRenderer>(SpriteRenderer);
}
public onTriggerEnter(other: es.Collider, local: es.Collider): any {
this._hitCounter ++;
if (this.hitsUntilDead >= this.hitsUntilDead){
this.entity.destroy();
return;
}
this._sprite.color = 0xFF0000;
Core.schedule(0.1, false, this, timer => {
this._sprite.color = 0x000000;
});
}
public onTriggerExit(other: es.Collider, local: es.Collider): any {
}
}
}