2013-12-18 1 views
1

저는 최근에 canvas + easeljs를 함께 배우기 시작했으며 현재 2D 게임을하고 있습니다. 플레이어 (작은 빨간색 직사각형)는 캔버스를 가로 질러 움직일 수 있고, 그가 국경의 "외곽"에있을 때 선은 그 뒤에 그려져 있습니다.캔버스의 두 영역 : 어느 것이 더 큰지 알아 내기

다음 경계선이 오면 선은 그 자체로 드로잉을 멈추고이 선으로 구분 된 두 영역을 만듭니다.

이 시점에서 각 영역이 다른 영역과 비교하여 얼마나 큰지 파악해야합니다.

그래서 내가 알아낼 필요하다 :

  • 각 지역에 그려지는
  • 그리드를 볼 (작은 빨간 원)을 계산 더 큰 면적이 작은

    • /뒤에는 UI 뒤에있는 논리가 무엇인지 쉽게 이해할 수 있습니다. 0은 빈 공간 (흰색 직사각형)을 나타내며 2는 회색 직사각형 (경계선과 우리 선)을 나타냅니다.

      전체 캔버스에서 "for for looping"을 사용하여 각 영역의 숫자를 0으로 계산했지만 각 영역을 신중하게 전환해야하므로 잘 진행되지 않았습니다.

      더 좋은 방법이 있습니까? 아마 재귀 적으로 어떻게 든 그것을 할 수 있을까요? 내가 충분히 명확하지 않으면

      The two areas I need to use

      더 많은 정보를 원하시면 주저하지 마십시오. 나쁜 제목에 대해 유감스럽게 생각합니다. 어떻게 더 명확하게 표현해야할지 모르겠습니다.

      의견을 보내 주시면 감사하겠습니다.

      EDIT1 : 게임이 하나와 유사한 : http://xonix.vamplabs.com

    +0

    문제가있는 코드를 알려주십시오. – K3N

    +0

    특정 라인이나 무언가에 문제가있는 것은 아닙니다. 어떤 접근 방식을 사용해야할지 모르겠습니다. 그리고 현재 코드는 500 개 이상의 라인에 있으므로, 아마 그것을 게시하는 것은별로 유용하지 않을 것입니다. – trainoasis

    +0

    게임에 대해 더 잘 설명해 주시겠습니까? 그래서 플레이어는 이동하면서 어떻게 든 장벽을 만들 수 있습니까? – markE

    답변

    0

    가능한하지만 매우 비효율적 인 방법 :

    • 쉽게 이해하여 표현 전환. 회색 셀을 0으로하고 흰색 셀을 1로 지정하십시오.
    • 플레이어가 국경으로 돌아 왔을 때 영역 식별. 게임 필드의 임시 사본을 만드십시오. 크기가 계산되기 시작합니다. (복사 된 필드에서 모든 값을 변경해야합니다!)

    • 여기에서 재귀 적 접근을 시도 할 수 있습니다. "1"셀을 선택하고 카운터 변수에 1을 더하십시오. 셀을 0으로 바꾸고 인접한 셀을 살펴보십시오. 값이 "1"인 모든 셀을 재귀 적으로 분기합니다.

    • 당신이 AREA 중 하나에서 시작하여 "벽"으로 영역을 채우기 시작하면서 채운 필드 수를 기억하십시오. 국경에서 벗어나기 때문에 지역 경계를 벗어나지 않고 이웃들에게 진전하여 포함 된 모든 지역을 공격해야합니다.

    • 영역이 "완료되었습니다"(모든 필드가 0으로 설정되고 모든 재귀 분기가 반환 됨) 카운터 변수는 영역의 크기를 나타냅니다.이전 단계의 영역을 반복하여 계산할 때 빨간색 볼을 확인할 수도 있습니다.

    • 다음 영역으로 이동하려면 1을 누르기 전까지 전체 필드를 반복해서 반복하고 이전 단계를 반복하십시오.

    • 전체 필드를 반복하고 1을 찾지 못하면 모든 영역을 평가하고 완료됩니다. , 정말 효과가 경고했다,하지만 난 복잡한 코너의 경우에 실행하지 않고 지금 더 나은 방법을 생각할 수 없기 때문에

    ... 해명에 대한


    UPDATE에 코멘트보기 참조 용으로이 대답. 한 지역의 순환 세포 평가

    의사 코드 :

    int areaSize = 0; 
    //find the first starter cell to detect first area 
    Cell starter = findCellWithValue1(); 
    //if starter is null, no cell with value 1 has been found 
    if(starter != null) { 
        //feed the starter cell into the recursive function 
        areaSize = evaluateCell(starter); 
    } 
    
    int evaluateCell(Cell selected) { 
        //counter variable to accumulate branched values 
        int counter = 1; 
        //set this cell to 0 to not hit it again when evaluating neighbours 
        selected.setValue(0); 
    
        //check neighbour to the left 
        Cell neighbour = getCellAt(selected.getX()-1, selected.getY()); 
        if(neighbour.getValue()==1) { 
         counter += evaluateCell(neighbour); 
        } 
        //check neighbour to the right 
        neighbour = getCellAt(selected.getX()+1, selected.getY()); 
        if(neighbour.getValue()==1) { 
         counter += evaluateCell(neighbour); 
        } 
        //check top neighbour 
        neighbour = getCellAt(selected.getX(), selected.getY()+1); 
        if(neighbour.getValue()==1) { 
         counter += evaluateCell(neighbour); 
        } 
        //check bottom neighbour 
        neighbour = getCellAt(selected.getX(), selected.getY()-1); 
        if(neighbour.getValue()==1) { 
         counter += evaluateCell(neighbour); 
        } 
    
        //return accumulated size 
        return counter; 
    } 
    

    이 궁극적으로 불필요한 검사 꽤 많이 수행하지만 거대한를 가질 계획이 아니라면 나는 그들이 너무 비싸 생각하지 않는다 운동장.

    영역의 최종 크기는 areaSize 변수의 내용입니다.

    +0

    문제는 두 번째 영역에 온 것을 어떻게 알 수 있습니까? 당신이 만든 라인은 "경계선"에 도달하기 전에 어디든 갈 수 있습니다. 그래서 이것을 알아내는 것은 이상 할 수 있습니다. 그 사각형은 항상 직사각형이 아니며, 그것이 될지라도, 당신이 Area 2에 온 것을 어떻게 알 수 있습니까? 죄송합니다. 여기 조금 혼란 스럽네요. – trainoasis

    +0

    첫 번째 : 영역의 흰색 필드가 모두 적어도 한쪽면에 닿아있는 한, 영역은 제안 된 알고리즘을 사용하는 모든 모양 일 수 있습니다. 둘째 : 평가하는 동안 두 번째 영역으로 '오지 마세요'. 귀하의 지역은 모두 0으로 둘러싸여 있으므로 지역을 평가하는 동안 1에서 1로 뛰어 내릴 때이 주변 경계를 결코 지나치지 않을 것입니다. 복사 된 필드에서 첫 번째 영역을 삭제할 때만 두 번째 영역으로 이동 한 다음 다른 영역을 다시 검색하기 시작합니다. – kasoban

    +0

    오늘 제안한 내용을 구현하고 알려 드리겠습니다. - – trainoasis

    관련 문제