none
CocosSharp

    Вопрос

  • вопрос возможно не совсем по cocossharp, а больше по знанию С# в целом. Возникли трудности, да  что там, я застрял, на следующем моменте

    в cocossharp для использования объектов как средства управления (кнопка) используется обработчик касания "OnTouchesEnded(List<CCTouch> touches, CCEvent touchEvent)" или "OnTouchesBegan". Игра состоит из двух сцен, которые находятся на начальной странице ("Main Page"), а вот вход в меню настроек я реализую путём навигации из  "Main Page" в "Settings"

    public async void Settings_open(object sender, EventArgs e)
            {
                await Navigation.PushModalAsync(new Settings());
            } 

    Так вот я не могу понять как мне из  "class gameLayer : CCLayer" из обработчика

     void OnTouchesEnded(List<CCTouch> touches, CCEvent touchEvent)
            {

               if (settings.BoundingBoxTransformedToWorld.ContainsPoint(touches[0].Location)) //где settings - это объект класса CCSprite// 
                {

                }

            }

    вызвать тот самый метод "Settings_open"???

     "OnTouchesEnded", как Вы понимаете, имеет параметры "List<CCTouch> touches, CCEvent touchEvent", а "Settings_open"- "object sender, EventArgs e" и классический вызов через объект класса "Main Page" не получиться. Возможно необходимо прибегнуть к использованию делегатов и их событий. Делал пару попыток,но они не увенчались успехом

     
    18 июня 2017 г. 12:59

