diff options
Diffstat (limited to 'jaws/src/core.js')
| -rwxr-xr-x | jaws/src/core.js | 713 |
1 files changed, 0 insertions, 713 deletions
diff --git a/jaws/src/core.js b/jaws/src/core.js deleted file mode 100755 index 5a02dd1..0000000 --- a/jaws/src/core.js +++ /dev/null @@ -1,713 +0,0 @@ -/** - * @namespace JawsJS core functions. - * - * Jaws, a HTML5 canvas/javascript 2D game development framework - * - * Homepage: http://jawsjs.com/ - * Source: http://github.com/ippa/jaws/ - * Documentation: http://jawsjs.com/docs/ - * - * Works with: Chrome 6.0+, Firefox 3.6+, 4+, IE 9+ - * License: LGPL - http://www.gnu.org/licenses/lgpl.html - * - * Jaws uses the "module pattern". - * Adds 1 global, <b>jaws</b>, so plays nice with all other JS libs. - * - * Formating guide: - * jaws.oneFunction() - * jaws.one_variable = 1 - * new jaws.OneConstructor - * - * @property {int} mouse_x Mouse X position with respect to the canvas-element - * @property {int} mouse_y Mouse Y position with respect to the canvas-element - * @property {canvas} canvas The detected/created canvas-element used for the game - * @property {context} context The detected/created canvas 2D-context, used for all draw-operations - * @property {int} width Width of the canvas-element - * @property {int} height Height of the canvas-element - */ -var jaws = (function(jaws) { - - var title; - var log_tag; - - /* - * Placeholders for constructors in extras-dir. We define the constructors here to be able to give ppl better error-msgs. - * When the correct from extras-dir is included, these will be overwritten. - * - */ - //jaws.Parallax = function() { throw("To use jaws.Parallax() you need to include src/extras/parallax.js") } - //jaws.QuadTree = function() { throw("To use QuadTree() you need to include src/extras/quadtree.js") } - //jaws.PixelMap = function() { throw("To use PixelMap() you need to include src/extras/pixel_map.js") } - jaws.SpriteList = function() { throw("To use SpriteList() you need to include src/extras/sprite_list.js") } - jaws.Audio = function() { throw("To use jaws.Audio() you need to include src/extras/audio.js") } - - /** - * Returns or sets contents of title's innerHTML - * @private - * @param {type} value The new value to set the innerHTML of title - * @returns {string} The innerHTML of title - */ - jaws.title = function(value) { - - if (!jaws.isString(value)) { - jaws.log.error("jaws.title: Passed in value is not a String."); - return; - } - - if (value) { - return (title.innerHTML = value); - } - return title.innerHTML; - }; - - /** - * Unpacks Jaws core-constructors into the global namespace. - * If a global property is already taken, a warning will be written to jaws log. - */ - jaws.unpack = function() { - var make_global = ["Sprite", "SpriteList", "Animation", "SpriteSheet", "Parallax", "pressed", "QuadTree"]; - - make_global.forEach(function(item) { - if (window[item]) { - jaws.log.warn("jaws.unpack: " + item + " already exists in global namespace."); - } - else { - window[item] = jaws[item]; - } - }); - }; - - /** - * Writes messages to either log_tag (if set) or console.log (if available) - * @param {string} msg The string to write - * @param {boolean} append If messages should be appended or not - */ - jaws.log = function(msg, append) { - if (!jaws.isString(msg)) { - msg = JSON.stringify(msg); - } - - if (jaws.log.on) { - if (log_tag && jaws.log.use_log_element) { - if (append) { - log_tag.innerHTML += msg + "<br />"; - } - else { - log_tag.innerHTML = msg; - } - } - if (console.log && jaws.log.use_console) { - console.log("JawsJS: ", msg); - } - } - }; - - /** - * If logging should take place or not - * @type {boolean} - */ - jaws.log.on = true; - - /** - * If console.log should be used during log writing - * @type {boolean} - */ - jaws.log.use_console = false; - - /** - * If log_tag should be used during log writing - * @type {boolean} - */ - jaws.log.use_log_element = true; - - /** - * Write messages to console.warn (if it exists) or append current log - * @param {string|object} msg String or object to record - * @see jaws.log - */ - jaws.log.warn = function(msg) { - if (console.warn && jaws.log.use_console && jaws.log.on) { - console.warn(msg); - } else { - jaws.log("[WARNING]: " + JSON.stringify(msg), true); - } - }; - - /** - * Write messages to console.error (if it exists) or append current log - * @param {string|object} msg String or object to record - * @see jaws.log - */ - jaws.log.error = function(msg) { - if (console.error && jaws.log.use_console && jaws.log.on) { - console.error(msg); - } else { - jaws.log("[ERROR]: " + JSON.stringify(msg), true); - } - }; - - /** - * Write messages to console.info (if it exists) or append current log - * @param {string|object} msg String or object to record - * @see jaws.log - */ - jaws.log.info = function(msg) { - if (console.info && jaws.log.use_console && jaws.log.on) { - console.info(msg); - } else { - jaws.log("[INFO]: " + JSON.stringify(msg), true); - } - }; - - /** - * Write messages to console.debug (if it exists) or append current log - * @param {string|object} msg String or object to record - * @see jaws.log - */ - jaws.log.debug = function(msg) { - if (console.debug && jaws.log.use_console && jaws.log.on) { - console.debug(msg); - } else { - jaws.log("[DEBUG]: " + JSON.stringify(msg), true); - } - }; - - /** - * Clears the contents of log_tag element (if set) and console.log (if set) - */ - jaws.log.clear = function() { - if (log_tag) { - log_tag.innerHTML = ""; - } - if (console.clear) { - console.clear(); - } - }; - - /** - * Initalizes jaws{canvas, context, dom, width, height} - * @private - * @param {object} options Object-literal of constructor properties - * @see jaws.url_parameters() - */ - jaws.init = function(options) { - - /* Find <title> tag */ - title = document.getElementsByTagName('title')[0]; - jaws.url_parameters = jaws.getUrlParameters(); - - jaws.canvas = document.getElementsByTagName('canvas')[0]; - if (!jaws.canvas) { - jaws.dom = document.getElementById("canvas"); - } - - // Ordinary <canvas>, get context - if (jaws.canvas) { - jaws.context = jaws.canvas.getContext('2d'); - } - else if (jaws.dom) { - jaws.dom.style.position = "relative"; - } - else { - jaws.canvas = document.createElement("canvas"); - jaws.canvas.width = options.width; - jaws.canvas.height = options.height; - jaws.context = jaws.canvas.getContext('2d'); - document.body.appendChild(jaws.canvas); - } - - /* - * If debug=1 parameter is present in the URL, let's either find <div id="jaws-log"> or create the tag. - * jaws.log(message) will use this div for debug/info output to the gamer or developer - * - */ - log_tag = document.getElementById('jaws-log'); - if (jaws.url_parameters["debug"]) { - if (!log_tag) { - log_tag = document.createElement("div"); - log_tag.id = "jaws-log"; - log_tag.style.cssText = "overflow: auto; color: #aaaaaa; width: 300px; height: 150px; margin: 40px auto 0px auto; padding: 5px; border: #444444 1px solid; clear: both; font: 10px verdana; text-align: left;"; - document.body.appendChild(log_tag); - } - } - - - if(jaws.url_parameters["bust_cache"]) { - jaws.log.info("Busting cache when loading assets") - jaws.assets.bust_cache = true; - } - - /* Let's scale sprites retro-style by default */ - if (jaws.context) - jaws.useCrispScaling(); - - jaws.width = jaws.canvas ? jaws.canvas.width : jaws.dom.offsetWidth; - jaws.height = jaws.canvas ? jaws.canvas.height : jaws.dom.offsetHeight; - - jaws.mouse_x = 0; - jaws.mouse_y = 0; - window.addEventListener("mousemove", saveMousePosition); - }; - - /** - * Use 'retro' crisp scaling when drawing sprites through the canvas API, this is the default - */ - jaws.useCrispScaling = function() { - jaws.context.imageSmoothingEnabled = false; - jaws.context.webkitImageSmoothingEnabled = false; - jaws.context.mozImageSmoothingEnabled = false; - }; - - /** - * Use smooth antialiased scaling when drawing sprites through the canvas API - */ - jaws.useSmoothScaling = function() { - jaws.context.imageSmoothingEnabled = true; - jaws.context.webkitImageSmoothingEnabled = true; - jaws.context.mozImageSmoothingEnabled = true; - }; - - /** - * Keeps updated mouse coordinates in jaws.mouse_x and jaws.mouse_y - * This is called each time event "mousemove" triggers. - * @private - * @param {EventObject} e The EventObject populated by the calling event - */ - function saveMousePosition(e) { - jaws.mouse_x = (e.pageX || e.clientX); - jaws.mouse_y = (e.pageY || e.clientY); - - var game_area = jaws.canvas ? jaws.canvas : jaws.dom; - jaws.mouse_x -= game_area.offsetLeft; - jaws.mouse_y -= game_area.offsetTop; - } - - /** - * 1) Calls jaws.init(), detects or creats a canvas, and sets up the 2D context (jaws.canvas and jaws.context). - * 2) Pre-loads all defined assets with jaws.assets.loadAll(). - * 3) Creates an instance of game_state and calls setup() on that instance. - * 4) Loops calls to update() and draw() with given FPS until game ends or another game state is activated. - * @param {function} game_state The game state function to be started - * @param {object} options Object-literal of game loop properties - * @param {object} game_state_setup_options Object-literal of game state properties and values - * @see jaws.init() - * @see jaws.setupInput() - * @see jaws.assets.loadAll() - * @see jaws.switchGameState() - * @example - * - * jaws.start(MyGame) // Start game state Game() with default options - * jaws.start(MyGame, {fps: 30}) // Start game state Game() with options, in this case jaws will run your game with 30 frames per second. - * jaws.start(window) // Use global functions setup(), update() and draw() if available. Not the recommended way but useful for testing and mini-games. - * - */ - jaws.start = function(game_state, options, game_state_setup_options) { - if (!options) options = {}; - - var fps = options.fps || 60; - if (options.loading_screen === undefined) options.loading_screen = true; - if (!options.width) options.width = 500; - if (!options.height) options.height = 300; - - /* Takes care of finding/creating canvas-element and debug-div */ - jaws.init(options); - - if (!jaws.isFunction(game_state) && !jaws.isObject(game_state)) { - jaws.log.error("jaws.start: Passed in GameState is niether function or object"); - return; - } - if (!jaws.isObject(game_state_setup_options) && game_state_setup_options !== undefined) { - jaws.log.error("jaws.start: The setup options for the game state is not an object."); - return; - } - - if (options.loading_screen) { - jaws.assets.displayProgress(0); - } - - jaws.log.info("setupInput()", true); - jaws.setupInput(); - - /* Callback for when one single asset has been loaded */ - function assetProgress(src, percent_done) { - jaws.log.info(percent_done + "%: " + src, true); - if (options.loading_screen) { - jaws.assets.displayProgress(percent_done); - } - } - - /* Callback for when an asset can't be loaded*/ - function assetError(src, percent_done) { - jaws.log.info(percent_done + "%: Error loading asset " + src, true); - } - - /* Callback for when all assets are loaded */ - function assetsLoaded() { - jaws.log.info("all assets loaded", true); - jaws.switchGameState(game_state || window, {fps: fps}, game_state_setup_options); - } - - jaws.log.info("assets.loadAll()", true); - if (jaws.assets.length() > 0) { - jaws.assets.loadAll({onprogress: assetProgress, onerror: assetError, onload: assetsLoaded}); - } - else { - assetsLoaded(); - } - }; - - /** - * Switchs to a new active game state and saves previous game state in jaws.previous_game_state - * @param {function} game_state The game state function to start - * @param {object} options The object-literal properties to pass to the new game loop - * @param {object} game_state_setup_options The object-literal properties to pass to starting game state - * @example - * - * function MenuState() { - * this.setup = function() { ... } - * this.draw = function() { ... } - * this.update = function() { - * if(pressed("enter")) jaws.switchGameState(GameState); // Start game when Enter is pressed - * } - * } - * - * function GameState() { - * this.setup = function() { ... } - * this.update = function() { ... } - * this.draw = function() { ... } - * } - * - * jaws.start(MenuState) - * - */ - jaws.switchGameState = function(game_state, options, game_state_setup_options) { - if(options === undefined) options = {}; - - if(jaws.isFunction(game_state)) { - game_state = new game_state; - } - if(!jaws.isObject(game_state)) { - jaws.log.error("jaws.switchGameState: Passed in GameState should be a Function or an Object."); - return; - } - - var fps = (options && options.fps) || (jaws.game_loop && jaws.game_loop.fps) || 60; - var setup = options.setup - - jaws.game_loop && jaws.game_loop.stop(); - jaws.clearKeyCallbacks(); - - jaws.previous_game_state = jaws.game_state; - jaws.game_state = game_state; - jaws.game_loop = new jaws.GameLoop(game_state, {fps: fps, setup: setup}, game_state_setup_options); - jaws.game_loop.start(); - }; - - /** - * Creates a new HTMLCanvasElement from a HTMLImageElement - * @param {HTMLImageElement} image The HTMLImageElement to convert to a HTMLCanvasElement - * @returns {HTMLCanvasElement} A HTMLCanvasElement with drawn HTMLImageElement content - */ - jaws.imageToCanvas = function(image) { - if (jaws.isCanvas(image)) return image; - - if (!jaws.isImage(image)) { - jaws.log.error("jaws.imageToCanvas: Passed in object is not an Image."); - return; - } - - var canvas = document.createElement("canvas"); - canvas.src = image.src; - canvas.width = image.width; - canvas.height = image.height; - - var context = canvas.getContext("2d"); - context.drawImage(image, 0, 0, image.width, image.height); - return canvas; - }; - - /** - * Returns object as an array - * @param {object} obj An array or object - * @returns {array} Either an array or the object as an array - * @example - * - * jaws.forceArray(1) // --> [1] - * jaws.forceArray([1,2]) // --> [1,2] - */ - jaws.forceArray = function(obj) { - return Array.isArray(obj) ? obj : [obj]; - }; - - /** - * Clears screen (the canvas-element) through context.clearRect() - */ - jaws.clear = function() { - jaws.context.clearRect(0, 0, jaws.width, jaws.height); - }; - - /** Fills the screen with given fill_style */ - jaws.fill = function(fill_style) { - jaws.context.fillStyle = fill_style; - jaws.context.fillRect(0, 0, jaws.width, jaws.height); - }; - - - /** - * calls draw() on everything you throw on it. Give it arrays, argumentlists, arrays of arrays. - * - */ - jaws.draw = function() { - var list = arguments; - if(list.length == 1 && jaws.isArray(list[0])) list = list[0]; - for(var i=0; i < list.length; i++) { - if(jaws.isArray(list[i])) jaws.draw(list[i]); - else if(list[i].draw) list[i].draw(); - } - } - - /** - * calls update() on everything you throw on it. Give it arrays, argumentlists, arrays of arrays. - * - */ - jaws.update = function() { - var list = arguments; - if(list.length == 1 && jaws.isArray(list[0])) list = list[0]; - for(var i=0; i < list.length; i++) { - if(jaws.isArray(list[i])) jaws.update(list[i]); - else if(list[i].update) list[i].update(); - } - } - - /** - * Tests if object is an image or not - * @param {object} obj An Image or image-like object - * @returns {boolean} If object's prototype is "HTMLImageElement" - */ - jaws.isImage = function(obj) { - return Object.prototype.toString.call(obj) === "[object HTMLImageElement]"; - }; - - /** - * Tests if object is a Canvas object - * @param {type} obj A canvas or canvas-like object - * @returns {boolean} If object's prototype is "HTMLCanvasElement" - */ - jaws.isCanvas = function(obj) { - return Object.prototype.toString.call(obj) === "[object HTMLCanvasElement]"; - }; - - /** - * Tests if an object is either a canvas or an image object - * @param {object} obj A canvas or canva-like object - * @returns {boolean} If object isImage or isCanvas - */ - jaws.isDrawable = function(obj) { - return jaws.isImage(obj) || jaws.isCanvas(obj); - }; - - /** - * Tests if an object is a string or not - * @param {object} obj A string or string-like object - * @returns {boolean} The result of typeof and constructor testing - */ - jaws.isString = function(obj) { - return typeof obj === "string" || (typeof obj === "object" && obj.constructor === String); - }; - - /** - * Tests if an object is a number or not - * @param {number} n A number or number-like value - * @returns {boolean} If n passed isNaN() and isFinite() - */ - jaws.isNumber = function(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - }; - - /** - * Tests if an object is an Array or not - * @param {object} obj An array or array-like object - * @returns {boolean} If object's constructor is "Array" - */ - jaws.isArray = function(obj) { - if (!obj) - return false; - return !(obj.constructor.toString().indexOf("Array") === -1); - }; - - /** - * Tests if an object is an Object or not - * @param {object} value An object or object-like enitity - * @returns {boolean} If object is not null and typeof 'object' - */ - jaws.isObject = function(value) { - return value !== null && typeof value === 'object'; - }; - - /** - * Tests if an object is a function or not - * @param {object} obj A function or function-like object - * @returns {boolean} If the prototype of the object is "Function" - */ - jaws.isFunction = function(obj) { - return (Object.prototype.toString.call(obj) === "[object Function]"); - }; - - /** - * Tests if an object is a regular expression or not - * @param {object} obj A /regexp/-object - * @returns {boolean} If the object is an instance of RegExp - */ - jaws.isRegExp = function(obj) { - return (obj instanceof RegExp); - }; - - - /** - * Tests if an object is within drawing canvas (jaws.width and jaws.height) - * @param {object} item An object with both x and y properties - * @returns {boolean} If the item's x and y are less than 0 or more than jaws.width or jaws.height - */ - jaws.isOutsideCanvas = function(item) { - if (item.x && item.y) { - return (item.x < 0 || item.y < 0 || item.x > jaws.width || item.y > jaws.height); - } - }; - - /** - * Sets x and y properties to 0 (if less than), or jaws.width or jaws.height (if greater than) - * @param {object} item An object with x and y properties - */ - jaws.forceInsideCanvas = function(item) { - if (item.x && item.y) { - if (item.x < 0) { - item.x = 0; - } - if (item.x > jaws.width) { - item.x = jaws.width; - } - if (item.y < 0) { - item.y = 0; - } - if (item.y > jaws.height) { - item.y = jaws.height; - } - } - }; - - /** - * Parses current window.location for URL parameters and values - * @returns {array} Hash of url-parameters and their values - * @example - * // Given the current URL is <b>http://test.com/?debug=1&foo=bar</b> - * jaws.getUrlParameters() // --> {debug: 1, foo: bar} - */ - jaws.getUrlParameters = function() { - var vars = [], hash; - var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); - for (var i = 0; i < hashes.length; i++) { - hash = hashes[i].split('='); - vars.push(hash[0]); - vars[hash[0]] = hash[1]; - } - return vars; - }; - - /** - * Compares an object's default properties against those sent to its constructor - * @param {object} object The object to compare and assign new values - * @param {object} options Object-literal of constructor properties and new values - * @param {object} defaults Object-literal of properties and their default values - */ - jaws.parseOptions = function(object, options, defaults) { - object["options"] = options; - - for (var option in options) { - if (defaults[option] === undefined) { - jaws.log.warn("jaws.parseOptions: Unsupported property " + option + "for " + object.constructor); - } - } - for (var option in defaults) { - if( jaws.isFunction(defaults[option]) ) defaults[option] = defaults[option](); - object[option] = (options[option] !== undefined) ? options[option] : jaws.clone(defaults[option]); - } - }; - - /** - * Returns a shallow copy of an array or object - * @param {array|object} value The array or object to clone - * @returns {array|object} A copy of an array of object - */ - jaws.clone = function(value) { - if (jaws.isArray(value)) - return value.slice(0); - if (jaws.isObject(value)) - return JSON.parse(JSON.stringify(value)); - return value; - }; - - /* - * Converts image to canvas 2D context. Then you can draw on it :). - */ - jaws.imageToCanvasContext = function(image) { - var canvas = document.createElement("canvas") - canvas.width = image.width - canvas.height = image.height - - var context = canvas.getContext("2d") - if(jaws.context) { - context.imageSmoothingEnabled = jaws.context.mozImageSmoothingEnabled; - context.webkitImageSmoothingEnabled = jaws.context.mozImageSmoothingEnabled; - context.mozImageSmoothingEnabled = jaws.context.mozImageSmoothingEnabled; - } - - context.drawImage(image, 0, 0, canvas.width, canvas.height) - return context - } - - /** - * scale 'image' by factor 'factor'. - * Scaling is done using nearest-neighbor ( retro-blocky-style ). - * Returns a canvas. - */ - jaws.retroScaleImage = function(image, factor) { - var canvas = jaws.isImage(image) ? jaws.imageToCanvas(image) : image - var context = canvas.getContext("2d") - var data = context.getImageData(0,0,canvas.width,canvas.height).data - - // Create new canvas to return - var canvas2 = document.createElement("canvas") - canvas2.width = image.width * factor - canvas2.height = image.height * factor - var context2 = canvas2.getContext("2d") - var to_data = context2.createImageData(canvas2.width, canvas2.height) - - var w2 = to_data.width - var h2 = to_data.height - for (var y=0; y < h2; y += 1) { - var y2 = Math.floor(y / factor) - var y_as_x = y * to_data.width - var y2_as_x = y2 * image.width - - for (var x=0; x < w2; x += 1) { - var x2 = Math.floor(x / factor) - var y_dst = (y_as_x + x) * 4 - var y_src = (y2_as_x + x2) * 4 - - to_data.data[y_dst] = data[y_src]; - to_data.data[y_dst+1] = data[y_src+1]; - to_data.data[y_dst+2] = data[y_src+2]; - to_data.data[y_dst+3] = data[y_src+3]; - } - } - - context2.putImageData(to_data, 0, 0) - - return canvas2 - } - - return jaws; -})(jaws || {}); - -// Support CommonJS require() -if(typeof module !== "undefined" && ('exports' in module)) { module.exports = jaws } |
