mark。学习啦
th sdg dsg df gd fg df gdf g dfgdf
啊啊啊啊啊啊啊啊啊啊啊啊
正在一步步看代码理解代码和实现,谢谢楼主
这一章报错了 同18- -
马。。。好贴慢慢学习
我这边都没报错,但是就是吃不到layer.
void HelloWorld::setPlayerPosition(Point position)
{
Point tileCoord = this->tileCoordForPosition(position);
int tileGid = _blockage->getTileGIDAt(tileCoord);
if (tileGid) {
auto properties = _tileMap->getPropertiesForGID(tileGid).asValueMap();
if (!properties.empty()) {
auto collision = properties"blockage"].asString();
if ("true" == collision) {
return;
}
auto collect = properties"collectable"].asString();
if ("ture" == collect) {
_blockage->removeTileAt(tileCoord);
_foreground->removeTileAt(tileCoord);
}
}
}
_player->setPosition(position);
}
楼主,我做红色碰撞的时候运行没问题,一点击移动就报错,能抽空帮我看看不?
代码是这样的:
bool HelloWorld::init()
{
if(!Layer::init()){
return false;
}
std::string file=“1.tmx”;
auto str=String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename(file.c_str()).c_str());
_tileMap = TMXTiledMap::createWithXML(str->getCString(),"");
_background = _tileMap->layerNamed(“background”);
this->addChild(_tileMap,-1);
TMXObjectGroup *objects=_tileMap->getObjectGroup("Player");
CCASSERT(NULL!=objects,"'Player' object group not found");
auto player=objects->getObject("player");
CCASSERT(!player.empty(),"player object not found");
_blockage = _tileMap->layerNamed("blockage01");
_blockage->setVisible(false);
int x=player"x"].asInt();
int y=player"y"].asInt();
_player=Sprite::create("029.png");
_player->setPosition(x+_tileMap->getTileSize().width/2,y+_tileMap->getTileSize().height/2);
_player->setScale(0.5);
addChild(_player);
setViewPointCenter(_player->getPosition());
auto listener=EventListenerTouchOneByOne::create();
listener->onTouchBegan=&](Touch *touch,Event *event)->bool{
return true;
};
listener->onTouchEnded=CC_CALLBACK_2(HelloWorld::onTouchEnded,this);
this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
return true;
}
void HelloWorld::onTouchEnded(Touch *touch, Event *unused_event){
auto actionTo1=RotateTo::create(0,0,180);
auto actionTo2=RotateTo::create(0,0,0);
auto touchLocation=touch->getLocation();
touchLocation=this->convertToNodeSpace(touchLocation);
auto playerPos=_player->getPosition();
auto diff=touchLocation-playerPos;
if(abs(diff.x)>abs(diff.y)){
if (diff.x>0)
{
playerPos.x+=_tileMap->getTileSize().width/2;
_player->runAction(actionTo2);
}else{
playerPos.x-=_tileMap->getTileSize().width/2;
_player->runAction(actionTo1);
}
}else{
if (diff.y>0)
{
playerPos.y+=_tileMap->getTileSize().height/2;
}else{
playerPos.y-=_tileMap->getTileSize().height/2;
}
}
if (playerPos.x<=(_tileMap->getMapSize().width *_tileMap->getMapSize().width)&&
playerPos.y<=(_tileMap->getMapSize().height *_tileMap->getMapSize().height)&&
playerPos.x>=0&&playerPos.y>=0)
{
this->setPlayerPosition(playerPos);
}
this->setViewPointCenter(_player->getPosition());
}
void HelloWorld::setPlayerPosition(Point position){
Point tileCoord=this->tileCoordForPosition(position);
int tileGid=_blockage->getTileGIDAt(tileCoord);
if(tileGid)
{
auto properties=_tileMap->getPropertiesForGID(tileGid).asValueMap();
if (!properties.empty()){
auto collision=properties"Blockage"].asString();
if ("true"==collision)
{
return;
}
}
}
_player->setPosition(position);
}
void HelloWorld::setViewPointCenter(Point position){
auto winSize=Director::getInstance()->getWinSize();
int x=MAX(position.x,winSize.width/2);
int y=MAX(position.y,winSize.height/2);
x=MIN(x,_tileMap->getMapSize().width * _tileMap->getMapSize().width -winSize.width/2);
y=MIN(y,_tileMap->getMapSize().height*_tileMap->getMapSize().height -winSize.height/2);
auto actualPosition=Point(x,y);
auto centerOfView=Point(winSize.width/2,winSize.height/2);
auto viewPoint=centerOfView-actualPosition;
this->setPosition(viewPoint);
}
Point HelloWorld::tileCoordForPosition(cocos2d::Point position){
int x=position.x / _tileMap->getTileSize().width;
int y=((_tileMap->getTileSize().height * _tileMap->getTileSize().height)-position.y)/_tileMap->getTileSize().height;
return Point(x,y);
}
这是错误信息:
Assert failed: TMXLayer: invalid position
Assertion failed!
Program: …work\Game2048\proj.win32\Debug.win32\firstgame.exe
File: CCTMXLayer.cpp
Line: 347
Expression: pos.x < _layerSize.width && pos.y < _layerSize.height && pos.x >=0 && pos.y >=0
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts
学习了 谢谢!:867:
在x-code中图片资源是可以直接查看的
vs2012中 怎么查看tmx里面类似xml 的内容
还有资源名字 记不住我只能到resource文件夹中去看
收藏