Все ответы

  • Немного непонятна суть вопроса. Как видно из кода Settings_open, его аргументы вообще никак не используются, так почему бы не написать что-то вроде MainPage.Settings_open(null,null);
    18 июня 2017 г. 18:09
  • Попытаюсь объяснить 

    Первая страница

    public partial class MainPage : ContentPage
        {       
            public MainPage()
            {
                InitializeComponent(); 
                NavigationPage.SetHasNavigationBar(this, false);            
            }      
            public async void Settings_open(object sender, EventArgs e)
            {
                await Navigation.PushModalAsync(new Settings());
            } 
        }

    В XML следующее 

    x:Class="KidsCalculatApp.MainPage">    
        <ContentPage.Content>
        <Grid x:Name="grid">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />            
            </Grid.RowDefinitions>
                <local:ViewController HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="0" />
            </Grid>
    </ContentPage.Content>
    18 июня 2017 г. 19:56
  • ViewController это класс который создаёт сцены с помощью Cocossharp. В нём две сцены. Если бы была одна сцена(главная) то для перехода в настройки по нажатию на соответствующую иконку(картинку) в классе MainPage  можно было бы использовать что-то вроде

           Image   butSet = new Image() { Source = "button_settings" };          

                //butSet.HorizontalOptions = LayoutOptions.End;
                //butSet.VerticalOptions = LayoutOptions.End;
                //StackLayout stack = new StackLayout() { Children = {  butSet } };
                //stack.Orientation = StackOrientation.Horizontal;            
                //var tapImage5 = new TapGestureRecognizer();
                //butSet.GestureRecognizers.Add(tapImage5);
                //tapImage5.Tapped += Settings_open;
                //grid.Children.Add(stack, 0, 0);

    и обработчик события                                                                                                                                                 public async void Settings_open(object sender, EventArgs e)
            {
                await Navigation.PushModalAsync(new Settings());
            }                                                                                                                                                                            Но в этом случае иконка вызывающая страницу настроек "new Settings"  появляется сразу же при запуске приложения , уже с первой сцены, что по моей 

    18 июня 2017 г. 20:03
  • задумке недопустимо, так как переход в настройки должен осуществляться только из игровой сцены.

    Я решил создать иконку для меню настроек непосредственно во второй сцене 

     public class gameLayer : CCLayer
        {

    CCSprite settings;

    public gameLayer()
            {

    settings = new CCSprite("button_settings");
                settings.AnchorPoint = new CCPoint(0, 0);
                settings.PositionX = App.Width - (App.Width / 8) * 1;
                settings.PositionY = App.Height - (App.Height / 10) * 10;
                settings.Scale = 0.9f;
                AddChild(settings);

    }

    protected override void AddedToScene()
            {var touchListener1 = new CCEventListenerTouchAllAtOnce();
                touchListener.OnTouchesEnded = OnTouchesEnded;
                AddEventListener(touchListener1, this);}

     void OnTouchesEnded(List<CCTouch> touches, CCEvent touchEvent)
            {
                if (settings.BoundingBoxTransformedToWorld.ContainsPoint(touches[0].Location))
                {но что написать здесь я не знаю }

    }

    Как то так

    18 июня 2017 г. 20:10
  • Если MainPage у вас один, то вот так можно сделать:

    public partial class MainPage : ContentPage
    {       	
    	public static MainPage Instance;
    		
            public MainPage()
            {
                InitializeComponent(); 
    	    Instance = this;
                NavigationPage.SetHasNavigationBar(this, false);            
            }      
            public async void Settings_open(object sender, EventArgs e)
            {
                await Navigation.PushModalAsync(new Settings());
            } 
    }
    void OnTouchesEnded(List<CCTouch> touches, CCEvent touchEvent)
    {
        if (settings.BoundingBoxTransformedToWorld.ContainsPoint(touches[0].Location))
        {
    	MainPage.Instance.Settings_open(null,null);	   
        }
    
    }


    19 июня 2017 г. 7:51
  • Спасибо большое за ответ. Но к сожалению не могу проверить его работоспособность в связи с неработающим эмулятором андроид. Вы не знаете как эмуляторы скачанные в приложении Visual Studio Emulator for Android добавить в список эмуляторов в Visual Studio, так как на данный момент у меня в списке нет ни одного, а созданные мной в SDK Manager уж очень медленные да ещё и исключение возникает, связанное с загрузкой памяти. Уже несколько раз переустанавливал  Visual Studio Emulator for Android, удалял и снова устанавливал эмуляторы через меню установки/исправления/удаления самого Visual Studio 2015, проводил исправление ошибок в нём, но в списке так ни одного  эмулятора не добавилось. Возможно стоит полностью переустановить VS, хотя боюсь что и это не поможет.
    21 июня 2017 г. 21:46
  • Не знаю насчет эмуляторов. Вообще-то эмуляторы это довольно тяжелые программы. Если им нехватает памяти, может стоит увеличить размер файла подкачки?
    22 июня 2017 г. 13:29
  • С эмулятором разобрался, но вот приложение всё таки не работает должным образом. При нажатии на иконку настроек перехода на страницу Settings()не происходит, а появляется следующее сообщение. Не понятно где именно возникает это исключение.  Что можете посоветовать и что это может значить (replacing opcode 0x70 at 0x0000 An unhandled exception occured)? 

    • Изменено Andrey17 22 июня 2017 г. 14:44
    22 июня 2017 г. 14:35
  • Если нажать "Прервать", что выводится? Чтобы отладить исключение нужна хоть какая-то информация. На вызове какой функции падает, какое сообщение, код ошибки. 
    22 июня 2017 г. 18:28
  • в том то и дело, что нет сообщения в каком месте произошло исключение.Или необходимо его где-то поискать. Мои поиски, в том числе на просторах интернета, привели меня к осознанию того, что искать подобное исключение крайне сложно. Необходимо его обработать. Но функционально приложения рабочее, до того момента где необходимо перейти в меню настроек. Так что исключение возникает именно здесь.

    public async void Settings_open(object sender, EventArgs e) { await Navigation.PushModalAsync(new Settings()); }

    Вы не могли бы пересмотреть предложенный Вами ранее вариант, с целью выбора другого

    способа реализовать мою задумку навигации по страницам приложения. Если конечно это вас не затруднит.

    За ранее благодарен

    22 июня 2017 г. 23:29
  • И ещё, методом множественных проб и ошибок я пришёл к следующему выводу. Если преобразовать этот метод

    public async void Settings_open(object sender, EventArgs e)
            {
                await Navigation.PushModalAsync(new Settings());
            } 

    до этого вида

    public  void Settings_open(object sender, EventArgs e)
            {
                Navigation.PushAsync(new Settings());
            } 

    то исключение не возникает и происходит переход на страницу настроек, но её содержание почему - то

    не загружается(просто белый экран)


    • Изменено Andrey17 22 июня 2017 г. 23:51
    22 июня 2017 г. 23:50
  • может попробовать переход без анимации:

    await Navigation.PushModalAsync (new Settings(), false);

    15 ч. 54 мин. назад