Qt Quick QML-500 줄 코드 합성 수박 게임

'큰 수박 합성'이라는 게임 은 몇 년 전에 뜨 거 웠 고 웨 이 보 검색 도 했 습 니 다.최근 에 재 미 있 었 습 니 다.그래서 작은 공 충돌 원 리 를 연 구 했 습 니 다.자신 이 직접 손 으로 부 딪 히 는 알고리즘 을 써 서 큰 수박 합성 게임 을 실 현 했 습 니 다.그리고 임의의 크기 의 게임 을 지원 합 니 다.당신 이 하고 싶 은 만큼 넓 은 면적 을 끌 고 면적 이 충분 하 다 면 열심히 하 세 요.큰 수박 100 개 라 도.하하~~~

1.게임 소개
게임 에는 모두 11 개의 과일 이 있 는데 두 개의 똑 같은 과일 을 큰 과일 로 합성 하면 큰 수박 을 합성 하면 계속 합 칠 수 없다.

그러나 블 로 거들 이 직접 쓴 게임 은 자신 도 큰 수박 을 합치 지 못 했다.

흐릿 해 보이 거나 동 영상 이 보이 지 않 으 면 바로https://www.bilibili.com/video/BV1eh411Y7uV/삐 리 삐 리 직접 보 세 요.
코드 의 논 리 는 주로 다음 과 같다.
과일 을 움 직 이 고 경계 검 사 를 통 해 과일 간 충돌 검 사 를 실시 하 며,같은 과일 두 개 라면 과일 을 합 친다.그렇지 않 으 면 작은 공이 부 딪 힌 후의 이동 방향 을 계산한다.과일 이 결승선 을 넘 쳤 는 지 판단 하고 넘 치면 모든 과일 을 깨 뜨리 고 팝 업 종료 화면 을 통 해 다음 판 을 기다린다.
과일 충돌 계산 은 안에 비교적 복잡 하기 때문에 제 가 다음 에 여러분 께 작은 공 충돌 알고리즘 을 설명 하기 전에 우 리 는 먼저 이전에 배 웠 던 벡터 를 복습 하 겠 습 니 다.
2.벡터 소개
우 리 는 다음 과 같은 양 을 예 로 들 자.

그러면 이때 의 벡터 는 바로 그들의 내용 은(B.x-A.x,B.y-A.y)이다.우리 가 벡터 에 대해 절대 치 를 취 할 때 A 좌표 에서 B 좌표 까지 의 길 이 를 구 하 는 것 이다.즉,:
사선 길이=

3.단위 벡터
단위 벡터 는 길이 가 1 인 벡터 입 니까?아니면 이 벡터 를 예 로 들 면(길이 가 C 입 니까):

단위 벡터 를 가 져 오 려 면 다음 과 같은 내용 을 가 져 옵 니 다.(B.x-A.x)/C,(B.y-A.y)/C)
그래서 단위 벡터 는 1 이다.
4.벡터 와 단위 벡터 점 승
벡터 와 단위 벡터 점 승 은 벡터 가 단위 벡터 에 있 는 투영 을 얻 는 데 쓰 인 다.
먼저 벡터 와 벡터 점 곱 의 공식 은 다음 과 같다.

그 중에서벡터 와벡터 간 의 협각 이다.
만약이 단위 벡터 라면 절대 치 는 1 과 같다.
그래서:
$\vec{a}* \vec{b} = \left | \vec{a} \right | cos\theta$
마지막 으로 다음 그림 과 같다.

빨간색 선 은 길 이 를 나타 낸다.우 리 는 내 려 다 보 는 그림 을 보면 빨간색 선 은 바로 벡터 방향 에 있 는 투영 이 아 닙 니까?
만약 에 두 벡터 가 마무리 로 연결 된다 면각 도 는 단위 벡터 가 생 긴 후의 각도 이다.다음 그림 과 같다.

