com.bladecoder.engine.assets.EngineResolutionFileResolver Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of blade-engine Show documentation
Show all versions of blade-engine Show documentation
Classic point and click adventure game engine
/*******************************************************************************
* Copyright 2014 Rafael Garcia Moreno.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.bladecoder.engine.assets;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.loaders.FileHandleResolver;
import com.badlogic.gdx.assets.loaders.resolvers.ResolutionFileResolver.Resolution;
import com.badlogic.gdx.files.FileHandle;
import com.bladecoder.engine.util.EngineLogger;
import com.bladecoder.engine.util.FileUtils;
public class EngineResolutionFileResolver implements FileHandleResolver {
private final FileHandleResolver baseResolver;
private Resolution[] descriptors;
private Resolution bestDesc;
private String fixResolution;
public EngineResolutionFileResolver(FileHandleResolver baseResolver) {
this.baseResolver = baseResolver;
}
@Override
public FileHandle resolve(String fileName) {
FileHandle originalHandle = new FileHandle(fileName);
FileHandle handle = baseResolver.resolve(resolve(originalHandle, bestDesc.folder));
if (!FileUtils.exists(handle))
handle = baseResolver.resolve(fileName);
return handle;
}
protected String resolve(FileHandle originalHandle, String suffix) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(originalHandle.parent());
stringBuilder.append("/");
stringBuilder.append(suffix);
stringBuilder.append("/");
stringBuilder.append(originalHandle.name());
return stringBuilder.toString();
}
public boolean exists(String fileName) {
FileHandle originalHandle = new FileHandle(fileName);
FileHandle handle = baseResolver.resolve(resolve(originalHandle, bestDesc.folder));
if (FileUtils.exists(handle))
return true;
handle = baseResolver.resolve(fileName);
if (FileUtils.exists(handle))
return true;
return false;
}
public FileHandleResolver getBaseResolver() {
return baseResolver;
}
/**
* Skip the resolution resolver. In Android the exists() method is expensive, so this
* method save a exists call.
*/
public FileHandle baseResolve(String fileName) {
return baseResolver.resolve(fileName);
}
public Resolution[] getResolutions() {
return descriptors;
}
public Resolution getResolution() {
return bestDesc;
}
public void selectResolution() {
if(fixResolution != null)
selectFixedResolution();
else
selectBestResolution();
}
private void selectBestResolution() {
bestDesc = descriptors[0];
int width = Gdx.graphics.getWidth() > Gdx.graphics.getHeight() ?Gdx.graphics.getWidth():Gdx.graphics.getHeight();
int bestDist = Math.abs(width - bestDesc.portraitWidth);
for (int i = 1; i < descriptors.length; i++) {
Resolution other = descriptors[i];
int dist = Math.abs(width - other.portraitWidth);
if (dist < bestDist) {
bestDesc = descriptors[i];
bestDist = dist;
}
}
}
public void setResolutions(Resolution[] resolutions) {
this.descriptors = resolutions;
}
/**
* Sets a fixed prefix, disabling choosing the best resolution.
*/
private void selectFixedResolution() {
for (int i = 0; i < descriptors.length; i++) {
if(descriptors[i].folder.equals(fixResolution)) {
bestDesc = descriptors[i];
return;
}
}
if(bestDesc == null) {
EngineLogger.error("Requested resolution not found: " + fixResolution);
selectBestResolution();
}
}
public void setFixedResolution(String suffix) {
fixResolution = suffix;
}
}