[나무 Cocos2d - x 014] 게임 인 스 턴 스 - 제작 튜 토리 얼 (6 편) - 장애물 추가

Cocos2d - x 게임 인 스 턴 스 - 제작 튜 토리 얼 (6 편) - 장애물 추가
 
멍청 한 나무 가 심혈 을 기울 여 공헌 하 다 니, 뭐라고?바람기아 닙 니 다. 심혈 을 기울 이 고 있 습 니 다.http://blog.csdn.net/musicvs/article/details/8197262
 
본문:
 
주: 본 논문 에서 사용 한 자원 은 여기 서 다운로드 하 십시오.http://download.csdn.net/detail/musicvs/4769412
 
 어 머, 이 게임 너무 재 밌 어 요. 너무 재 밌 어 요.
이번 에는 우리 지도 에 장애물 을 추가 합 시다 ~ 재 미 있 습 니 다. 같이 오 세 요 ~
 
1.       저희 Tiled Map Editor 다시 켜 주세요.
우 리 는 level 01. tmx 파일 을 열 어야 합 니 다. 먼저 그림 층 을 새로 만 들 고 barrier 라 고 부 릅 니 다. 즉, 우리 의 장애 층 입 니 다.
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第1张图片
그리고 새로운 소 재 를 소개 하 겠 습 니 다. metatiles.png:
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第2张图片
objects. png 와 metatiles. png 는 모두 그림 블록 에 넣 고 너비 와 높이 는 모두 32 픽 셀 입 니 다.
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第3张图片
 
2.       장애물 을 첨가 하 다
자, 이제 우 리 는 아래 소 재 를 이용 하여 지도의 barrier 층 에 몇 획 을 그 려 장애물 을 증가 시 킵 니 다.
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第4张图片
 
다음은 내 가 그린 거 야. 너무 예 뻐 ~ (아 이상 하 다!):
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第5张图片
 
3.       장애물 을 진정 으로 장애물 로 만들어 라!
장애 층 이 라 고 생각 하지 마 세 요. 그러면 주인공 의 전진 을 막 을 수 있 습 니 다. 주인공 은 지금 처럼 이런 '장애물' 을 순조롭게 통과 할 수 있 습 니 다. 우 리 는 meta 라 는 층 을 새로 만들어 야 합 니 다.
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第6张图片
그리고 그림 블록 에 있 는 빨간색 사각형 을 선택 하 십시오:
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第7张图片
그 다음 에 오른쪽 단 추 를 누 르 면 '그림 블록 속성' 은 그림 블록 에 새로운 속성 을 만 듭 니 다. Collidable 이 라 고 하 는데 값 은 true 입 니 다.
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第8张图片
예, 우 리 는 이 속성 을 이용 하여 장애물 인지 아 닌 지 를 판단 할 것 입 니 다.
지금 우 리 는 빨간색 사각형 으로 meta 층 에 물건 을 그 려 야 합 니 다. 어떻게 그 려 야 합 니까?모든 장애물 을 채 우 고 기억 하 세 요. meta 층 에 그 려 져 있 습 니 다.
효 과 를 보 세 요. 빨간색 이 많아 요. 하하:
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第9张图片
OK, 지 도 를 저장 하고 코드 에 초점 을 맞 춥 니 다.
 
4.       그림 블록 속성 을 통 해 통행 가능 여 부 를 판단 합 니 다.
여러분, 저 는 또 고 치 겠 습 니 다. Player 의 CCTMXTiledMap * map 멤버 변 수 를 Entity 에 넣 고 함수 tileCordForPosition 을 추가 하 겠 습 니 다.
#ifndef __ENTITY_H__
#define __ENTITY_H__

#include "cocos2d.h"
#include "Controller.h"
#include "ControllerListener.h"

using namespace cocos2d;

class Entity : public CCNode, public ControllerListener {
public:
    void setSprite(CCSprite* mSprite);
    void setController(Controller* controller);

    /*   SimpleMoveListener      */
    virtual void setSimplePosition(int x, int y);
    virtual CCPoint getCurPosition();
protected:
    CCSprite* mSprite;
Controller* mController;

/* map    Player  ,         */
CCTMXTiledMap* map;

/*          */
CCTMXLayer* meta;   

    /*               */
    CCPoint tileCoordForPosition(CCPoint pos);
};

#endif

 
tile CoordForPosition 은 뭐 하 는 거 예요?그것 은 픽 셀 좌 표를 지도 에 해당 하 는 칸 으로 바 꾸 는 데 쓰 인 다.
CCPoint Entity::tileCoordForPosition( CCPoint pos )
{
    CCSize mapTiledNum = map->getMapSize();
    CCSize tiledSize = map->getTileSize();

    float x = pos.x / tiledSize.width;
    float y = pos.y / tiledSize.height;

    /* Cocos2d-x   Y        ,           */
    y = mapTiledNum.height - y;

    return ccp(x, y);
}

 
방금 여러분 들 이 분명히 발 견 했 을 거 예요. 저희 가 CCTMXLayer * meta 가 하나 더 생 겼 어 요. 이게 뭐 예요?meta 는 우리 가 방금 지도 에 추가 한 그림 이 아 닙 니까?이 그림 층 위 에 우 리 는 빨간색 칸 을 많이 그 렸 고 우 리 는 이 빨간색 칸 에 Collidable 속성 을 추가 했다.
알 아 맞 혀 주 셔 야 할 것 같 아 요. 주인공 이 갈 곳 이 빨간색 칸 에 있 는 지 아 닌 지 판단 만 하면 돼 요. 가 려 는 곳 이 빨간색 칸 의 위치 라면 주인공 이 움 직 이지 못 하 게 해 주세요 ~ 와, 간단 하다 ~
 
