[cocos2d-x 3.6] 포코팡류 게임 만들기~! (3) 드래그 이벤트

     




드래그 이벤트는 onTouchesMoved 메소드를 이용합니다.


onTouchesMoved는 터치가 지속되면서 이동될때마다 호출되는 메소드입니다. 따라서 여기에 코드를 입력하면 드래그 할 때마다 실행됩니다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void HelloWorld::onTouchesMoved(Touch* touch, Event* event)
{
    Point touchLocation = touch->getLocation();
    
    for(GameBall*ball : balls){
        if(ball->getBoundingBox().containsPoint(touchLocation)){
            if(ball->isVisible()==true && ball->getState() == GameBall::LIVE){
                ball->setState(GameBall::DEAD);
                ball->setVisible(false);
            }
            
        }
        
    }
    CCLOG("%f,%f",touchLocation.x,touchLocation.y);
}
 
void HelloWorld::onTouchesEnded(Touch* touch, Event* event)
{
    for(GameBall*ball : balls){
        ball->setState(GameBall::LIVE);
        ball->setVisible(true);
    }
}
 
cs


코드는 위와 같습니다. for문을 사용해 전체 볼들을 체크하면서 터치가 움직이는 경로에 있는 볼들의 상태를 변경합니다. 하지만 전부 안보이게 하면 나중에 볼이 하나도 없어지니까... TouchesEnded에 초기화를 붙입니다. TouchesEnded는 터치가 끝났을 때 자동으로 호출되는 메소드입니다. 이곳에다가 볼 전부를 다시 보이게 하는 코드를 추가합니다.


사실 처음에는 볼과 볼 사이의 간격을 계산해서 드래그하려고 했지만. 생각해보면... 드래그중에는 멀리있는 공을 선택하지 않기 때문에 계산하지 않아도 되더라구요^^;;


다음은 같은 볼끼리만 선택되도록 옵션을 주는 것입니다. 다른 타입의 볼이 드래그된다면 게임이 진행이 안되겠죠?

같은 타입의 볼인지 확인하기 위해서는 이전에 설정한 Type값이 필요합니다. Type을 1~4의 값으로 랜덤하게 주었기 때문에 처음선택한 공의 타입과 드래그하는 공들의 타입이 같으면 OK, 아니면 그냥 아무일도 일어나지 않게하면 됩니다.


따라서 터치를 처음 시작했을때의 볼의 타입과 터치가 이동중일때의 볼의 타입을 비교하는 비교문을 추가합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
void HelloWorld::onTouchesMoved(Touch* touch, Event* event)
{
    Point touchLocation = touch->getLocation();
    
    for(GameBall*ball : balls){
        if(ball->getBoundingBox().containsPoint(touchLocation)){
            if(ball->isVisible()==true && ball->getState() == GameBall::LIVE 
                && ball->getType() == currentGameBall->getType()){
                ball->setState(GameBall::DEAD);
                ball->setVisible(false);
            }
            
        }
        
    }
    CCLOG("%f,%f",touchLocation.x,touchLocation.y);
}
 
cs


추가한 것은 안에 if문에서 ball->getType()과 currentGameBall->getType()이 같은지 비교하는 문장입니다. currentGameBall의 경우 onTouchesBegan에 명시되어 있고, getType()메소드는 이전에 설명했듯이 ball.h에서 선언 후 만들어지는 메소드입니다. 이렇게 처음 터치했을때의 볼의 타입과 앞으로의 타입을 비교하면서 볼을 선택할 수 있습니다.


단, 이렇게 만들고 실행 할 경우 문제점이 하나 발견됩니다. 터치를 계속 하고 있으면 멀리 떨어져있는 볼이 같은 볼일 경우 같이 선택되는 경우가 생깁니다. 따라서 어쩔 수 없이 볼과 볼 사이의 거리를 계산하는 코드가 필요할 것 같습니다 ^^

반응형

댓글

Designed by JB FACTORY