新增虚拟输入类 VirtualInput
This commit is contained in:
@@ -38,22 +38,6 @@ module samples {
|
||||
displayContainer.addChild(this._lineShape);
|
||||
}
|
||||
|
||||
public onAddedToEntity(): void {
|
||||
KeyboardUtils.registerKey(KeyboardUtils.SPACE, this.spaceDown, this, KeyboardUtils.TYPE_KEY_DOWN);
|
||||
}
|
||||
|
||||
public onRemovedFromEntity(): void {
|
||||
KeyboardUtils.unregisterKey(KeyboardUtils.SPACE, KeyboardUtils.TYPE_KEY_DOWN);
|
||||
}
|
||||
|
||||
private spaceDown(){
|
||||
let hit = Physics.linecast(this._lastPosition, this.transform.position);
|
||||
if (hit.collider){
|
||||
this._collisionPosition = hit.point;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public render(camera: es.Camera): any {
|
||||
this._pixelShape1.graphics.clear();
|
||||
this._pixelShape1.graphics.beginFill(0xffff00);
|
||||
|
||||
37
demo/src/Scenes/Ninja Adventure/CameraBounds.ts
Normal file
37
demo/src/Scenes/Ninja Adventure/CameraBounds.ts
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,50 +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 {
|
||||
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);
|
||||
this.entity.scene.content.loadRes(`${characterPng}_png`).then(texture => {
|
||||
let sprites = es.Sprite.spritesFromAtlas(texture, 16, 16);
|
||||
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._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("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("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("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._animator.addAnimation("walkUp", new es.SpriteAnimation([
|
||||
sprites[1],
|
||||
sprites[5],
|
||||
sprites[9],
|
||||
sprites[13]
|
||||
], 4));
|
||||
|
||||
this._animator.play("walkDown");
|
||||
});
|
||||
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}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,13 +4,38 @@ module samples {
|
||||
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, 224);
|
||||
playerEntity.position = new es.Vector2(256 / 2, 224 / 2);
|
||||
playerEntity.addComponent(new Ninja());
|
||||
let collider = playerEntity.addComponent(new CircleCollider());
|
||||
|
||||
@@ -21,20 +46,39 @@ module samples {
|
||||
|
||||
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());
|
||||
});
|
||||
let moonTexture = RES.getRes("moon_png");
|
||||
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());
|
||||
}
|
||||
|
||||
public update(){
|
||||
super.update();
|
||||
/**
|
||||
* 创建抛射物并使其运动
|
||||
* @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));
|
||||
|
||||
this.findEntity("player").position.x -= es.Time.deltaTime * 10;
|
||||
this.findEntity("player").position.y -= es.Time.deltaTime * 10;
|
||||
let collider = entity.addComponent(new CircleCollider());
|
||||
Flags.setFlagExclusive(collider.collidesWithLayers, 0);
|
||||
Flags.setFlagExclusive(collider.physicsLayer, 1);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user