[나무 Cocos2d - x 014] 게임 인 스 턴 스 - 제작 튜 토리 얼 (6 편) - 장애물 추가
멍청 한 나무 가 심혈 을 기울 여 공헌 하 다 니, 뭐라고?바람기아 닙 니 다. 심혈 을 기울 이 고 있 습 니 다.http://blog.csdn.net/musicvs/article/details/8197262
본문:
주: 본 논문 에서 사용 한 자원 은 여기 서 다운로드 하 십시오.http://download.csdn.net/detail/musicvs/4769412
어 머, 이 게임 너무 재 밌 어 요. 너무 재 밌 어 요.
이번 에는 우리 지도 에 장애물 을 추가 합 시다 ~ 재 미 있 습 니 다. 같이 오 세 요 ~
1. 저희 Tiled Map Editor 다시 켜 주세요.
우 리 는 level 01. tmx 파일 을 열 어야 합 니 다. 먼저 그림 층 을 새로 만 들 고 barrier 라 고 부 릅 니 다. 즉, 우리 의 장애 층 입 니 다.
그리고 새로운 소 재 를 소개 하 겠 습 니 다. metatiles.png:
objects. png 와 metatiles. png 는 모두 그림 블록 에 넣 고 너비 와 높이 는 모두 32 픽 셀 입 니 다.
2. 장애물 을 첨가 하 다
자, 이제 우 리 는 아래 소 재 를 이용 하여 지도의 barrier 층 에 몇 획 을 그 려 장애물 을 증가 시 킵 니 다.
다음은 내 가 그린 거 야. 너무 예 뻐 ~ (아 이상 하 다!):
3. 장애물 을 진정 으로 장애물 로 만들어 라!
장애 층 이 라 고 생각 하지 마 세 요. 그러면 주인공 의 전진 을 막 을 수 있 습 니 다. 주인공 은 지금 처럼 이런 '장애물' 을 순조롭게 통과 할 수 있 습 니 다. 우 리 는 meta 라 는 층 을 새로 만들어 야 합 니 다.
그리고 그림 블록 에 있 는 빨간색 사각형 을 선택 하 십시오:
그 다음 에 오른쪽 단 추 를 누 르 면 '그림 블록 속성' 은 그림 블록 에 새로운 속성 을 만 듭 니 다. Collidable 이 라 고 하 는데 값 은 true 입 니 다.
예, 우 리 는 이 속성 을 이용 하여 장애물 인지 아 닌 지 를 판단 할 것 입 니 다.
지금 우 리 는 빨간색 사각형 으로 meta 층 에 물건 을 그 려 야 합 니 다. 어떻게 그 려 야 합 니까?모든 장애물 을 채 우 고 기억 하 세 요. meta 층 에 그 려 져 있 습 니 다.
효 과 를 보 세 요. 빨간색 이 많아 요. 하하:
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 인지 확인 하 세 요. 그러면 주인공 을 전진 시 키 지 않 습 니 다.봐 라, 주인공 이 저 크 고 사나 운 나무 에 가 려 져 서 전진 할 수 없다 ~
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, 이번 편 이 끝 났 습 니 다. 다음 편 은 승리 의 판단 조건 과 주인공 이 먹 을 수 있 는 것 을 넣 겠 습 니 다. 너무 멋 있 습 니 다 ~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDOJ/HDU 1113 Word Amalgamation (사전 순서 ~ 지도)a dictionary, which consists of at least one and at most 100 words, one per line; a line containing XXXXXX, which signal...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.