결론 을 얻다.
  • 협각 이 둔각 이 라면마이너스 다.(단위 벡터 의 반대 방향)
  • 협각 이 예각 이 라면양수(단위 벡터 의 정방 향)
  • 5.작은 공이 부 딪 히 는 광경
  • 두 개의 작은 공이 부 딪 혀 서 접선 의 속 도 는 모두 서로 평행 이 고 작용력 이 없다(아래 그림 참조).
  • 연심 선 은 서로 부 딪 힌 다(아래 그림 참조).작용력 이 있 기 때문에 우 리 는 공 1 과 공 2 의 연심 선 방향 에서 의 속도 만 요구 해 야 한다.
  • 그 다음 에 운동량 의 보존 법칙 과 기계 에너지 의 보존 법칙 에 따라 부 딪 힌 공의 1 과 공 2 의 연결선 방향 을 구한다.
  • 마지막 에 서로 접선 에서 의 속 도 를 더 하면 각자 충돌 후의 x 속도,y 속 도 를 얻 을 수 있다.
  • 충돌 하기 전에 다음 그림 과 같다.
  • v1n 과 v1t:공 1 이 연심 선 방향 과 접선 방향 에서 의 투영 속도
  • v2n 과 v2t:공 2 가 연심 선 방향 과 접선 방향 에서 의 투영 속도
  • v1:공 1 의 속도 방향 은 v1n+v1t
  • 와 같다.
  • v2:공 2 의 속도 방향 은 v2n+v2t
  • 와 같다.
    5.1 v1n 과 v2n 가 져 오기
    이전에 우 리 는 벡터와 단위 벡터점 승 은 벡터 가 단위 벡터 에 있 는 투영 을 얻 는 데 사용 된다 는 것 을 증명 한 적 이 있다.
    그래서 코드 는 다음 과 같다.
    
    let distance = Math.sqrt(Math.pow((ball1.pointX - ball2.pointX),2) + Math.pow((ball1.pointY - ball2.pointY),2));
    let radius = ball1.r + ball2.r;
    let dx = ball1.pointX - ball2.pointX
    let dy = ball1.pointY - ball2.pointY
    
    let ex = dx / radius;
    let ey = dy / radius;       //           (ex,ey) 
    
    let v1n = ex * ball1.vx + ey * ball1.vy   
    let v2n = ex * ball2.vx + ey * ball2.vy
    5.2 충돌 후의 속도 방향 계산
    우선 충돌 을 살 펴 본 후 다음 그림 과 같다.
  • v1':공 1 이 부 딪 힌 후의 속도 방향 은 v1n'+v1t
  • 와 같다.
  • v2':공 2 가 부 딪 힌 후의 속도 방향 은 v2n'+v2t
  • 와 같다.
  • v1n'과 v2n':두 개의 작은 공이 부 딪 힌 후의 투영 속도
  • 만약 에 이 두 개의 작은 공이 똑 같이 크다 면 v1n 과 v2n 의 수 치 는:
    v1n' = v2n
    v2n' = v1n
    그리고 동량 보존의 법칙 과 기계 에너지 보존의 법칙 에 따라
  • v1 과 v2:두 개의 작은 공이 부 딪 히 기 전 속도.
  • m1 과 m2:두 개의 작은 공의 질량
  • v1'과 v2':두 개의 작은 공이 부 딪 힌 후 속도
  • 그래서 최종 충돌 함수 코드 는 다음 과 같다.
    
    let distance = Math.sqrt(Math.pow((ball1.pointX - ball2.pointX),2) + Math.pow((ball1.pointY - ball2.pointY),2));
        let radius = ball1.r + ball2.r;
        let dx = ball1.pointX - ball2.pointX
    
        let dy = ball1.pointY - ball2.pointY
    
        let ex = dx / radius; let ey = dy / radius;       //           (ex,ey)  (         1    )
    
        let v1n = ex * ball1.vx + ey * ball1.vy           
        let v2n = ex * ball2.vx + ey * ball2.vy
        if(v1n >= v2n)  return;                      //           ,           
        let v1nn = ball1.cor * ((ball1.mass - ball2.mass) * v1n + 2 *ball2.mass *v2n ) / (ball1.mass +ball2.mass)  //      
        let v2nn = ball2.cor * ((ball2.mass - ball1.mass) * v2n + 2 *ball1.mass *v1n ) / (ball1.mass +ball2.mass)
     
        let ux = -dy / radius; let uy = dx / radius;       
        let v1t =ux * ball1.vx + uy*ball1.vy        
        let v2t = ux * ball2.vx + uy * ball2.vy
    
        ball1.vx = v1nn*ex +v1t*ux;       
        ball1.vy = v1nn*ex +v1t*uy;
    
        ball2.vx = v2nn*ex +v2t*ux;
       ball2.vy = v2nn*ex +v2t*uy;
    6.작은 공이 어깨 를 스 쳐 지나 가 는 모습
    먼저 다음 두 개의 작은 공이 평행 으로 이동 하 는 장면 도 를 살 펴 보 자.

    만약 에 공 1 과 공 2 가 평행 으로 이동한다 면 그들 과 연결선 의 협각 은 마침 90°이 고 v1n 과 v2n 은 모두 0 이다.
    만약 에 공 1 의 협각 이 공 2 의 협각 보다 크 면 충돌 이 생 길 것 이다.다음 그림 과 같다.

    점선 화살표 속도 방향 은 공 1 의 협각 이 공 2 의 협각 보다 클 때 장면 을 나타 낸다.
    한편,cos 의 수치 채취 방식 은 0~180°일 때 각도 가 클 수록 값 이 작 기 때문에 v1n>=v2n 일 때 부 딪 히 지 않 습 니 다.
    7.작은 공이 모든 작은 공의 바로 위 에 내 려 오 는 모습
    효과 도 는 다음 과 같다.

    이때 작은 공 은 접선 의 속도 방향 이 없 기 때문에 중력 가속도 에서 작은 공 들 을 천천히 쌓 아 게임 이 끝난다.
    그래서 우 리 는 충돌 후 말미 에 다음 과 같은 판단 을 추가 해 야 한다.
    
    if (v1n == 0 && v1t ==0 && v2t == 0) {      //  v1n 0,    1    , v1t v2t 0,   1  2          , 2   1    ,      2  vx   ,        
    
            ball2.vx += 0.1
    
     }
    수정 후 효과 그림 아래:

    전체 충돌 알고리즘 이 실현 되면 완 성 됩 니 다.다른 논 리 는 매우 조롱박 을 그 려 서 실현 하면 됩 니 다.코드 는 아직 업로드 중 입 니 다.여러분 이 또 어떤 작은 게임 을 실현 하고 싶 으 시 면 저 에 게 메 시 지 를 남 겨 주 십시오.관심 이 있 으 시 면 제 가 하 나 를 훑 어 보 겠 습 니 다.
    다음은 Qt Quick QML-500 줄 코드 구현 에 대한 상세 한 내용 입 니 다.Qt Quick QML-500 줄 코드 구현'수박 합성 게임'에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 해 주 십시오!

    좋은 웹페이지 즐겨찾기