WP8에서 요소의 절대 위치를 얻고이를 사용하여 해당 요소를 새 위치로 이동하는 방법

길 라니

WP8에서 요소의 절대 위치를 얻고이를 사용하여 해당 요소를 새 위치로 이동하는 방법

다음 코드를 사용하여 화면을 탭하고 예상치 못한 동작이 발생하여 이미지를 이동하려고합니다.

        private void SetGame()
    {
        ScreenWidth = Application.Current.Host.Content.ActualWidth;
        ScreenHeight = Application.Current.Host.Content.ActualHeight;

        var transform = littleMan.TransformToVisual(Application.Current.RootVisual);
        System.Windows.Point absolutePosition = transform.Transform(new System.Windows.Point(0, 0));

        manLocY = absolutePosition.Y; //vert
        manLocX = absolutePosition.X; //hori

        leftControlArea = (ScreenWidth / 2);
        rightControlArea = (ScreenWidth / 2); // answer to the screen width;
        topControlArea = (ScreenHeight / 3);
        bottomControlArea = (ScreenHeight / 3) * 2; // answer to the screen height

        littleManWidth = littleMan.ActualWidth;
        littleManHeight = littleMan.ActualHeight;

    }

    private void MoveLittleMan(Vector2 tappedWhere)
    {
        double tapX, tapY;
        tapX = tappedWhere.X; // represent where user tapped on screen width wise
        tapY = tappedWhere.Y; // represent where user tapped on screen height wise


        if(tapY <= topControlArea)
        {
            // move top
            Debug.WriteLine("Move TOP - X: " + tapX + " - Y: " + tapY);
            if (manLocY > littleManHeight)
            {
                manLocY = manLocY - skippingSteps;
                Canvas.SetTop(littleMan, manLocY);
            }
        }

        else if(tapY >= bottomControlArea)
        {
            //move bottom
            Debug.WriteLine("Move BOTTOM - X: " + tapX + " - Y: " + tapY);
            if (manLocY < (ScreenHeight - littleManHeight))
            {
                manLocY = manLocY + skippingSteps;
                Canvas.SetTop(littleMan, manLocY);
            }
        }

        else if (tapX <= leftControlArea && tapY > topControlArea && tapY < bottomControlArea)
        { 
            //move left
            Debug.WriteLine("Move LEFT - X: " + tapX + " - Y: " + tapY);
            if (manLocX > littleManWidth)
            {
                manLocX = manLocX - skippingSteps;
                Canvas.SetLeft(littleMan, manLocX);
            }
        }
        else if (tapX > rightControlArea && tapY > topControlArea && tapY < bottomControlArea)
        { 
            //move right
            Debug.WriteLine("Move RIGHT - X: " + tapX + " - Y: " + tapY);
            if (manLocX < (ScreenWidth - littleManWidth))
            {
                manLocX = manLocX + skippingSteps;
                Canvas.SetLeft(littleMan, manLocX);
            }

        }

    }

예상되는 동작은 탭에서 시스템이 화면의 어느 쪽이 탭되었는지 파악하고 작은 사람을 그 방향으로 이동시키는 것입니다.

skippingSteps = 40;

응용 프로그램이 시작되면 setGame()기능이 실행됩니다. 내가 가진 문제는 응용 프로그램이 시작되고 화면 오른쪽을 탭하면 littleMan이 화면의 오른쪽 경계에서 너무 멀리 점프한다는 것입니다. 왼쪽을 누르면 다시 돌아 오기 시작합니다. 중단 점으로 내가 수집 한 데이터를 잘 보이지만 때 Canvas.SetLeft또는 Canvas.SetTop20 × 20의 GIF 이미지는 X 평면에서 520의 위치로 이동되는 littleMan 불린다.

누군가 내가 뭘 잘못하고 있는지 이해하도록 도울 수 있습니까?

길 라니

좋아, 다음과 같은 방법으로 문제를 해결했습니다.

내 XAML

    <Grid x:Name="LayoutRoot" Background="Transparent">
    <Canvas Margin="0" HorizontalAlignment="Left" VerticalAlignment="Top">
        <Image Name="littleMan" Source="images/smileyFace.gif" Stretch="None"></Image>
    </Canvas>
    </Grid>

