需求与思路
项目上线前有一个需求
游戏资源需要存放在cdn上
而游戏入口一般是通过运营渠道的服务器进入(服务器A)
玩家需要通过服务器A的游戏页面请求资源服务器B的游戏资源
这样就产生了跨域问题
(版本ccc1.3.3)转载请注明原文地址
具体来说问题可能有以下两个
1.浏览器跨域(本文解决)
2.WebGL模式禁止跨域(没有遇到,可能是引擎避开了这个问题)
网页技术处理跨域问题有多种解决方案
这里通过修改服务端响应头header
eg:
//任意ip均不受跨域限制
header('Access-Control-Allow-Origin:');
//指定IP如服务器A不受跨域限制
header('Access-Control-Allow-Origin: http(s)://yourdomain(or IP):port');
原理和思路大概就这么多
实现起来要小费一番周折
一方面要搭建服务器模拟资源服务器
另一方面要修改Creator引擎js源码
NodeJS搭建资源服务器
下载NodeJS并安装express
编写服务端程序代码如下
var express = require('express');
var app = express();
app.use(express.static('public'));
// 设置跨域头部
app.all('', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
// 主页输出 "Hello World"
app.get('/', function (req, res) {
console.log("主页 GET 请求");
res.send('Hello GET');
})
// 返回图片
app.get('/image', function(req, res) {
res.sendfile(__dirname + '/runoob-logo.png');
})
// 启动服务
var server = app.listen(3000, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 ", (new Date()).toLocaleString(), port)
})
命令行中键入node 【路...径】app.js 启动服务程序
打开浏览器后,即如上图所示
修改图片下载模块
首先找到下载模块
engine/cocos2d/core/load-pipeline/downloader.js
function downloadImage(item, callback, isCrossOrigin, img) {
void 0 === isCrossOrigin (isCrossOrigin = true);
var url = urlAppendTimestamp(item.url);
img = img || new Image();
isCrossOrigin "file:" !== window.location.protocol ? img.crossOrigin = "anonymous" : img.crossOrigin = null;
if (img.complete img.naturalWidth > 0 img.src === url) {
callback(null, img);
} else {
function loadCallback() {
img.removeEventListener("load", loadCallback);
img.removeEventListener("error", errorCallback);
callback(null, img);
}
function errorCallback() {
img.removeEventListener("load", loadCallback);
img.removeEventListener("error", errorCallback);
"https:" !== window.location.protocol img.crossOrigin "anonymous" === img.crossOrigin.toLowerCase() ? downloadImage(item, callback, false, img) : callback("Load image (" + url + ") failed");
}
img.addEventListener("load", loadCallback);
img.addEventListener("error", errorCallback);
//img.src = url;
if(url.indexOf("testSprite") >= 0)
url = ""
img.src = url;
cc.log("test3 downloadImage" , url)
}//代码效果参考:http://www.ezhiqi.com/bx/art_5391.html
}
if(url.indexOf("testSprite") >= 0)