5.       주인공 의 행동 을 제한 하기 시작 하 다
이제 Player. cpp 류 의 initWith TiledMap 함 수 를 열 고 이 코드 를 처음부터 추가 하 십시오.
/*   meta  */
    meta = map->layerNamed("meta");
meta->setVisible(false);

 
OK, 마지막 으로 Player. cpp 의 setSimple Position 함 수 를 수정 하고 맨 앞 에 다음 과 같은 코드 를 추가 합 니 다.
/* -----------------        ---------------- */
/*                 */
CCPoint tiledPos = tileCoordForPosition(ccp(x, y));

    /*             */
    int tiledGid = meta->tileGIDAt(tiledPos);

    /*   0,         */
    if(tiledGid != 0) {
        /* 
                        ,        Collidable  ,
                 meta  ,            ,             ,
                          。
        */        
CCDictionary* propertiesDict = map->propertiesForGID(tiledGid);

        /*      Collidable    */
        const CCString* prop = propertiesDict->valueForKey("Collidable");

        /*   Collidable     true,   ,       */
        if(prop->m_sString.compare("true") == 0) {
            return;
        }
    }

 
좋 습 니 다. 코드 에 대한 설명 이 상세 하 다 고 생각 합 니 다. 먼저 meta 층 에서 특정한 지도 칸 (어떤 것? 크 크, 바로 우리 주인공 이 현재 있 는 지도 칸 위치) 이 지도 에서 의 유일한 표 지 를 얻 었 습 니 다.그리고 이 유일한 표지 에 따라 지도 에서 칸 의 모든 속성 을 얻 을 수 있 습 니 다.
질문 이 있 습 니 다. 왜 meta 에서 유일한 표 지 를 얻 으 려 고 합 니까? 직접 구조 격자 위치 가 아니 라 지도 에서 격자 의 속성 을 얻 으 려 고 합 니까?왜냐하면 지도 에 여러 개의 그림 이 있 기 때 문 입 니 다. 제 가 당신 의 이 격자 위치 가 그 층 의 위치 라 는 것 을 어떻게 압 니까?첫 번 째 줄 세 번 째 줄 의 그 칸 을 원한 다 고? 어 머, 저 는 ground 그림 층 이 있 습 니 다. meta 그림 층 이 있 습 니 다. 어느 것 을 원 하 십 니까?아뿔싸, 내 가 너무 몰입 해서 실수 로 1 인칭 을 썼 다.그 러 니까 프로그램 을 혼 란 스 럽 게 하지 마 세 요. 그렇지 않 으 면 더 혼 란 스 러 워 요 ~!
마지막 으로 당연히 칸 을 얻 은 Collidable 속성 입 니 다. 이 속성의 값 이 true 인지 확인 하 세 요. 그러면 주인공 을 전진 시 키 지 않 습 니 다.봐 라, 주인공 이 저 크 고 사나 운 나무 에 가 려 져 서 전진 할 수 없다 ~
【木头Cocos2d-x 014】游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物_第10张图片
 
6.       카드 사 문 제 를 해결 하 다
우 리 는 확실히 주인공 을 꽉 잡 고 그 를 전진 시 키 지 못 하 게 한다. 그러나 우 리 는 이 카드 가 주인공 을 영원히 멈 추 게 하고 그 는 더 이상 이동 할 수 없다 는 것 을 알 게 될 것 이다 ~!야 단 났 어.괜찮아, 우리 뭐 좀 넣 으 면 돼.장애물 을 만 났 을 때 주인공 이 전진 을 멈 추 게 하 는 것 이 아니 라 주인공 을 픽 셀 로 후퇴 시 키 는 것 이다.
/*   Collidable     true,   ,       */        if(prop->m_sString.compare("true") == 0) {
            if(x > 0) {
                x -= 1;
            }
            else {
                x += 1;
            }

            if(y > 0) {
                y -= 1;
            }
            else {
                y += 1;
            }
        }

 
우 리 는 setSimple Position 의 작은 부분 을 수 정 했 습 니 다. Collidable 속성의 값 이 true 일 때 우 리 는 직접 return 하지 않 고 주인공 이 약간 반대 방향 으로 픽 셀 을 이동 하 게 합 니 다. 그러면 주인공 은 영원히 움 직 이지 않 을 것 입 니 다.
 
OK, 이번 편 이 끝 났 습 니 다. 다음 편 은 승리 의 판단 조건 과 주인공 이 먹 을 수 있 는 것 을 넣 겠 습 니 다. 너무 멋 있 습 니 다 ~

좋은 웹페이지 즐겨찾기