내 코드 뒤에

    public Game()
    {
        InitializeComponent();
        this.Loaded += Game_Loaded;
    }

    void Game_Loaded(object sender, RoutedEventArgs e)
    {
        SetGame();
        TouchPanel.EnabledGestures = GestureType.Tap;
        LayoutRoot.ManipulationCompleted += new EventHandler<ManipulationCompletedEventArgs>(LayoutRoot_ManipulationCompleted);
    }

    void LayoutRoot_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
    {
        while (TouchPanel.IsGestureAvailable)
        {
            GestureSample gesture = TouchPanel.ReadGesture();

            switch (gesture.GestureType)
            {
                case GestureType.Tap:
                    Dispatcher.BeginInvoke(() => MoveLittleMan(gesture.Position));
                    break;
            }
        }
    }

    private void SetGame()
    {
        ScreenWidth = Application.Current.Host.Content.ActualWidth;
        ScreenHeight = Application.Current.Host.Content.ActualHeight;

        // littleman image is in 20 * 20
        littleManWidth = 20;
        littleManHeight = 20; 

        manLocY = (ScreenHeight / 2) + littleManHeight; //vert
        manLocX = (ScreenWidth / 2) + littleManWidth; //hori

        littleMan.Margin = new Thickness(manLocX, manLocY, 0, 0);

        leftControlArea = (ScreenWidth / 2);
        rightControlArea = (ScreenWidth / 2); // answer to the screen width;
        topControlArea = (ScreenHeight / 3);
        bottomControlArea = (ScreenHeight / 3) * 2; // answer to the screen height
    }

    private void MoveLittleMan(Vector2 tappedWhere)
    {
        double tapX, tapY;
        tapX = tappedWhere.X; // represent where user tapped on screen width wise
        tapY = tappedWhere.Y; // represent where user tapped on screen height wise


        if(tapY <= topControlArea)
        {
            // move top
            Debug.WriteLine("Move TOP - X: " + tapX + " - Y: " + tapY);
            if (manLocY > littleManHeight)
            {
                manLocY = manLocY - skippingSteps;
                littleMan.Margin = new Thickness(manLocX, manLocY, 0, 0);
            }
        }

        else if(tapY >= bottomControlArea)
        {
            //move bottom
            Debug.WriteLine("Move BOTTOM - X: " + tapX + " - Y: " + tapY);
            if (manLocY < (ScreenHeight - littleManHeight -50))
            {
                manLocY = manLocY + skippingSteps;
                littleMan.Margin = new Thickness(manLocX, manLocY, 0, 0);
            }
        }

        else if (tapX <= leftControlArea && tapY > topControlArea && tapY < bottomControlArea)
        { 
            //move left
            Debug.WriteLine("Move LEFT - X: " + tapX + " - Y: " + tapY);
            if (manLocX > littleManWidth)
            {
                manLocX = manLocX - skippingSteps;
                littleMan.Margin = new Thickness(manLocX, manLocY, 0, 0);
            }
        }
        else if (tapX > rightControlArea && tapY > topControlArea && tapY < bottomControlArea)
        { 
            //move right
            Debug.WriteLine("Move RIGHT - X: " + tapX + " - Y: " + tapY);
            if (manLocX < (ScreenWidth - littleManWidth))
            {
                manLocX = manLocX + skippingSteps;
                littleMan.Margin = new Thickness(manLocX, manLocY, 0, 0);
            }
        }

    }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

조상이 절대 위치를 가지고 있음에도 불구하고 페이지에서 요소의 위치를 절대적으로 만드는 방법

분류에서Dev

xslt를 사용하여 XML 요소를 해당 위치에서 다른 상위 요소 아래로 이동

분류에서Dev

부모 요소에 상대적인 절대 위치를 사용하는 방법

분류에서Dev

절대 위치를 사용하지 않고 인라인 가상 요소로 인라인 요소 주위에 요소를 래핑하는 방법

분류에서Dev

절대 위치를 가진 요소의 새로운 높이를 찾기 위해 jQuery에서 지연로드 및 부정사 스크롤 문제?

분류에서Dev

CSS를 사용하여 절대 위치 요소를 자신의 위치 속성 위에 중앙에 배치

분류에서Dev

내 경우 절대 위치 요소를 중앙에 배치하는 방법

분류에서Dev

동일한 방법으로 상위 구성 요소의 하위 구성 요소를 여러 번 새로 고치려면 어떻게해야합니까?

분류에서Dev

자식 요소의 높이를 알 수없는 경우 절대 위치 요소를 부모 내에서 중앙에 배치하는 방법

분류에서Dev

Jquery에서 화면 크기에 따라 절대 위치 요소를 이동하는 방법

분류에서Dev

절대 요소 아래의 요소는 그 위에있는 절대 요소를 방해합니다.

분류에서Dev

절대 위치를 사용하지 않고 div를 서로 위에 배치하는 방법이 있습니까?

분류에서Dev

회전 및 애니메이션 목적으로 사용할 수있는 절대 요소를 다른 절대 요소의 중앙에 배치하는 방법

분류에서Dev

스크롤 가능한 div 요소 내에서 CSS 절대 위치를 사용하는 방법

분류에서Dev

요소의 목록 유형에 대해 xslt를 사용하여 xml을 요소로 재구성하는 방법

분류에서Dev

Laravel Livewire-하위 구성 요소를 강제로 새로 고치는 방법

분류에서Dev

