From 6159963b3203073af9ec0453336d18773ee8aa72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20M=C3=BCller?= Date: Fri, 22 Jun 2012 18:20:41 +0200 Subject: [PATCH] groundwork for the base classes and some simple movement --- dev/lib/game/entities/ball.js | 29 ++++++++++++++++++ dev/lib/game/entities/paddle-enemy.js | 26 +++++++++++++++++ dev/lib/game/entities/paddle-player.js | 39 +++++++++++++++++++++++++ dev/lib/game/entities/paddle.js | 26 +++++++++++++++++ dev/lib/game/levels/level1.js | 6 ++++ dev/lib/game/main.js | 26 ++++++++++------- dev/lib/weltmeister/config.js | 4 +-- dev/media/ball.png | Bin 0 -> 3321 bytes dev/media/paddle-player.png | Bin 0 -> 3955 bytes dev/media/paddle.png | Bin 0 -> 4142 bytes dev/media/tileset.png | Bin 0 -> 4740 bytes 11 files changed, 143 insertions(+), 13 deletions(-) create mode 100644 dev/lib/game/entities/ball.js create mode 100644 dev/lib/game/entities/paddle-enemy.js create mode 100644 dev/lib/game/entities/paddle-player.js create mode 100644 dev/lib/game/entities/paddle.js create mode 100644 dev/lib/game/levels/level1.js create mode 100644 dev/media/ball.png create mode 100644 dev/media/paddle-player.png create mode 100644 dev/media/paddle.png create mode 100644 dev/media/tileset.png diff --git a/dev/lib/game/entities/ball.js b/dev/lib/game/entities/ball.js new file mode 100644 index 0000000..6cb8676 --- /dev/null +++ b/dev/lib/game/entities/ball.js @@ -0,0 +1,29 @@ +ig.module( + 'game.entities.ball' +) +.requires( + 'impact.entity' +) +.defines(function(){ + + EntityBall = ig.Entity.extend({ + + size: {x:48, y:48}, + collides: ig.Entity.COLLIDES.ACTIVE, + + animSheet: new ig.AnimationSheet( 'media/ball.png', 48, 48 ), + + bounciness: 1, + + init: function( x, y, settings ) { + this.parent( x, y, settings ); + + this.addAnim( 'idle', 1, [0] ); + + this.vel.x = -400; + this.vel.y = 200; + } + + }); + +}); \ No newline at end of file diff --git a/dev/lib/game/entities/paddle-enemy.js b/dev/lib/game/entities/paddle-enemy.js new file mode 100644 index 0000000..4364018 --- /dev/null +++ b/dev/lib/game/entities/paddle-enemy.js @@ -0,0 +1,26 @@ +ig.module( + 'game.entities.paddle-enemy' +) +.requires( + 'game.entities.ball', + 'game.entities.paddle' +) +.defines(function(){ + + EntityPaddleEnemy = EntityPaddle.extend({ + + update: function(){ + var ball = ig.game.getEntitiesByType( EntityBall )[0]; + + if( ball.pos.y + ball.size.y / 2 > this.pos.y + this.size.y / 2 ) { + this.vel.y = 100; + } else { + this.vel.y = -100; + } + + this.parent(); + } + + }); + +}); \ No newline at end of file diff --git a/dev/lib/game/entities/paddle-player.js b/dev/lib/game/entities/paddle-player.js new file mode 100644 index 0000000..8d61def --- /dev/null +++ b/dev/lib/game/entities/paddle-player.js @@ -0,0 +1,39 @@ +ig.module( + 'game.entities.paddle-player' +) +.requires( + 'game.entities.paddle' +) +.defines(function(){ + + EntityPaddlePlayer = EntityPaddle.extend({ + + animSheet: new ig.AnimationSheet( 'media/paddle-player.png', 64, 128 ), + + update: function(){ + if( ig.input.state('up') ) { + this.vel.y = -400; + } + else if( ig.input.state('down') ) { + this.vel.y = 400; + } + else { + this.vel.y = 0; + } + + if( ig.input.state('left') ) { + this.vel.x = -400; + } + else if( ig.input.state('right') ) { + this.vel.x = 400; + } + else { + this.vel.x = 0; + } + + this.parent(); + } + + }); + +}); \ No newline at end of file diff --git a/dev/lib/game/entities/paddle.js b/dev/lib/game/entities/paddle.js new file mode 100644 index 0000000..3b51bdb --- /dev/null +++ b/dev/lib/game/entities/paddle.js @@ -0,0 +1,26 @@ +ig.module( + 'game.entities.paddle' +) +.requires( + 'impact.entity' +) +.defines(function(){ + + EntityPaddle = ig.Entity.extend({ + + size: {x:64, y:128}, + collides: ig.Entity.COLLIDES.FIXED, + + animSheet: new ig.AnimationSheet( 'media/paddle.png', 64, 128 ), + + maxVel: {x: 400, y: 400}, + + init: function( x, y, settings ) { + this.parent( x, y, settings ); + + this.addAnim( 'idle', 1, [0] ); + } + + }); + +}); \ No newline at end of file diff --git a/dev/lib/game/levels/level1.js b/dev/lib/game/levels/level1.js new file mode 100644 index 0000000..3b9a26f --- /dev/null +++ b/dev/lib/game/levels/level1.js @@ -0,0 +1,6 @@ +ig.module( 'game.levels.level1' ) +.requires( 'impact.image','game.entities.paddle-enemy','game.entities.paddle-player','game.entities.ball' ) +.defines(function(){ +LevelLevel1=/*JSON[*/{"entities":[{"type":"EntityPaddleEnemy","x":8,"y":152},{"type":"EntityPaddlePlayer","x":548,"y":112},{"type":"EntityBall","x":288,"y":144}],"layer":[{"name":"bg","width":13,"height":8,"linkWithCollision":false,"visible":1,"tilesetName":"media/tileset.png","repeat":false,"preRender":false,"distance":"1","tilesize":48,"foreground":false,"data":[[1,1,1,1,1,1,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,1,1,1,1,1]]},{"name":"collision","width":13,"height":8,"linkWithCollision":false,"visible":1,"tilesetName":"","repeat":false,"preRender":false,"distance":1,"tilesize":48,"foreground":false,"data":[[1,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,1,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0],[1,1,1,1,1,1,1,1,1,1,1,1,1]]}]}/*]JSON*/; +LevelLevel1Resources=[new ig.Image('media/tileset.png')]; +}); \ No newline at end of file diff --git a/dev/lib/game/main.js b/dev/lib/game/main.js index e9932da..4e1248b 100755 --- a/dev/lib/game/main.js +++ b/dev/lib/game/main.js @@ -3,7 +3,13 @@ ig.module( ) .requires( 'impact.game', - 'impact.font' + 'impact.font', + + 'game.entities.ball', + 'game.entities.paddle-enemy', + 'game.entities.paddle-player', + + 'game.levels.level1' ) .defines(function(){ @@ -14,7 +20,12 @@ MyGame = ig.Game.extend({ init: function() { - // Initialize your game here; bind keys etc. + ig.input.bind( ig.KEY.UP_ARROW, 'up' ); + ig.input.bind( ig.KEY.DOWN_ARROW, 'down' ); + ig.input.bind( ig.KEY.LEFT_ARROW, 'left' ); + ig.input.bind( ig.KEY.RIGHT_ARROW, 'right' ); + + this.loadLevel( LevelLevel1 ); }, update: function() { @@ -27,19 +38,12 @@ MyGame = ig.Game.extend({ draw: function() { // Draw all entities and backgroundMaps this.parent(); - - - // Add your own drawing code here - var x = ig.system.width/2, - y = ig.system.height/2; - - this.font.draw( 'It Works!', x, y, ig.Font.ALIGN.CENTER ); } }); -// Start the Game with 60fps, a resolution of 320x240, scaled +// Start the Game with 60fps, a resolution of 640x400 (16:10), scaled // up by a factor of 2 -ig.main( '#canvas', MyGame, 60, 320, 240, 2 ); +ig.main( '#canvas', MyGame, 60, 640, 400, 1 ); }); diff --git a/dev/lib/weltmeister/config.js b/dev/lib/weltmeister/config.js index 95beaef..417b72d 100755 --- a/dev/lib/weltmeister/config.js +++ b/dev/lib/weltmeister/config.js @@ -44,8 +44,8 @@ wm.config = { 'view': { 'zoom': 1, - 'zoomMax': 4, - 'zoomMin': 0.125, + 'zoomMax': 1, + 'zoomMin': 1, 'grid': false }, diff --git a/dev/media/ball.png b/dev/media/ball.png new file mode 100644 index 0000000000000000000000000000000000000000..07d7fbd17e04edf26929762300458497da32eb7a GIT binary patch literal 3321 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 literal 0 HcmV?d00001 diff --git a/dev/media/paddle.png b/dev/media/paddle.png new file mode 100644 index 0000000000000000000000000000000000000000..81961aa687e5a5f39c8c49749ef83092a6544b82 GIT binary patch literal 4142 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 SImG(_0000