cocos2dx3.X 프로젝트 재작성 (4) 바닥, 장애물 및 충돌 검사 추가
void Stage::addGround()
{
auto g=Sprite::create();
g->setTextureRect(Rect(0,0,visible.width,15));
g->setColor(Color3B(100,100,100));
g->setPosition(visible.width/2,world_y-8.5);
this->addChild(g);
}
나는 Rect의 앞의 두 파라미터가 무엇을 하는지 모르겠다. 원본 코드는 x와 y로 쓰여 있는데 좌표의 뜻인 것 같다. 그러나 내가 설정한 값의 효과는 같다.
그나저나 피의 교훈은 부류를 계승한 후 init()에서 부류의 init를 먼저 집행해야 한다는 것이다.Block 클래스 쓰기
bool myblock::init()
{
Sprite::init();
speed = 5;
auto visible = Director::getInstance()->getVisibleSize();
/*Size s =(Size(rand()%20+5,rand()%20+5));*/
s =Size(rand()%25+10,rand()%35+5);
this->setPhysicsBody(PhysicsBody::createBox(s));
this->setTextureRect(Rect(0,0,s.width,s.height));
this->setColor(Color3B(100,100,100));
this->setPositionX(visible.width-s.width/2);
this->schedule(schedule_selector(myblock::block_run));
return true;
}
void myblock::block_run(float f)
{
this->setPositionX(this->getPosition().x-speed);
if (this->getPositionX()<0)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span> removeFromParent();
<span style="white-space:pre"> </span>}
}
블록을 왼쪽으로 쭉 가게 타이머를 넣고 Block이 화면을 떠나면 제거합니다.
그리고 Stage에 타이머를 추가하면 일정 시간 간격으로 네모난 블록이 나타나지만 타이머 함수 매개 변수 뒤에 rand()를 추가하여 시간을 만들 수 없다. 이것은 위조 랜덤수이기 때문에 나중에 인터넷에서 매우 똑똑한 방법을 찾았다.
a=0을 양보하고 b로 하여금 정해진 범위의 무작위 수를 찾게 하며 updat에서 a++를 양보하면 a>b가 장애를 생성하고 a=0을 양보하며 b로 하여금 무작위 수를 찾게 한다.이렇게 순환한다.
void Stage::restar()
{
a=0;
b=rand()%120+60;
}
void Stage::addblock(float f)
{
a++;
if(a>=b)
{
auto b=myblock::create();
this->addChild(b);
b->setPositionY(world_y+b->s.height/2);
b->getPhysicsBody()->setDynamic(false);
restar();
}
}
</pre><pre name="code" class="cpp" style="box-sizing: border-box; font-family: Arial, 'Microsoft YaHei'; font-size: 13px; white-space: pre-wrap; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); border-radius: 4px; overflow: hidden; width: 1543px; background-color: rgb(245, 245, 245);">
Block은 두 가지를 추가해야 하기 때문에 하나는 밭에 있는 것이고, 하나는 텅 비어 엎드려 있을 수밖에 없다.둘 다 무작위로 추가해야 합니다.나의 방법은 아래와 같다.
myblock.h
static myblock* create(Size s);
myblock.cpp
myblock* myblock::create(Size s)
{
myblock* bl = new myblock();
//Sprite::init();
bl->init();
bl->speed = 10;
auto visible = Director::getInstance()->getVisibleSize();
/*Size s =(Size(rand()%20+5,rand()%20+5));*/
/*i =Size(rand()%35+20,rand()%45+15);*/
bl->setPhysicsBody(PhysicsBody::createBox(s));
bl->setTextureRect(Rect(0,0,s.width,s.height));
bl->setColor(Color3B(100,100,100));
bl->setPositionX(visible.width-s.width/2+300);
bl->schedule(schedule_selector(myblock::block_run));
bl->getPhysicsBody()->setContactTestBitmask(1);
return bl;
}
Stage.cpp
void Stage::addblock(float f)
{
a++;
if(a>=b)
{
if (b>90)
{
Size s =Size(rand()%35+20,rand()%45+15);
auto bl=myblock::create(s);
this->addChild(bl);
bl->setPositionY(world_y+s.height/2);
bl->getPhysicsBody()->setDynamic(false);
restar();
}
else
{
Size s =Size(rand()%75+35,rand()%25+10);
auto bl=myblock::create(s);
this->addChild(bl);
bl->setPositionY(world_y+s.height/2+100);
bl->getPhysicsBody()->setDynamic(false);
restar();
}
}
}
충돌을 테스트하려면 먼저 Listener를 추가합니다. 이 물리 엔진은 자신의 충돌 감청을 가지고 있습니다.
auto listen = EventListenerPhysicsContact::create();
listen->onContactBegin=[&](PhysicsContact& contact)
{
log("<<<<<<<<<<<<<<");
return true;
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listen,this);
그리고 주인공과 Block류에 각각 한마디씩 채우고 충돌 검측 스위치를 켜면 모두 같은 수로 설정하면 충돌 검측이 가능하다.
->getPhysicsBody()->setContactTestBitmask(1);
그리고 죽은 동작을 람다 표현식에 추가할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.