문제

나는 C ++를 처음 접했고 아무것도하지 않는 작은 게임 프로그램에서 충돌을 연습하고 있으며 충돌을 제대로 얻을 수 없습니다.

그래서 변수에로드 된 이미지를 사용합니다

background = oslLoadImageFile("background.png", OSL_IN_RAM, OSL_PF_5551);
sprite = oslLoadImageFile("sprite.png", OSL_IN_RAM, OSL_PF_5551);
bush = oslLoadImageFile("bush.png", OSL_IN_RAM, OSL_PF_5551);

변수가 저장되어 있지만

sprite->x = 3;

if ( (sprite->x + spritewidth > bush->x) && (sprite->x < bush->x + bushwidth) && (sprite->y + spriteheight > bush->y) && (sprite->y < bush->y + bushheight) ) 
{
         bushcol = 1;               
}
else
{
        bushcol = 0;      
}

그래서 버튼을 누를 때

if (osl_keys->held.down)
{
if (bushcol == 1) 
{
sprite->y = bush->y + 38;
}
else
{
sprite->y += 3;
}
}
if (osl_keys->held.up)
{
if (bushcol == 1) 
{
sprite->y = bush->y - 23;
}
else
{ 
sprite->y -= 3;
}
}
if (osl_keys->held.right)
{
if (bushcol == 1) 
{
sprite->x = bush->x - 28;
}
else
{ 
sprite->x += 3;
}
}
if (osl_keys->held.left)
{
if (bushcol == 1) 
{
sprite->x = bush->x + 28;
}
else
{ 
sprite->x -= 3;
}
}

나는 같은 것을 생각하고 있었다

sprite->y = bushheight - 24;

그러나 작동하지 않습니다

제안이 있습니까?

도움이 되었습니까?

해결책

나는 당신이 기본적인 아이디어를 가지고 있다고 생각합니다. 작업을 확인하십시오. 다음은 컴파일하는 간단한 버전입니다.

#import <stdlib.h>

typedef struct {
    // I'm going to say x, y, is in the center
    int x;
    int y;
    int width;
    int height;
} Rect;

Rect newRect(int x, int y, int w, int h) {
    Rect r = {x, y, w, h};
    return r;
}

int rectsCollide(Rect *r1, Rect *r2) {
    if (r1->x + r1->width/2 < r2->x - r2->width/2) return 0;
    if (r1->x - r1->width/2 > r2->x + r2->width/2) return 0;
    if (r1->y + r1->height/2 < r2->y - r2->height/2) return 0;
    if (r1->y - r1->height/2 > r2->y + r2->height/2) return 0;
    return 1;
}

int main() {
    Rect r1 = newRect(100,200,40,40);
    Rect r2 = newRect(110,210,40,40);
    Rect r3 = newRect(150,250,40,40);

    if (rectsCollide(&r1, &r2))
        printf("r1 collides with r2\n");
    else
        printf("r1 doesnt collide with r2\n");

    if (rectsCollide(&r1, &r3))
        printf("r1 collides with r3\n");
    else
        printf("r1 doesnt collide with r3\n");

}

다른 팁

Box Colision 검출을 목적으로 만 기능하는 것이 좋습니다. 모양이 될 수 있습니다

IsColiding(oslImage item1, oslImage item2) 
{ 
  /* Perform check */
} 

이미지 1과 이미지 2 사이에 충돌이 있는지 확인하십시오. 알고리즘의 경우이 위키 백과를 확인하려고합니다. AABB 경계 상자

특히이 부분 :

AABB의 경우,이 테스트는 단위 축 측면에서 간단한 오버랩 테스트 세트가됩니다. M에 의해 정의 된 AABB의 경우 O에 의해 정의 된 것에 대해 N에 대해 N에 대해 N, P는 IF (MX> PX) 또는 (OX> NX) 또는 (MY> PY) 또는 (OY> NY) 또는 (MZ> PZ)를 교차하지 않습니다. (OZ> NZ).

우선 나는 당신이 의미한다고 생각합니다

sprite->y = bush->**y** - 3;

둘째, 나는 당신이 어떤 플랫폼을 사용하고 있는지 알지 못하지만 종종 y-coordinates가 반전됩니다. 즉, y = 0은 화면 상단에 해당합니다. 이 경우 비교가 작동하지 않을 수 있습니다.

세 번째 충돌 점검은 회전 및 비류 객체를 추가 할 때 빠르게 복잡해 질 수 있습니다. 다각형 교차로를 처리 할 수있는 CGAL 또는 기타 계산 지오메트리 알고리즘 라이브러리를 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top