컴퓨터 공학/Qt

[ Qt 프로그래밍 ] 초간단 컬링게임 만들기

혼새미로 2015. 11. 27. 01:46
반응형


curling2.exe


안녕하세요!

제가 Qt를 사용하여 컬링게임을 만들어보았는데요.

사실 컬링게임이라고 하기에도 민망합니다.

한 지점에서 10개의 공이 발사하고 공끼리 부딪히는 정도만 구현했습니다.

점수를 매기는 것도 아니라서 공이 10개가 모두 발사되면 유저는 아무것도 할 수 없습니다.

이 프로그램에서 제가 가장 중요하게 생각한건 공끼리 충돌하는 것인데요.

실제 물리법칙과는 많이 다르게 튕기게 됩니다.

그래도 맛보기 정도로 공이 상호작용하는 모습을 볼 수 있습니다.

 



 

위 사진과 같이 중앙에 컬링 목적지가 보입니다.

마우스 커서의 위치를 따라 선이 그려지고 선이 길수록 발사속도는 강합니다.

마우스 왼쪽버튼을 누르면 컬링 공이 발사됩니다.

시간나시는 분들은 한번 해보세요!

 

다음은 공이 충돌했을 경우의 핵심 알고리즘입니다.

 

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
void Ball::collision(int x,int y,float velX,float velY) //충돌 검사하는 함수
{
    pos=lastPos;//충돌하기 전의 위치로 되돌아감
 
    float twoBallX,twoBallY; //두 공의 위치를 빼서 방향벡터를 만듬
    twoBallX=x-pos.x();
    twoBallY=y-pos.y();
 
    MyPoint ballLine=generateUnitVector(twoBallX,twoBallY); //단위벡터로 방향만 추출
    MyPoint opVelLine=generateUnitVector(velX,velY);//단위벡터로 방향만 추출 ->안씀
    MyPoint myVelLine=generateUnitVector(velocity.x,velocity.y);//단위벡터로 방향만 추출
 
 
    //qDebug()<<"ballLine"<<ballLine.x<<","<<ballLine.y;
    //qDebug()<<"myVelLine"<<myVelLine.x<<","<<myVelLine.y;
    //qDebug()<<"opVelLine"<<opVelLine.x<<","<<opVelLine.y;
 
    float p1=ballLine.x*myVelLine.x+ballLine.y*myVelLine.y; //두공을 이은 선분의 방향단위벡터와 내공의 속도단위벡터를 내적한다
    float p2=ballLine.x*opVelLine.x+ballLine.y*opVelLine.y;//안씀
 
    if(velocity.x==0.0f&&velocity.y==0.0f) //속도가 0이면 상대방공의 속도를 그대로 물려받음
        p1=0.0f;
 
    if(p1>=1.0||p1<=-1.0//중앙에 바로 들이받으면
    {
        qDebug()<<"num1";
        velocity.x=0.0f; //내공은 멈춤
        velocity.y=0.0f;
    }
    else if(p1==0)//상대방이 나를 들이받으면
    {
        qDebug()<<"num2";
        velocity.x+=velX; //상대방의 속도를 모두 흡수함
        velocity.y+=velY;
    }
    else if(p1>0&&p1<1//비스듬하게 나를 들이받으면
    {
        qDebug()<<"num3";
        float power=sqrt(velocity.x*velocity.x+velocity.y*velocity.y);
        velocity.x=velocity.x*(1-p1);
        velocity.y=velocity.y*(1-p1);
        velocity.x-=power*ballLine.x*0.5;
        velocity.y-=power*ballLine.y*0.5;
    }
    else if(p1<0 && p1>-1)// 비스듬하게 나를 들이받으면
    {
        qDebug()<<"num4";
        float power=sqrt(velocity.x*velocity.x+velocity.y*velocity.y);
        velocity.x=velocity.x+velX*(1-p1);
        velocity.y=velocity.y+velY*(1-p1);
        velocity.x+=power*ballLine.x*0.5;
        velocity.y+=power*ballLine.y*0.5;
    }
    else //잘못된계산
    {
        qDebug()<<"num5"<<p1;
    }
 
}
cs

 

반응형