mongoose를 사용하여 MongoDB에서 한 배열 위치에서 다른 배열 위치로 요소를 이동하는 방법은 무엇입니까?

분류에서Dev

절대 위치 요소를 절단하지 않고 오버플로 요소

분류에서Dev

파이썬에서 index ()를 사용하여 찾은 위치에서 목록의 요소를 찾는 방법

분류에서Dev

속성 이름이 동일한 여러 요소를 해당 속성 값을 하위 요소로 사용하는 새 요소로 변환

분류에서Dev

IE 9,10,11에서 "위치 : 절대"요소를 중앙에 배치하는 방법

분류에서Dev

ReactJS : 새 요소의 렌더링에도 불구하고 요소를 현재 위치로 고정하는 방법은 무엇입니까?

분류에서Dev

배열에서 요소의 위치를 변경하는 방법

분류에서Dev

절대 위치 요소에 오버레이를 추가하는 방법은 무엇입니까?

분류에서Dev

절대 위치 요소를 포함하는 4 개의 열

분류에서Dev

절대 위치 요소를 포함하는 4 개의 열

분류에서Dev

PHP를 사용하여 Selenium WebDriver의 요소 위치를 비교하는 방법

분류에서Dev

ng-repeat 목록 내부의 요소를 겹치는 방법-위치 : 절대?

분류에서Dev

ng-repeat 목록 내부의 요소를 겹치는 방법-위치 : 절대?

Related 관련 기사

  1. 1

    조상이 절대 위치를 가지고 있음에도 불구하고 페이지에서 요소의 위치를 절대적으로 만드는 방법

  2. 2

    xslt를 사용하여 XML 요소를 해당 위치에서 다른 상위 요소 아래로 이동

  3. 3

    부모 요소에 상대적인 절대 위치를 사용하는 방법

  4. 4

    절대 위치를 사용하지 않고 인라인 가상 요소로 인라인 요소 주위에 요소를 래핑하는 방법

  5. 5

    절대 위치를 가진 요소의 새로운 높이를 찾기 위해 jQuery에서 지연로드 및 부정사 스크롤 문제?

  6. 6

    CSS를 사용하여 절대 위치 요소를 자신의 위치 속성 위에 중앙에 배치

  7. 7

    내 경우 절대 위치 요소를 중앙에 배치하는 방법

  8. 8

    동일한 방법으로 상위 구성 요소의 하위 구성 요소를 여러 번 새로 고치려면 어떻게해야합니까?

  9. 9

    자식 요소의 높이를 알 수없는 경우 절대 위치 요소를 부모 내에서 중앙에 배치하는 방법

  10. 10

    Jquery에서 화면 크기에 따라 절대 위치 요소를 이동하는 방법

  11. 11

    절대 요소 아래의 요소는 그 위에있는 절대 요소를 방해합니다.

  12. 12

    절대 위치를 사용하지 않고 div를 서로 위에 배치하는 방법이 있습니까?

  13. 13

    회전 및 애니메이션 목적으로 사용할 수있는 절대 요소를 다른 절대 요소의 중앙에 배치하는 방법

  14. 14

    스크롤 가능한 div 요소 내에서 CSS 절대 위치를 사용하는 방법

  15. 15

    요소의 목록 유형에 대해 xslt를 사용하여 xml을 요소로 재구성하는 방법

  16. 16

    Laravel Livewire-하위 구성 요소를 강제로 새로 고치는 방법

  17. 17

    mongoose를 사용하여 MongoDB에서 한 배열 위치에서 다른 배열 위치로 요소를 이동하는 방법은 무엇입니까?

  18. 18

    절대 위치 요소를 절단하지 않고 오버플로 요소

  19. 19

    파이썬에서 index ()를 사용하여 찾은 위치에서 목록의 요소를 찾는 방법

  20. 20

    속성 이름이 동일한 여러 요소를 해당 속성 값을 하위 요소로 사용하는 새 요소로 변환

  21. 21

    IE 9,10,11에서 "위치 : 절대"요소를 중앙에 배치하는 방법

  22. 22

    ReactJS : 새 요소의 렌더링에도 불구하고 요소를 현재 위치로 고정하는 방법은 무엇입니까?

  23. 23

    배열에서 요소의 위치를 변경하는 방법

  24. 24

    절대 위치 요소에 오버레이를 추가하는 방법은 무엇입니까?

  25. 25

    절대 위치 요소를 포함하는 4 개의 열

  26. 26

    절대 위치 요소를 포함하는 4 개의 열

  27. 27

    PHP를 사용하여 Selenium WebDriver의 요소 위치를 비교하는 방법

  28. 28

    ng-repeat 목록 내부의 요소를 겹치는 방법-위치 : 절대?

  29. 29

    ng-repeat 목록 내부의 요소를 겹치는 방법-위치 : 절대?

뜨겁다태그

보관