diff --git a/app/Game/Client/GameObjects/Tile.js b/app/Game/Client/GameObjects/Tile.js index 21cdb4e..7af1f02 100644 --- a/app/Game/Client/GameObjects/Tile.js +++ b/app/Game/Client/GameObjects/Tile.js @@ -16,7 +16,7 @@ function (Parent, Settings, NotificationCenter) { var self = this; var material = "Stones"; - var imgPath = Settings.GRAPHICS_PATH + var texturePath = Settings.GRAPHICS_PATH + Settings.GRAPHICS_SUBPATH_TILES + material + '/' + this.options.s + '' @@ -28,12 +28,13 @@ function (Parent, Settings, NotificationCenter) { } NotificationCenter.trigger("view/createMesh", - Settings.TILE_SIZE, - Settings.TILE_SIZE, - 0, - 0, - imgPath, - callback + texturePath, + callback, + { + width: Settings.TILE_SIZE, + height: Settings.TILE_SIZE, + pivot: "mb" + } ); }; diff --git a/app/Game/Client/Physics/Doll.js b/app/Game/Client/Physics/Doll.js index 305ba84..54a2e12 100644 --- a/app/Game/Client/Physics/Doll.js +++ b/app/Game/Client/Physics/Doll.js @@ -6,46 +6,97 @@ define([ function (Parent, Settings, NotificationCenter) { - function Doll(physicsEngine, playerId) { - Parent.call(this, physicsEngine, playerId); - this.height = 36; + function Doll(physicsEngine, playerId) { + this.animationDef = { + "stand": [1,1], + "walk": [2,28], + "walkback": [29,55], + //"jump": [56,80], + "jump": [81,91], + "fall": [81,91], + "duck": [92,97], + "standup": [98,103], + "run": [104,126] + } + + this.animatedMeshes = {}; + + Parent.call(this, physicsEngine, playerId); } Doll.prototype = Object.create(Parent.prototype); - + + Doll.prototype.setActionState = function(state) { + + if(this.actionState == state) return; + + if(this.animatedMeshes[this.actionState]) { + NotificationCenter.trigger("view/updateMesh", this.animatedMeshes[this.actionState], { visible: false }); + } + + Parent.prototype.setActionState.call(this, state); + + NotificationCenter.trigger("view/updateMesh", this.animatedMeshes[this.actionState], { visible: true }); + } + Doll.prototype.createMesh = function() { + + var padF = function(n) { + if(n<10) return "00" + n; + if(n<100) return "0" + n; + return n; + } + var self = this; - var imgPath = Settings.GRAPHICS_PATH - + Settings.GRAPHICS_SUBPATH_CHARACTERS - + 'Chuck' + '/' - + 'chuck.png'; + for (var key in this.animationDef) { + var start = this.animationDef[key][0]; + var end = this.animationDef[key][1]; - var callback = function(mesh) { - self.mesh = mesh; - NotificationCenter.trigger("view/addMesh", mesh); + var texturePaths = []; + for (var i = start; i <= end; i++) { + texturePaths.push(Settings.GRAPHICS_PATH + "Animation/WithArms/ChuckAnimations0" + padF(i) + ".png"); + } + + var callback = function(mesh) { + self.animatedMeshes[key] = mesh; + NotificationCenter.trigger("view/addMesh", mesh); + }; + + NotificationCenter.trigger("view/createAnimatedMesh", texturePaths, callback, { visible: false, pivot: "mb" }); } - - NotificationCenter.trigger("view/createMesh", - 10, - 36, - 0, - 0, - imgPath, - callback - ); - }; + } Doll.prototype.render = function() { + if(this.actionState) { + NotificationCenter.trigger("view/updateMesh", + this.animatedMeshes[this.actionState], + { + x: this.body.GetPosition().x * Settings.RATIO, + y: this.body.GetPosition().y * Settings.RATIO + } + ); - NotificationCenter.trigger("view/updateMesh", - this.mesh, - { - x: this.body.GetPosition().x * Settings.RATIO + 4, - y: (this.body.GetPosition().y * Settings.RATIO) - 29 - } - ); + } } + + Doll.prototype.lookAt = function(x, y) { + var oldLookDirection = this.lookDirection; + Parent.prototype.lookAt.call(this, x, y); + + if(oldLookDirection != this.lookDirection) { + for(var key in this.animatedMeshes) { + NotificationCenter.trigger("view/updateMesh", + this.animatedMeshes[key], + { + xScale: this.lookDirection + } + ); + } + } + }; + + // TODO: implement destroy return Doll; diff --git a/app/Game/Client/Physics/Engine.js b/app/Game/Client/Physics/Engine.js index ce4d2ac..70dfb99 100755 --- a/app/Game/Client/Physics/Engine.js +++ b/app/Game/Client/Physics/Engine.js @@ -34,7 +34,7 @@ function (Parent, Settings, DomController, Box2D) { | Box2D.Dynamics.b2DebugDraw.e_jointBit //| Box2D.Dynamics.b2DebugDraw.e_coreShapeBit //| Box2D.Dynamics.b2DebugDraw.e_aabbBit - //| Box2D.Dynamics.b2DebugDraw.e_centerOfMassBit + | Box2D.Dynamics.b2DebugDraw.e_centerOfMassBit //| Box2D.Dynamics.b2DebugDraw.e_obbBit //| Box2D.Dynamics.b2DebugDraw.e_pairBit ); diff --git a/app/Game/Client/View/Views/AbstractView.js b/app/Game/Client/View/Views/AbstractView.js index 9feed2e..c247a7d 100644 --- a/app/Game/Client/View/Views/AbstractView.js +++ b/app/Game/Client/View/Views/AbstractView.js @@ -14,6 +14,7 @@ function (DomController, Settings, Exception, NotificationCenter) { NotificationCenter.on("view/createMesh", this.createMesh, this); NotificationCenter.on("view/addMesh", this.addMesh, this); NotificationCenter.on("view/updateMesh", this.updateMesh, this); + NotificationCenter.on("view/createAnimatedMesh", this.createAnimatedMesh, this); } AbstractView.prototype.isWebGlEnabled = function () { @@ -46,7 +47,7 @@ function (DomController, Settings, Exception, NotificationCenter) { throw new Exception('Abstract Function render not overwritten '); } - AbstractView.prototype.createMesh = function (width, height, x, y, imgPath, callback) { + AbstractView.prototype.createMesh = function (texturePath, callback, options) { throw new Exception('Abstract Function createMesh not overwritten '); } @@ -58,6 +59,10 @@ function (DomController, Settings, Exception, NotificationCenter) { throw new Exception('Abstract Function updateMesh not overwritten '); }; + AbstractView.prototype.createAnimatedMesh = function (texturePaths, callback, options) { + throw new Exception('Abstract Function createAnimatedMesh not overwritten '); + } + AbstractView.prototype.setMe = function(player) { this.me = player; }; diff --git a/app/Game/Client/View/Views/PixiView.js b/app/Game/Client/View/Views/PixiView.js index df80760..3516c10 100755 --- a/app/Game/Client/View/Views/PixiView.js +++ b/app/Game/Client/View/Views/PixiView.js @@ -48,15 +48,28 @@ function (Parent, DomController, PIXI, Settings) { this.container.addChild(mesh); }; - PixiView.prototype.createMesh = function (width, height, x, y, imgPath, callback) { + PixiView.prototype.createMesh = function (texturePath, callback, options) { - var texture = PIXI.Texture.fromImage(imgPath); + var texture = PIXI.Texture.fromImage(texturePath); var mesh = new PIXI.Sprite(texture); - mesh.width = width; - mesh.height = height; - mesh.position.x = x; - mesh.position.y = y; + if(options) this.updateMesh(mesh, options); + + callback(mesh); + } + + PixiView.prototype.createAnimatedMesh = function (texturePaths, callback, options) { + var textures = []; + for (var i = 0; i < texturePaths.length; i++) { + var texture = PIXI.Texture.fromImage(texturePaths[i]); + textures.push(texture); + } + + var mesh = new PIXI.MovieClip(textures); + if(options) this.updateMesh(mesh, options); + mesh.animationSpeed = 0.5; + + mesh.play(); callback(mesh); } @@ -69,7 +82,22 @@ function (Parent, DomController, PIXI, Settings) { if (options.yScale) mesh.scale.y = options.yScale; if (options.width) mesh.width = options.width; if (options.height) mesh.height = options.height; - }; + if (options.visible === true || options.visible === false) mesh.visible = options.visible; + if (options.pivot) { + switch(options.pivot) { + case "mb": + mesh.pivot.x = mesh.width / 2; + mesh.pivot.y = mesh.height; + break; + case "mm": + default: + mesh.pivot.x = mesh.width / 2; + mesh.pivot.y = mesh.height / 2; + break; + + } + }; + } PixiView.prototype.initCamera = function () { this.container = new PIXI.DisplayObjectContainer(); diff --git a/app/Game/Config/Settings.js b/app/Game/Config/Settings.js index f8c89bc..ac087a7 100755 --- a/app/Game/Config/Settings.js +++ b/app/Game/Config/Settings.js @@ -47,7 +47,7 @@ define({ IS_BROWSER_ENVIRONMENT: typeof window !== 'undefined', USE_WEGBL: true, - DEBUG_MODE: 1, + DEBUG_MODE: 0, // NETWORKING WORLD_UPDATE_BROADCAST_INTERVAL: 70, diff --git a/app/Game/Core/Physics/Doll.js b/app/Game/Core/Physics/Doll.js index b5512b4..92c29ba 100755 --- a/app/Game/Core/Physics/Doll.js +++ b/app/Game/Core/Physics/Doll.js @@ -9,14 +9,15 @@ function (Parent, Box2D, Settings, CollisionDetector) { function Doll (physicsEngine, playerId) { - Parent.call(this, physicsEngine); - this.playerId = playerId; + Parent.call(this, physicsEngine); + this.standing = false; this.moveDirection = 0; this.lookDirection = 0; this.legs; + this.actionState = null; this.createFixtures(); this.body.SetActive(false); @@ -45,20 +46,20 @@ function (Parent, Box2D, Settings, CollisionDetector) { var headShape = new Box2D.Collision.Shapes.b2CircleShape(); headShape.SetRadius(5 / Settings.RATIO); - headShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, -37 / Settings.RATIO)); + headShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, -35 / Settings.RATIO)); fixtureDef.shape = headShape; fixtureDef.isSensor = false; this.body.CreateFixture(fixtureDef); var bodyShape = new Box2D.Collision.Shapes.b2PolygonShape(); - bodyShape.SetAsOrientedBox(5 / Settings.RATIO, 16 / Settings.RATIO, new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, -21 / Settings.RATIO)); + bodyShape.SetAsOrientedBox(5 / Settings.RATIO, 16 / Settings.RATIO, new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, -19 / Settings.RATIO)); fixtureDef.shape = bodyShape; fixtureDef.isSensor = false; this.body.CreateFixture(fixtureDef); var legsShape = new Box2D.Collision.Shapes.b2CircleShape(); legsShape.SetRadius(5 / Settings.RATIO); - legsShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, -5 / Settings.RATIO)); + legsShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, -3 / Settings.RATIO)); fixtureDef.shape = legsShape; fixtureDef.friction = Settings.PLAYER_FRICTION; fixtureDef.isSensor = false; @@ -67,7 +68,7 @@ function (Parent, Box2D, Settings, CollisionDetector) { var feetShape = new Box2D.Collision.Shapes.b2CircleShape(); feetShape.SetRadius(4 / Settings.RATIO); - feetShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, 0 / Settings.RATIO)); + feetShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, 2 / Settings.RATIO)); fixtureDef.shape = feetShape; fixtureDef.isSensor = true; @@ -78,9 +79,18 @@ function (Parent, Box2D, Settings, CollisionDetector) { this.body.CreateFixture(fixtureDef); } + Doll.prototype.setActionState = function(state) { + this.actionState = state; + } + + Doll.prototype.isWalking = function() { + return ["walk", "walkback", "run"].indexOf(this.actionState) >= 0; + } + Doll.prototype.spawn = function (x, y) { this.body.SetPosition(new Box2D.Common.Math.b2Vec2(x / Settings.RATIO, y / Settings.RATIO)); this.body.SetActive(true); + this.setActionState("fall"); } Doll.prototype.getPosition = function() { @@ -118,6 +128,14 @@ function (Parent, Box2D, Settings, CollisionDetector) { this.body.SetAwake(true); var vector = new Box2D.Common.Math.b2Vec2(speed * direction, this.body.GetLinearVelocity().y); this.body.SetLinearVelocity(vector); + + if(this.isStanding()) { + if(this.moveDirection == this.lookDirection) { + this.setActionState("run"); + } else { + this.setActionState("walkback"); + } + } } Doll.prototype.stop = function () { @@ -133,6 +151,8 @@ function (Parent, Box2D, Settings, CollisionDetector) { this.body.ApplyImpulse(vector, this.body.GetPosition()); this.setStanding(false); + + this.setActionState("jump"); } } @@ -142,6 +162,7 @@ function (Parent, Box2D, Settings, CollisionDetector) { Doll.prototype.setStanding = function (isStanding) { this.standing = isStanding; + this.setActionState("stand"); } Doll.prototype.isStanding = function () { @@ -180,7 +201,7 @@ function (Parent, Box2D, Settings, CollisionDetector) { Doll.prototype.update = function() { - if (this.body.GetLinearVelocity().x == 0) { + if (this.body.GetLinearVelocity().x == 0 && this.isWalking()) { this.stop(); } diff --git a/app/Game/Core/Player.js b/app/Game/Core/Player.js index c4eb723..6183180 100755 --- a/app/Game/Core/Player.js +++ b/app/Game/Core/Player.js @@ -3,13 +3,13 @@ define([ "Game/Config/Settings" ], + function (Doll, Settings) { function Player (id, physicsEngine) { this.physicsEngine = physicsEngine; this.playerController = null; this.doll; - this.id = id; this.isSpawned = false; }