兄台,你很牛逼啊~ 按照你的修改了 OK 了,现在只剩下 在下方碰撞的监测得到,但是移动不了了,无论点击上面还是哪里~
_mapbg = TMXTiledMap::create("gamemap/partmap.tmx");
_blockage = _mapbg->layerNamed("Background");
this->addChild(_mapbg,0);
//加载对象层
TMXObjectGroup* objGroup = _mapbg->objectGroupNamed("obj");
ValueMap heroInfo = objGroup->getObject("playerPoint");
float x = heroInfo"x"].asFloat();
float y = heroInfo"y"].asFloat();
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = (Touch *touch, Event *event){
auto touchLocation = touch->getLocation();
touchLocation = this->convertToNodeSpace(touchLocation);
Point desiredTileCoord = tileCoordForPosition(_player->getPosition());
auto playerPos = _player->getPosition();
playerPos = playerPos * Director::getInstance()->getContentScaleFactor();
auto diff = touchLocation - playerPos;
if (abs(diff.x) > abs(diff.y)) {
if (diff.x > 0) {
playerPos.x += _mapbg->getTileSize().width;
// _player->runAction(actionTo2);
}
else {
playerPos.x -= _mapbg->getTileSize().width;
// _player->runAction(actionTo1);
}
}
else {
if (diff.y > 0) {
playerPos.y += _mapbg->getTileSize().height;
}
else {
playerPos.y -= _mapbg->getTileSize().height;
}
}
if (playerPos.x <= (_mapbg->getMapSize().width * _mapbg->getMapSize().width) &&
playerPos.y <= (_mapbg->getMapSize().height * _mapbg->getMapSize().height) &&
playerPos.y >= 0 &&
playerPos.x >= 0)
{
setPlayerPosition(playerPos/Director::getInstance()->getContentScaleFactor());
}
this->setViewpointCenter(_player->getPosition());
return true;
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
void GameMapLayer::setPlayerPosition(Point position)
{
Point tileCoord = this->tileCoordForPosition(position);
int tileGid = _blockage->getTileGIDAt(tileCoord);
if (tileGid) {
auto properties = _mapbg->getPropertiesForGID(tileGid).asValueMap();
auto collision = properties"Blockage"].asString();
if (!properties.empty()) {
if ("True" == collision) {
return;
}
}
}
_player->setPosition(position);
}
为什么我红色碰撞碰不到 只能移动