private Sprite createSprite(GameObject source, Map<String, String> attributeKeyValueList) {
		Sprite result = null;

		if (attributeKeyValueList.containsKey(LOTDConstants.INI_KEY_TEXTURE_FILE_PATH)) {
			String texturePath = attributeKeyValueList.get(LOTDConstants.INI_KEY_TEXTURE_FILE_PATH);
			int animationsPerSecond = 0;
			int numColumns = 1;
			int numRows = 1;

			if (attributeKeyValueList.containsKey(LOTDConstants.SPRITE_KEY_NUM_ANIMATIONS_PER_SECOND))
				animationsPerSecond = Integer.parseInt(attributeKeyValueList.get(LOTDConstants.SPRITE_KEY_NUM_ANIMATIONS_PER_SECOND));
			if (attributeKeyValueList.containsKey(LOTDConstants.SPRITE_KEY_NUM_COLUMNS))
				numColumns = Integer.parseInt(attributeKeyValueList.get(LOTDConstants.SPRITE_KEY_NUM_COLUMNS));
			if (attributeKeyValueList.containsKey(LOTDConstants.SPRITE_KEY_NUM_ROWS))
				numRows = Integer.parseInt(attributeKeyValueList.get(LOTDConstants.SPRITE_KEY_NUM_ROWS));

			if (source != null && texturePath != null && numColumns >= 1 && numRows >= 1 && animationsPerSecond >= 0) {
				Texture texture = createTexture(texturePath);

				if (texture != null) {
					result = new Sprite(texture, numColumns, numRows, animationsPerSecond);
					// set original width/height of the gameobject in order to get the correct 
					// scale values when calculating the collision rect f.e. in the 'getCollisionRect' method
					source.setOriginalWidth(result.getFrameWidth());
					source.setOriginalHeight(result.getFrameHeight());

					// if width and height is not specified in the .ini file then use the default width and height of the sprite
					if (source.getWidth() == 0)
						source.setWidth(result.getWidth());
					if (source.getHeight() == 0)
						source.setHeight(result.getHeight());

					// bind the properties so that changes to the gameObject are also made to the sprite
					result.getXProperty().bindBidirectional(source.getXProperty());
					result.getYProperty().bindBidirectional(source.getYProperty());
					result.getWidthProperty().bindBidirectional(source.getWidthProperty());
					result.getHeightProperty().bindBidirectional(source.getHeightProperty());

					spriteCache.put(source, result);
					if (LOGGER.isDebugEnabled() && result != null)
						LOGGER.debug("Successfully created sprite: " + result);
				}
			}
		}

		return result;
	}