mirror of https://github.com/axmolengine/axmol.git
Improved mac file utils and event responsiveness.
This commit is contained in:
parent
d4b6d1262b
commit
dc7ce1cd0f
|
@ -127,6 +127,9 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
|
|||
|
||||
[openGLView unlockOpenGLContext];
|
||||
|
||||
// send any queued events
|
||||
[[CCEventDispatcher sharedDispatcher] dispatchQueuedEvents];
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2010 cocos2d-x.org
|
||||
Copyright (c) 2010-2011 cocos2d-x.org
|
||||
Copyright (c) 2011 Zynga Inc.
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
|
@ -32,147 +33,99 @@ THE SOFTWARE.
|
|||
#include "CCFileUtils.h"
|
||||
#include "CCDirector.h"
|
||||
#include "CCSAXParser.h"
|
||||
#include "CCImage.h"
|
||||
#include "CCDictionary.h"
|
||||
#include "CCArray.h"
|
||||
#include "support/zip_support/unzip.h"
|
||||
|
||||
#define MAX_PATH 260
|
||||
|
||||
using namespace cocos2d;
|
||||
USING_NS_CC;
|
||||
|
||||
static void static_addValueToCCDict(id key, id value, CCDictionary* pDict);
|
||||
static void static_addItemToCCArray(id item, CCArray *pArray);
|
||||
static void static_addItemToCCArray(id item, CCArray* pArray);
|
||||
|
||||
static const char *static_ccRemoveHDSuffixFromFile( const char *pszPath)
|
||||
static NSString *__suffixiPhoneRetinaDisplay =@"-hd";
|
||||
static NSString *__suffixiPad =@"-ipad";
|
||||
static NSString *__suffixiPadRetinaDisplay =@"-ipadhd";
|
||||
static NSFileManager *__localFileManager= [[NSFileManager alloc] init];
|
||||
|
||||
bool fileExistsAtPath(const char *cpath, const char *csuffix);
|
||||
CCDictionary* ccFileUtils_dictionaryWithContentsOfFileThreadSafe(const char *pFileName);
|
||||
CCArray* ccFileUtils_arrayWithContentsOfFileThreadSafe(const char* pFileName);
|
||||
|
||||
static bool isIPad()
|
||||
{
|
||||
#if CC_IS_RETINA_DISPLAY_SUPPORTED
|
||||
|
||||
if(cocos2d::CC_CONTENT_SCALE_FACTOR() == 2 ) {
|
||||
NSString *path = [NSString stringWithUTF8String: pszPath];
|
||||
NSString *name = [path lastPathComponent];
|
||||
NSString *suffix = [NSString stringWithUTF8String: CC_RETINA_DISPLAY_FILENAME_SUFFIX];
|
||||
|
||||
// check if path already has the suffix.
|
||||
if( [name rangeOfString: suffix].location != NSNotFound ) {
|
||||
|
||||
CCLOG("cocos2d: Filename(%@) contains %@ suffix. Removing it. See cocos2d issue #1040", path, CC_RETINA_DISPLAY_FILENAME_SUFFIX);
|
||||
|
||||
NSString *newLastname = [name stringByReplacingOccurrencesOfString: suffix withString:@""];
|
||||
|
||||
NSString *pathWithoutLastname = [path stringByDeletingLastPathComponent];
|
||||
return [[pathWithoutLastname stringByAppendingPathComponent:newLastname] UTF8String];
|
||||
}
|
||||
}
|
||||
|
||||
#endif // CC_IS_RETINA_DISPLAY_SUPPORTED
|
||||
|
||||
return pszPath;
|
||||
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
|
||||
return (winSize.width >= 1024 && winSize.height >= 768);
|
||||
}
|
||||
|
||||
static NSString* getDoubleResolutionImage(NSString* path)
|
||||
static NSString* removeSuffixFromPath(NSString *suffix, NSString *path)
|
||||
{
|
||||
#if CC_IS_RETINA_DISPLAY_SUPPORTED
|
||||
|
||||
if( cocos2d::CC_CONTENT_SCALE_FACTOR() == 2 )
|
||||
// quick return
|
||||
if( ! suffix || [suffix length] == 0 )
|
||||
{
|
||||
|
||||
NSString *pathWithoutExtension = [path stringByDeletingPathExtension];
|
||||
NSString *name = [pathWithoutExtension lastPathComponent];
|
||||
NSString *suffix = [NSString stringWithUTF8String: CC_RETINA_DISPLAY_FILENAME_SUFFIX];
|
||||
|
||||
// check if path already has the suffix.
|
||||
if( [name rangeOfString: suffix].location != NSNotFound ) {
|
||||
|
||||
CCLOG("cocos2d: WARNING Filename(%@) already has the suffix %@. Using it.", name, CC_RETINA_DISPLAY_FILENAME_SUFFIX);
|
||||
return path;
|
||||
}
|
||||
|
||||
|
||||
NSString *extension = [path pathExtension];
|
||||
|
||||
if( [extension isEqualToString:@"ccz"] || [extension isEqualToString:@"gz"] )
|
||||
{
|
||||
// All ccz / gz files should be in the format filename.xxx.ccz
|
||||
// so we need to pull off the .xxx part of the extension as well
|
||||
extension = [NSString stringWithFormat:@"%@.%@", [pathWithoutExtension pathExtension], extension];
|
||||
pathWithoutExtension = [pathWithoutExtension stringByDeletingPathExtension];
|
||||
}
|
||||
|
||||
|
||||
NSString *retinaName = [pathWithoutExtension stringByAppendingString: suffix];
|
||||
retinaName = [retinaName stringByAppendingPathExtension:extension];
|
||||
|
||||
NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];
|
||||
if( [fileManager fileExistsAtPath:retinaName] )
|
||||
return retinaName;
|
||||
|
||||
CCLOG("cocos2d: CCFileUtils: Warning HD file not found: %@", [retinaName lastPathComponent] );
|
||||
return path;
|
||||
}
|
||||
|
||||
#endif // CC_IS_RETINA_DISPLAY_SUPPORTED
|
||||
|
||||
|
||||
NSString *name = [path lastPathComponent];
|
||||
|
||||
// check if path already has the suffix.
|
||||
if( [name rangeOfString:suffix].location != NSNotFound ) {
|
||||
|
||||
CCLOG("cocos2d: Filename(%s) contains %s suffix. Removing it. See cocos2d issue #1040", [path UTF8String], [suffix UTF8String]);
|
||||
|
||||
NSString *newLastname = [name stringByReplacingOccurrencesOfString:suffix withString:@""];
|
||||
|
||||
NSString *pathWithoutLastname = [path stringByDeletingLastPathComponent];
|
||||
return [pathWithoutLastname stringByAppendingPathComponent:newLastname];
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
static const char* static_fullPathFromRelativePath(const char *pszRelativePath)
|
||||
static NSString* getPathForSuffix(NSString *path, NSString *suffix)
|
||||
{
|
||||
|
||||
// NSAssert(pszRelativePath != nil, @"CCFileUtils: Invalid path");
|
||||
|
||||
// do not convert an absolute path (starting with '/')
|
||||
NSString *relPath = [NSString stringWithUTF8String: pszRelativePath];
|
||||
NSString *fullpath = nil;
|
||||
|
||||
// only if it is not an absolute path
|
||||
if( ! [relPath isAbsolutePath] )
|
||||
{
|
||||
NSString *file = [relPath lastPathComponent];
|
||||
NSString *imageDirectory = [relPath stringByDeletingLastPathComponent];
|
||||
|
||||
fullpath = [[NSBundle mainBundle] pathForResource:file
|
||||
ofType:nil
|
||||
inDirectory:imageDirectory];
|
||||
|
||||
if (CC_CONTENT_SCALE_FACTOR() > 1.0f &&
|
||||
fullpath == nil && [file rangeOfString:@"@2x" options:NSBackwardsSearch].length == 0
|
||||
&& ([file rangeOfString:@".png" options:NSBackwardsSearch | NSCaseInsensitiveSearch].length != 0
|
||||
|| [file rangeOfString:@".jpg" options:NSBackwardsSearch | NSCaseInsensitiveSearch].length != 0)
|
||||
)
|
||||
{
|
||||
NSMutableString *newFile = [NSMutableString stringWithString:file];
|
||||
NSRange range = [newFile rangeOfString:@"." options:NSBackwardsSearch];
|
||||
if (range.length > 0 )
|
||||
{
|
||||
[newFile insertString:@"@2x" atIndex:range.location];
|
||||
fullpath = [[NSBundle mainBundle] pathForResource:newFile
|
||||
ofType:nil
|
||||
inDirectory:imageDirectory];
|
||||
}
|
||||
|
||||
if (fullpath)
|
||||
{
|
||||
imageDirectory = [fullpath stringByDeletingLastPathComponent];
|
||||
fullpath = [imageDirectory stringByAppendingPathComponent:file];
|
||||
}
|
||||
else
|
||||
{
|
||||
CCLog("miss file %s", [[imageDirectory stringByAppendingPathComponent:newFile] UTF8String]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (fullpath == nil)
|
||||
fullpath = relPath;
|
||||
|
||||
fullpath = getDoubleResolutionImage(fullpath);
|
||||
|
||||
return [fullpath UTF8String];
|
||||
// quick return
|
||||
if( ! suffix || [suffix length] == 0 )
|
||||
{
|
||||
return path;
|
||||
}
|
||||
|
||||
NSString *pathWithoutExtension = [path stringByDeletingPathExtension];
|
||||
NSString *name = [pathWithoutExtension lastPathComponent];
|
||||
|
||||
// check if path already has the suffix.
|
||||
if( [name rangeOfString:suffix].location != NSNotFound ) {
|
||||
|
||||
CCLOG("cocos2d: WARNING Filename(%s) already has the suffix %s. Using it.", [name UTF8String], [suffix UTF8String]);
|
||||
return path;
|
||||
}
|
||||
|
||||
|
||||
NSString *extension = [path pathExtension];
|
||||
|
||||
if( [extension isEqualToString:@"ccz"] || [extension isEqualToString:@"gz"] )
|
||||
{
|
||||
// All ccz / gz files should be in the format filename.xxx.ccz
|
||||
// so we need to pull off the .xxx part of the extension as well
|
||||
extension = [NSString stringWithFormat:@"%@.%@", [pathWithoutExtension pathExtension], extension];
|
||||
pathWithoutExtension = [pathWithoutExtension stringByDeletingPathExtension];
|
||||
}
|
||||
|
||||
|
||||
NSString *newName = [pathWithoutExtension stringByAppendingString:suffix];
|
||||
newName = [newName stringByAppendingPathExtension:extension];
|
||||
|
||||
if( [__localFileManager fileExistsAtPath:newName] )
|
||||
return newName;
|
||||
|
||||
CCLOG("cocos2d: CCFileUtils: Warning file not found: %s", [[newName lastPathComponent] UTF8String] );
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static void static_addItemToCCArray(id item, CCArray *pArray)
|
||||
{
|
||||
// add string value into array
|
||||
// add string value into array
|
||||
if ([item isKindOfClass:[NSString class]]) {
|
||||
CCString* pValue = new CCString([item UTF8String]);
|
||||
|
||||
|
@ -181,7 +134,7 @@ static void static_addItemToCCArray(id item, CCArray *pArray)
|
|||
return;
|
||||
}
|
||||
|
||||
// add number value into array(such as int, float, bool and so on)
|
||||
// add number value into array(such as int, float, bool and so on)
|
||||
if ([item isKindOfClass:[NSNumber class]]) {
|
||||
NSString* pStr = [item stringValue];
|
||||
CCString* pValue = new CCString([pStr UTF8String]);
|
||||
|
@ -206,6 +159,7 @@ static void static_addItemToCCArray(id item, CCArray *pArray)
|
|||
// add array value into array
|
||||
if ([item isKindOfClass:[NSArray class]]) {
|
||||
CCArray *pArrayItem = new CCArray();
|
||||
pArrayItem->init();
|
||||
for (id subItem in item) {
|
||||
static_addItemToCCArray(subItem, pArrayItem);
|
||||
}
|
||||
|
@ -217,260 +171,382 @@ static void static_addItemToCCArray(id item, CCArray *pArray)
|
|||
|
||||
static void static_addValueToCCDict(id key, id value, CCDictionary* pDict)
|
||||
{
|
||||
// the key must be a string
|
||||
// the key must be a string
|
||||
CCAssert([key isKindOfClass:[NSString class]], "The key should be a string!");
|
||||
std::string pKey = [key UTF8String];
|
||||
|
||||
// the value is a new dictionary
|
||||
// the value is a new dictionary
|
||||
if ([value isKindOfClass:[NSDictionary class]]) {
|
||||
CCDictionary* pSubDict = new CCDictionary();
|
||||
for (id subKey in [value allKeys]) {
|
||||
id subValue = [value objectForKey:subKey];
|
||||
static_addValueToCCDict(subKey, subValue, pSubDict);
|
||||
}
|
||||
pDict->setObject(pSubDict, pKey);
|
||||
pDict->setObject(pSubDict, pKey.c_str());
|
||||
pSubDict->release();
|
||||
return;
|
||||
}
|
||||
|
||||
// the value is a string
|
||||
// the value is a string
|
||||
if ([value isKindOfClass:[NSString class]]) {
|
||||
CCString* pValue = new CCString([value UTF8String]);
|
||||
|
||||
pDict->setObject(pValue, pKey);
|
||||
pDict->setObject(pValue, pKey.c_str());
|
||||
pValue->release();
|
||||
return;
|
||||
}
|
||||
|
||||
// the value is a number
|
||||
// the value is a number
|
||||
if ([value isKindOfClass:[NSNumber class]]) {
|
||||
NSString* pStr = [value stringValue];
|
||||
CCString* pValue = new CCString([pStr UTF8String]);
|
||||
|
||||
pDict->setObject(pValue, pKey);
|
||||
pDict->setObject(pValue, pKey.c_str());
|
||||
pValue->release();
|
||||
return;
|
||||
}
|
||||
|
||||
// the value is a array
|
||||
// the value is a array
|
||||
if ([value isKindOfClass:[NSArray class]]) {
|
||||
CCArray *pArray = new CCArray();
|
||||
pArray->init();
|
||||
for (id item in value) {
|
||||
static_addItemToCCArray(item, pArray);
|
||||
}
|
||||
pDict->setObject(pArray, pKey);
|
||||
pDict->setObject(pArray, pKey.c_str());
|
||||
pArray->release();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
namespace cocos2d {
|
||||
NS_CC_BEGIN
|
||||
|
||||
static CCFileUtils* s_pFileUtils = NULL;
|
||||
static CCFileUtils* s_pFileUtils = NULL;
|
||||
|
||||
CCDictionary* ccFileUtils_dictionaryWithContentsOfFileThreadSafe(const char *pFileName);
|
||||
CCArray* ccFileUtils_arrayWithContentsOfFileThreadSafe(const char* pFileName);
|
||||
|
||||
CCFileUtils* CCFileUtils::sharedFileUtils()
|
||||
{
|
||||
if (s_pFileUtils == NULL)
|
||||
{
|
||||
s_pFileUtils = new CCFileUtils();
|
||||
}
|
||||
return s_pFileUtils;
|
||||
}
|
||||
|
||||
void CCFileUtils::purgeFileUtils()
|
||||
{
|
||||
if (s_pFileUtils != NULL)
|
||||
{
|
||||
s_pFileUtils->purgeCachedEntries();
|
||||
}
|
||||
|
||||
CC_SAFE_DELETE(s_pFileUtils);
|
||||
}
|
||||
|
||||
void CCFileUtils::purgeCachedEntries()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// record the resource path
|
||||
static char s_pszResourcePath[MAX_PATH] = {0};
|
||||
|
||||
void CCFileUtils::setResourcePath(const char *pszResourcePath)
|
||||
CCFileUtils* CCFileUtils::sharedFileUtils()
|
||||
{
|
||||
if (s_pFileUtils == NULL)
|
||||
{
|
||||
// NSAssert(pszResourcePath != NULL, "[FileUtils setResourcePath] -- wrong resource path");
|
||||
// NSAssert(strlen(pszResourcePath) <= MAX_PATH, "[FileUtils setResourcePath] -- resource path too long");
|
||||
|
||||
strcpy(s_pszResourcePath, pszResourcePath);
|
||||
s_pFileUtils = new CCFileUtils();
|
||||
}
|
||||
/*
|
||||
const char* CCFileUtils::getResourcePath()
|
||||
return s_pFileUtils;
|
||||
}
|
||||
|
||||
void CCFileUtils::purgeFileUtils()
|
||||
{
|
||||
if (s_pFileUtils != NULL)
|
||||
{
|
||||
return s_pszResourcePath;
|
||||
}
|
||||
*/
|
||||
|
||||
//int CCFileUtils::ccLoadFileIntoMemory(const char *filename, unsigned char **out)
|
||||
unsigned char* CCFileUtils::getFileData(const char *pszFileName, const char *pszMode, unsigned long *pSize)
|
||||
{
|
||||
unsigned char* out = NULL;
|
||||
|
||||
int size = 0;
|
||||
FILE *f = fopen(pszFileName, pszMode);
|
||||
if( !f ) {
|
||||
*pSize = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
size = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
|
||||
out = (unsigned char*)malloc(size);
|
||||
int read = fread(out, 1, size, f);
|
||||
if( read != size ) {
|
||||
free(out);
|
||||
*pSize = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
*pSize = size;
|
||||
return out;
|
||||
s_pFileUtils->purgeCachedEntries();
|
||||
}
|
||||
|
||||
std::string& CCFileUtils::removeSuffixFromFile(std::string& path )
|
||||
CC_SAFE_DELETE(s_pFileUtils);
|
||||
}
|
||||
|
||||
void CCFileUtils::purgeCachedEntries()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CCFileUtils::setResourcePath(const char *pszResourcePath)
|
||||
{
|
||||
assert(0);
|
||||
}
|
||||
|
||||
std::string& CCFileUtils::removeSuffixFromFile(std::string& cpath )
|
||||
{
|
||||
NSString *ret = nil;
|
||||
NSString *path = [NSString stringWithUTF8String:cpath.c_str()];
|
||||
|
||||
if( isIPad() )
|
||||
{
|
||||
path = static_ccRemoveHDSuffixFromFile(path.c_str());
|
||||
return path;
|
||||
}
|
||||
|
||||
const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
|
||||
{
|
||||
return static_fullPathFromRelativePath(pszRelativePath);
|
||||
}
|
||||
|
||||
const char *CCFileUtils::fullPathFromRelativeFile(const char *pszFilename, const char *pszRelativeFile)
|
||||
{
|
||||
std::string relativeFile = fullPathFromRelativePath(pszRelativeFile);
|
||||
CCString *pRet = new CCString();
|
||||
pRet->autorelease();
|
||||
pRet->m_sString = relativeFile.substr(0, relativeFile.rfind('/')+1);
|
||||
pRet->m_sString += pszFilename;
|
||||
return pRet->m_sString.c_str();
|
||||
}
|
||||
|
||||
CCDictionary* ccFileUtils_dictionaryWithContentsOfFileThreadSafe(const char *pFileName)
|
||||
{
|
||||
const char* pszFullPath = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(pFileName);
|
||||
NSString* pPath = [NSString stringWithUTF8String:pszFullPath];
|
||||
NSDictionary* pDict = [NSDictionary dictionaryWithContentsOfFile:pPath];
|
||||
|
||||
CCDictionary* pRet = new CCDictionary();
|
||||
for (id key in [pDict allKeys]) {
|
||||
id value = [pDict objectForKey:key];
|
||||
static_addValueToCCDict(key, value, pRet);
|
||||
}
|
||||
|
||||
return pRet;
|
||||
}
|
||||
|
||||
CCArray* ccFileUtils_arrayWithContentsOfFileThreadSafe(const char* pFileName)
|
||||
{
|
||||
NSString* pPath = [NSString stringWithUTF8String:pFileName];
|
||||
NSString* pathExtension= [pPath pathExtension];
|
||||
pPath = [pPath stringByDeletingPathExtension];
|
||||
pPath = [[NSBundle mainBundle] pathForResource:pPath ofType:pathExtension];
|
||||
NSArray* pArray = [NSArray arrayWithContentsOfFile:pPath];
|
||||
|
||||
CCArray* pRet = new CCArray();
|
||||
for (id value in pArray) {
|
||||
static_addItemToCCArray(value, pRet);
|
||||
}
|
||||
|
||||
return pRet;
|
||||
}
|
||||
|
||||
/*
|
||||
CCDictionary *CCFileUtils::dictionaryWithContentsOfFile(const char *pFileName)
|
||||
{
|
||||
NSString* pPath = [NSString stringWithUTF8String:pFileName];
|
||||
NSDictionary* pDict = [NSDictionary dictionaryWithContentsOfFile:pPath];
|
||||
|
||||
CCDictionary* pRet = new CCDictionary();
|
||||
for (id key in [pDict allKeys]) {
|
||||
id value = [pDict objectForKey:key];
|
||||
static_addValueToCCDict(key, value, pRet);
|
||||
}
|
||||
pRet->autorelease();
|
||||
return pRet;
|
||||
}
|
||||
|
||||
|
||||
unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
|
||||
{
|
||||
unsigned char * pBuffer = NULL;
|
||||
|
||||
do
|
||||
if( CC_CONTENT_SCALE_FACTOR() == 2 )
|
||||
{
|
||||
// read the file from hardware
|
||||
FILE *fp = fopen(pszFileName, pszMode);
|
||||
CC_BREAK_IF(!fp);
|
||||
|
||||
fseek(fp,0,SEEK_END);
|
||||
*pSize = ftell(fp);
|
||||
fseek(fp,0,SEEK_SET);
|
||||
pBuffer = new unsigned char[*pSize];
|
||||
*pSize = fread(pBuffer,sizeof(unsigned char), *pSize,fp);
|
||||
fclose(fp);
|
||||
} while (0);
|
||||
|
||||
if (! pBuffer && getIsPopupNotify())
|
||||
{
|
||||
std::string title = "Notification";
|
||||
std::string msg = "Get data from file(";
|
||||
msg.append(pszFileName).append(") failed!");
|
||||
|
||||
CCMessageBox(msg.c_str(), title.c_str());
|
||||
ret = removeSuffixFromPath(__suffixiPadRetinaDisplay, path);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = removeSuffixFromPath(__suffixiPad, path);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( CC_CONTENT_SCALE_FACTOR() == 2 )
|
||||
{
|
||||
ret = removeSuffixFromPath(__suffixiPhoneRetinaDisplay, [NSString stringWithUTF8String:cpath.c_str()]);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = path;
|
||||
}
|
||||
return pBuffer;
|
||||
}
|
||||
|
||||
void CCFileUtils::setResource(const char* pszZipFileName)
|
||||
{
|
||||
CCAssert(0, "Have not implement!");
|
||||
|
||||
cpath = [ret UTF8String];
|
||||
return cpath;
|
||||
}
|
||||
|
||||
void CCFileUtils::setiPhoneRetinaDisplaySuffix(const char *suffix)
|
||||
{
|
||||
[__suffixiPhoneRetinaDisplay release];
|
||||
__suffixiPhoneRetinaDisplay = [[NSString stringWithUTF8String:suffix] retain];
|
||||
}
|
||||
|
||||
void CCFileUtils::setiPadSuffix(const char *suffix)
|
||||
{
|
||||
[__suffixiPad release];
|
||||
__suffixiPad = [[NSString stringWithUTF8String:suffix] retain];
|
||||
}
|
||||
|
||||
void CCFileUtils::setiPadRetinaDisplaySuffix(const char *suffix)
|
||||
{
|
||||
[__suffixiPadRetinaDisplay release];
|
||||
__suffixiPadRetinaDisplay = [[NSString stringWithUTF8String:suffix] retain];
|
||||
}
|
||||
|
||||
bool fileExistsAtPath(const char *cpath, const char *csuffix)
|
||||
{
|
||||
NSString *fullpath = nil;
|
||||
NSString *relPath = [NSString stringWithUTF8String:cpath];
|
||||
NSString *suffix = [NSString stringWithUTF8String:csuffix];
|
||||
|
||||
// only if it is not an absolute path
|
||||
if( ! [relPath isAbsolutePath] ) {
|
||||
// pathForResource also searches in .lproj directories. issue #1230
|
||||
NSString *file = [relPath lastPathComponent];
|
||||
NSString *imageDirectory = [relPath stringByDeletingLastPathComponent];
|
||||
|
||||
fullpath = [[NSBundle mainBundle] pathForResource:file
|
||||
ofType:nil
|
||||
inDirectory:imageDirectory];
|
||||
|
||||
}
|
||||
|
||||
void CCFileUtils::setRelativePath(const char* pszRelativePath)
|
||||
{
|
||||
CCAssert(0, "Have not implement!");
|
||||
}
|
||||
*/
|
||||
// notification support when getFileData from a invalid file
|
||||
static bool s_bPopupNotify = true;
|
||||
if (fullpath == nil)
|
||||
fullpath = relPath;
|
||||
|
||||
void CCFileUtils::setPopupNotify(bool bNotify)
|
||||
{
|
||||
s_bPopupNotify = bNotify;
|
||||
NSString *path = getPathForSuffix(fullpath, suffix);
|
||||
|
||||
return ( path != nil );
|
||||
}
|
||||
|
||||
bool CCFileUtils::iPhoneRetinaDisplayFileExistsAtPath(const char *cpath)
|
||||
{
|
||||
return fileExistsAtPath(cpath, [__suffixiPhoneRetinaDisplay UTF8String]);
|
||||
}
|
||||
|
||||
bool CCFileUtils::iPadFileExistsAtPath(const char *cpath)
|
||||
{
|
||||
return fileExistsAtPath(cpath, [__suffixiPad UTF8String]);
|
||||
}
|
||||
|
||||
bool CCFileUtils::iPadRetinaDisplayFileExistsAtPath(const char *cpath)
|
||||
{
|
||||
return fileExistsAtPath(cpath, [__suffixiPadRetinaDisplay UTF8String]);
|
||||
}
|
||||
|
||||
const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
|
||||
{
|
||||
ccResolutionType ignore;
|
||||
return fullPathFromRelativePath(pszRelativePath, &ignore);
|
||||
}
|
||||
|
||||
const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath, ccResolutionType *pResolutionType)
|
||||
{
|
||||
CCAssert(pszRelativePath != NULL, "CCFileUtils: Invalid path");
|
||||
|
||||
NSString *fullpath = nil;
|
||||
NSString *relPath = [NSString stringWithUTF8String:pszRelativePath];
|
||||
|
||||
// only if it is not an absolute path
|
||||
if( ! [relPath isAbsolutePath] ) {
|
||||
|
||||
// pathForResource also searches in .lproj directories. issue #1230
|
||||
NSString *file = [relPath lastPathComponent];
|
||||
NSString *imageDirectory = [relPath stringByDeletingLastPathComponent];
|
||||
|
||||
fullpath = [[NSBundle mainBundle] pathForResource:file
|
||||
ofType:nil
|
||||
inDirectory:imageDirectory];
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool CCFileUtils::isPopupNotify()
|
||||
if (fullpath == nil)
|
||||
{
|
||||
return s_bPopupNotify;
|
||||
fullpath = relPath;
|
||||
}
|
||||
|
||||
NSString *ret = nil;
|
||||
|
||||
// iPad?
|
||||
if( isIPad() )
|
||||
{
|
||||
// Retina Display ?
|
||||
if( CC_CONTENT_SCALE_FACTOR() == 2 ) {
|
||||
ret = getPathForSuffix(fullpath, __suffixiPadRetinaDisplay);
|
||||
*pResolutionType = kCCResolutioniPadRetinaDisplay;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = getPathForSuffix(fullpath, __suffixiPad);
|
||||
*pResolutionType = kCCResolutioniPad;
|
||||
}
|
||||
}
|
||||
// iPhone ?
|
||||
else
|
||||
{
|
||||
// Retina Display ?
|
||||
if( CC_CONTENT_SCALE_FACTOR() == 2 ) {
|
||||
ret = getPathForSuffix(fullpath, __suffixiPhoneRetinaDisplay);
|
||||
*pResolutionType = kCCResolutioniPhoneRetinaDisplay;
|
||||
}
|
||||
}
|
||||
|
||||
// If it is iPhone Non RetinaDisplay, or if the previous "getPath" failed, then use iPhone images.
|
||||
if( ret == nil )
|
||||
{
|
||||
*pResolutionType = kCCResolutioniPhone;
|
||||
ret = fullpath;
|
||||
}
|
||||
|
||||
return [ret UTF8String];
|
||||
}
|
||||
|
||||
const char *CCFileUtils::fullPathFromRelativeFile(const char *pszFilename, const char *pszRelativeFile)
|
||||
{
|
||||
std::string relativeFile = fullPathFromRelativePath(pszRelativeFile);
|
||||
CCString *pRet = new CCString();
|
||||
pRet->autorelease();
|
||||
pRet->m_sString = relativeFile.substr(0, relativeFile.rfind('/')+1);
|
||||
pRet->m_sString += pszFilename;
|
||||
return pRet->m_sString.c_str();
|
||||
}
|
||||
|
||||
CCDictionary* ccFileUtils_dictionaryWithContentsOfFileThreadSafe(const char *pFileName)
|
||||
{
|
||||
const char* pszFullPath = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(pFileName);
|
||||
NSString* pPath = [NSString stringWithUTF8String:pszFullPath];
|
||||
NSDictionary* pDict = [NSDictionary dictionaryWithContentsOfFile:pPath];
|
||||
|
||||
CCDictionary* pRet = new CCDictionary();
|
||||
for (id key in [pDict allKeys]) {
|
||||
id value = [pDict objectForKey:key];
|
||||
static_addValueToCCDict(key, value, pRet);
|
||||
}
|
||||
|
||||
std::string CCFileUtils::getWriteablePath()
|
||||
{
|
||||
// save to document folder
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
std::string strRet = [documentsDirectory UTF8String];
|
||||
strRet.append("/");
|
||||
return strRet;
|
||||
return pRet;
|
||||
}
|
||||
|
||||
CCArray* ccFileUtils_arrayWithContentsOfFileThreadSafe(const char* pFileName)
|
||||
{
|
||||
NSString* pPath = [NSString stringWithUTF8String:pFileName];
|
||||
NSString* pathExtension= [pPath pathExtension];
|
||||
pPath = [pPath stringByDeletingPathExtension];
|
||||
pPath = [[NSBundle mainBundle] pathForResource:pPath ofType:pathExtension];
|
||||
NSArray* pArray = [NSArray arrayWithContentsOfFile:pPath];
|
||||
|
||||
CCArray* pRet = new CCArray();
|
||||
for (id value in pArray) {
|
||||
static_addItemToCCArray(value, pRet);
|
||||
}
|
||||
|
||||
}//namespace cocos2d
|
||||
return pRet;
|
||||
}
|
||||
|
||||
unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
|
||||
{
|
||||
unsigned char * pBuffer = NULL;
|
||||
CCAssert(pszFileName != NULL && pSize != NULL && pszMode != NULL, "Invaild parameters.");
|
||||
*pSize = 0;
|
||||
do
|
||||
{
|
||||
// read the file from hardware
|
||||
FILE *fp = fopen(pszFileName, pszMode);
|
||||
CC_BREAK_IF(!fp);
|
||||
|
||||
fseek(fp,0,SEEK_END);
|
||||
*pSize = ftell(fp);
|
||||
fseek(fp,0,SEEK_SET);
|
||||
pBuffer = new unsigned char[*pSize];
|
||||
*pSize = fread(pBuffer,sizeof(unsigned char), *pSize,fp);
|
||||
fclose(fp);
|
||||
} while (0);
|
||||
|
||||
if (! pBuffer && isPopupNotify())
|
||||
{
|
||||
std::string title = "Notification";
|
||||
std::string msg = "Get data from file(";
|
||||
msg.append(pszFileName).append(") failed!");
|
||||
|
||||
CCMessageBox(msg.c_str(), title.c_str());
|
||||
}
|
||||
return pBuffer;
|
||||
}
|
||||
|
||||
// notification support when getFileData from a invalid file
|
||||
static bool s_bPopupNotify = true;
|
||||
|
||||
void CCFileUtils::setPopupNotify(bool bNotify)
|
||||
{
|
||||
s_bPopupNotify = bNotify;
|
||||
}
|
||||
|
||||
bool CCFileUtils::isPopupNotify()
|
||||
{
|
||||
return s_bPopupNotify;
|
||||
}
|
||||
|
||||
std::string CCFileUtils::getWriteablePath()
|
||||
{
|
||||
// save to document folder
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
std::string strRet = [documentsDirectory UTF8String];
|
||||
strRet.append("/");
|
||||
return strRet;
|
||||
}
|
||||
|
||||
unsigned char* CCFileUtils::getFileDataFromZip(const char* pszZipFilePath, const char* pszFileName, unsigned long * pSize)
|
||||
{
|
||||
unsigned char * pBuffer = NULL;
|
||||
unzFile pFile = NULL;
|
||||
*pSize = 0;
|
||||
|
||||
do
|
||||
{
|
||||
CC_BREAK_IF(!pszZipFilePath || !pszFileName);
|
||||
CC_BREAK_IF(strlen(pszZipFilePath) == 0);
|
||||
|
||||
pFile = unzOpen(pszZipFilePath);
|
||||
CC_BREAK_IF(!pFile);
|
||||
|
||||
int nRet = unzLocateFile(pFile, pszFileName, 1);
|
||||
CC_BREAK_IF(UNZ_OK != nRet);
|
||||
|
||||
char szFilePathA[260];
|
||||
unz_file_info FileInfo;
|
||||
nRet = unzGetCurrentFileInfo(pFile, &FileInfo, szFilePathA, sizeof(szFilePathA), NULL, 0, NULL, 0);
|
||||
CC_BREAK_IF(UNZ_OK != nRet);
|
||||
|
||||
nRet = unzOpenCurrentFile(pFile);
|
||||
CC_BREAK_IF(UNZ_OK != nRet);
|
||||
|
||||
pBuffer = new unsigned char[FileInfo.uncompressed_size];
|
||||
int nSize = 0;
|
||||
nSize = unzReadCurrentFile(pFile, pBuffer, FileInfo.uncompressed_size);
|
||||
CCAssert(nSize == 0 || nSize == (int)FileInfo.uncompressed_size, "the file size is wrong");
|
||||
|
||||
*pSize = FileInfo.uncompressed_size;
|
||||
unzCloseCurrentFile(pFile);
|
||||
} while (0);
|
||||
|
||||
if (pFile)
|
||||
{
|
||||
unzClose(pFile);
|
||||
}
|
||||
|
||||
return pBuffer;
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ THE SOFTWARE.
|
|||
****************************************************************************/
|
||||
|
||||
#import "CCWindow.h"
|
||||
|
||||
#import "EAGLView.h"
|
||||
|
||||
@implementation CCWindow
|
||||
|
||||
|
@ -59,5 +59,23 @@ THE SOFTWARE.
|
|||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void) keyDown:(NSEvent *)event
|
||||
{
|
||||
// exit fullscreen if user pressed esc
|
||||
if([event keyCode] == 53)
|
||||
{
|
||||
EAGLView* eaglView = [EAGLView sharedEGLView];
|
||||
|
||||
// cancel full screen
|
||||
if( [eaglView isFullScreen] )
|
||||
[eaglView setFullScreen:NO];
|
||||
|
||||
// let another responder take it
|
||||
else
|
||||
[super keyDown:event];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
@ -221,6 +221,7 @@ static EAGLView *view;
|
|||
// Show the fullscreen window
|
||||
[fullScreenWindow_ makeKeyAndOrderFront:self];
|
||||
[fullScreenWindow_ makeMainWindow];
|
||||
//[fullScreenWindow_ setNextResponder:superViewGLView_];
|
||||
|
||||
} else {
|
||||
|
||||
|
@ -247,14 +248,14 @@ static EAGLView *view;
|
|||
|
||||
isFullScreen_ = fullscreen;
|
||||
|
||||
[openGLview retain]; // Retain +1
|
||||
//[openGLview retain]; // Retain +1
|
||||
|
||||
// is this necessary?
|
||||
// re-configure glView
|
||||
//cocos2d::CCDirector *director = cocos2d::CCDirector::sharedDirector();
|
||||
//director->setOpenGLView(openGLview); //[self setView:openGLview];
|
||||
|
||||
[openGLview release]; // Retain -1
|
||||
//[openGLview release]; // Retain -1
|
||||
|
||||
[openGLview setNeedsDisplay:YES];
|
||||
#else
|
||||
|
@ -269,7 +270,7 @@ static EAGLView *view;
|
|||
#define DISPATCH_EVENT(__event__, __selector__) \
|
||||
id obj = eventDelegate_; \
|
||||
[obj performSelector:__selector__ \
|
||||
onThread:[(cocos2d::CCDirectorMac*)[CCDirector sharedDirector] runningThread] \
|
||||
onThread:[(cocos2d::CCDirector*)[CCDirector sharedDirector] runningThread] \
|
||||
withObject:__event__ \
|
||||
waitUntilDone:NO];
|
||||
#endif
|
||||
|
@ -288,7 +289,7 @@ static EAGLView *view;
|
|||
float xs[1] = {0.0f};
|
||||
float ys[1] = {0.0f};
|
||||
|
||||
ids[0] = (int)theEvent;
|
||||
ids[0] = [theEvent eventNumber];
|
||||
xs[0] = x;
|
||||
ys[0] = y;
|
||||
|
||||
|
@ -312,7 +313,7 @@ static EAGLView *view;
|
|||
float xs[1] = {0.0f};
|
||||
float ys[1] = {0.0f};
|
||||
|
||||
ids[0] = (int)theEvent;
|
||||
ids[0] = [theEvent eventNumber];
|
||||
xs[0] = x;
|
||||
ys[0] = y;
|
||||
|
||||
|
@ -331,7 +332,7 @@ static EAGLView *view;
|
|||
float xs[1] = {0.0f};
|
||||
float ys[1] = {0.0f};
|
||||
|
||||
ids[0] = (int)theEvent; // index?
|
||||
ids[0] = [theEvent eventNumber];
|
||||
xs[0] = x;
|
||||
ys[0] = y;
|
||||
|
||||
|
@ -340,38 +341,49 @@ static EAGLView *view;
|
|||
|
||||
- (void)rightMouseDown:(NSEvent *)theEvent {
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
|
||||
// pass the event along to the next responder (like your NSWindow subclass)
|
||||
[super rightMouseDown:theEvent];
|
||||
}
|
||||
|
||||
- (void)rightMouseDragged:(NSEvent *)theEvent {
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
[super rightMouseDragged:theEvent];
|
||||
}
|
||||
|
||||
- (void)rightMouseUp:(NSEvent *)theEvent {
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
[super rightMouseUp:theEvent];
|
||||
}
|
||||
|
||||
- (void)otherMouseDown:(NSEvent *)theEvent {
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
[super otherMouseDown:theEvent];
|
||||
}
|
||||
|
||||
- (void)otherMouseDragged:(NSEvent *)theEvent {
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
[super otherMouseDragged:theEvent];
|
||||
}
|
||||
|
||||
- (void)otherMouseUp:(NSEvent *)theEvent {
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
[super otherMouseUp:theEvent];
|
||||
}
|
||||
|
||||
- (void)mouseEntered:(NSEvent *)theEvent {
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
[super mouseEntered:theEvent];
|
||||
}
|
||||
|
||||
- (void)mouseExited:(NSEvent *)theEvent {
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
[super mouseExited:theEvent];
|
||||
}
|
||||
|
||||
-(void) scrollWheel:(NSEvent *)theEvent {
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
[super scrollWheel:theEvent];
|
||||
}
|
||||
|
||||
#pragma mark EAGLView - Key events
|
||||
|
@ -394,11 +406,17 @@ static EAGLView *view;
|
|||
- (void)keyDown:(NSEvent *)theEvent
|
||||
{
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
|
||||
// pass the event along to the next responder (like your NSWindow subclass)
|
||||
[super keyDown:theEvent];
|
||||
}
|
||||
|
||||
- (void)keyUp:(NSEvent *)theEvent
|
||||
{
|
||||
DISPATCH_EVENT(theEvent, _cmd);
|
||||
|
||||
// pass the event along to the next responder (like your NSWindow subclass)
|
||||
[super keyUp:theEvent];
|
||||
}
|
||||
|
||||
- (void)flagsChanged:(NSEvent *)theEvent
|
||||
|
|
Loading…
Reference in New Issue