Перейти к содержанию

Лидеры

  1. cliva

    cliva

    Игроделы


    • Баллы

      3

    • Постов

      373


  2. ReviveR200

    ReviveR200

    Модераторы


    • Баллы

      1

    • Постов

      910


  3. Vad Games

    Vad Games

    Участники


    • Баллы

      1

    • Постов

      2


  4. Morxun

    Morxun

    Участники


    • Баллы

      1

    • Постов

      38


Популярный контент

Показан контент с высокой репутацией за 01/25/23 во всех областях

  1. Расширяем границы Самое время узнать о ещё некоторых конструкциях js кода. Мы уже знаем что такое цикл и как его использовать, но допустим нам надо сделать так, чтобы цикл состоящий из 6 итераций(повторений) выводил в консоль первые три раза число 000, а последующие три раза число 555, это мы можем сделать с помощью условного ветвления: if (условие) строка выполняемого кода: if (money < 100) alert("У вас не хватает на проезд") if (условие){ строка кода; строка кода; ... }: if (money >= 100){ money-=100; alert("проезд оплачен") } Также к любому если(if) можно добавить иначе - else: if (money == 111){ alert("счастливое число") } else { alert("обычное число") } //Также мы можем собирать почти бесконечную цепочку if - else, небольшой глупый пример: if (num == 1){ alert("число = 1"); } else if (num == 2){ alert("число = 2"); } else if (num == 3){ alert("число = 3"); } else ... Попробуем в консоли написать цикл, который выведет на первых трёх итерациях 000, а на последних трёх - 555: Вот и новая для нас фишка консоли - она собирает сообщения с одинаковым содержимым, которые идут друг за другом в одну кучу, слева число в кружочке отображает сколько раз было выведено это сообщение. Для закрепления предлагаю скормить консоли функцию с параметром, которая бы решала по какому тарифу мы можем проехаться на такси, если в параметре меньше 100 - мы идём пешком, если больше 100, но меньше 180 - тариф "эконом", а если больше или равно 180 - пусть предлагает тариф "комфорт": Вернёмся к нашим человечкам из прошлого урока, добавим ещё парочку, теперь их 5, представим, что они попали в клуб, и только у некоторых из них есть ВИП-билеты, и по этому билету человек может получить золотую корону, чтобы всем показать что он "особая" персона, так как нашим человечкам мы не давали переменной зависти, то и беспокоиться не о чем - драки не будет, а значит приступаем к выполнению задачи: Добавим объекту человека булеву переменную VIP: Нарисуем новую кривую (или не очень) анимацию - человечка с короной, и раздадим ВИП-билеты, я дам их центральному и правому человеку, теперь переходим к списку событий, при старте уровня через цикл нужно проверить если у человека билет, и если он есть - сменим ему анимацию, сменить анимацию спрайта можно с помощью метода setAnimation("Имя анимации"): Думаю стоит упомянуть, что с помощью js можно упростить сложные/большие вычисления, добавим на макет кнопку и сделаем её копию, добавим кнопке переменную type, первой кнопке в текст напишем benchmark event, второй кнопке напишем benchmark js, в переменные кнопок type занесём значения event и js соответственно, перейдем в список событий и реализуем двумя способами(ивентами и кодом) подсчёт факториала (1*2*3*4*5*6*...*n) в качестве n возьмём число 1000000 и посмотрим, сколько займёт каждый просчёт, для этого воспользуемся функцией Date.now() - она возвращает кол-во миллисекунд прошедших с полуночи 1 января 1970 года, замерим время до вычисления факториала и после, а разница - как раз время, которое потребовалось на вычисление: Запускаем, тестируем и замечаем, что реализация на js почти в 10 раз обгоняет реализацию на ивентах! Добавим ка ещё пару ноликов в циклы - реализация кодом снова обгоняет ивенты в заметные 10-15 раз. Почему это происходит? - мы избавляемся от оболочки С3 и работаем напрямую с переменными js, и я подозреваю, что мы сделали срез в адресации - вместо абстрактного ...runtime.globalVars.x - мы используем просто x, что в теории выполняется на сотые миллисекунды быстрее, а благодаря циклу это имеет накопительный эффект Снова поиграем с консолью, а именно с массивами, из С3 мы знаем, что массивы могут быть одномерные, двумерные и трёхмерные - забудьте, в js нет таких условностей: Вот "одномерный" массив, из которого я могу достать значение с помощью одной пары квадратных скобок: Вот "двумерный" массив, из которого я могу достать значение с помощью двух пар квадратных скобок: Да, вы правы, "двумерный" массив - это массив "одномерных" массивов И вот уничтожение устоев, какой это массив?: Полу-двумерный? :) На самом деле это самый обычный массив, у которого первые два элемента являются числами, а третий и четвёртый - являются массивами. Запоминаем - понятие "одномерный массив" можем вообще не использовать, говорим просто массив, понятие "двумерный массив" используем когда описываем массив с массивами одинаковой длины, "трёхмерный массив" - массив с массивами, которые содержат в себе массивы одинаковой длины, также для любых n-мерных массивов, но такие требуются крайне редко, и куда более часто встречаются массивы, которые содержат в себе какие-то значения, ещё массивы, те массивы могут также содержать какие-то значения или ещё массивы, пример: Это своеобразное хранилище всей информации о каком-нибудь персонаже для нашей игры, которого зовут Джон, у него 100 жизней, в инвентаре лежит рыба, дерево и меч, также у него есть ключ доступа номер 3, такую структуру не очень удобно расширять, но в таком компактном виде в принципе приемлемо использовать, к удобствам обратимся чуть позже Возвращаемся к С3, поработаем с объектом tilemap, для этого добавим его в проект, нарисуем два тайла - один светлый, другой тёмный (я изменил размер изображения на 16х32, нарисовал белый и чёрный квадрат, ширину и высоту тайлов в свойствах объекта выставил 16х16). Сделаем из тайлмапа шахматную доску, для этого понадобится умение запихнуть один цикл в другой (их счётчики должны называться по разному!) и метод для тайлмапа - .setTileAt(x тайла,y тайла, номер тайла): Наверняка у вас возник вопрос, откуда я беру все эти методы, ответ прост - на официальном сайте С3 Большинство интересующих нас методов работы с плагинами уже задокументировано, и если вы задались вопросом, какой метод мне использовать для такого-то плагина чтобы сделать с ним что-то - проверьте документацию, скорее всего там это написано. Думаю, стоит взять небольшую паузу Домашнее задание: - Выдайте человечкам разное кол-во денег, раздайте 2-3 ВИП-билета в произвольном порядке, сделайте так, чтобы у самой богатой ВИП-персоны помимо короны появлялась ещё и трость - Задайте массив из 10 элементов, это могут быть как числа, так и строки, сделайте функцию, которая будет переворачивать этот массив (последний элемент станет первым, предпоследний вторым и тд), задание можно выполнить в консоли - Кодом заполните тайлмап таким образом, чтобы он по краям был тёмным, а внутри светлым (светлый квадрат, с тёмной обводкой) -* Нарисуйте на тайлмапе такой смайлик - Если какое-то задание не получилось или остались вопросы по материалу - задаём вопросы в этой теме, если имеются вопросы не относящиеся именно к этой теме - переходим в клуб, во вкладке Общее есть подходящие темы. Исходник урока - expTheBound.c3p Вернуться в основную тему
    1 балл
  2. Работа с игровыми объектами Пока что мы работали только с переменными, самое время разобраться, как работать с игровыми объектами - спрайтами, текстами, семьями и т.д. Как доставать из них интересующие нас значения и присваивать новые. Можно создать новый проект, либо использовать проект из предыдущего урока, удалив все события и сохранив под новым именем. Добавим на макет спрайт, дадим ему название player и нарисуем что-нибудь незамысловатое, у меня это будет немного корявый человечек: Добавим нашему человеку здоровья и немного денег на будущее: Теперь переходим в список событий, чтобы обратиться к игровому объекту - необходимо прописать runtime.objects.названиеОбъекта, в нашем случае это будет runtime.objects.player, но с этим всё ещё нельзя работать, почему? Потому что С3 нам срезает пути своими универсальными ивентами, допустим таким как pick all - выберет все копии объекта и будет производить все действия с выбранными копиями, сейчас мы просто сослались на класс объекта player, а работать нужно с определённой копией, разработчики С3 позаботились об этом, поэтому готов познакомить вас с функцией, которая выберет самый первый созданный объект - getFirstInstance() Вы всё правильно поняли - конструкция runtime.objects.player.getFirstInstance(); выберет первую копию объекта с именем player, для удобства дальнейшей работы присвоим значение этой функции какой-нибудь постоянной: И что же мы можем теперь делать с этим добром? Узнаем сами - с помощью консоли, добавляем строчку console.log(pickPlayer); Запускаем проект, открываем консоль(ctrl+J или F12 в некоторых браузерах) и если всё сделали правильно - в консоли появится такая строчка: Слева от этой строчки есть небольшой треугольник, нажимаем на него и не пугаемся увиденной картины, это открылся список всех свойств выбранной копии, которые мы можем использовать в своих целях: Всю эту структуру можно рассматривать как папки в операционной системе, только вместо слеша - используем точку. Если проявить внимательность, то уже можно увидеть где запрятаны деньжишки нашего человечка - instVars:{hp: 100, money: 350} . Получается, чтобы достать значение переменной денег, нам нужно к нашей константе дописать .instVars.money, убедимся в этом - выведем это значение в алёрт: И вы снова правы, с этой конструкцией можно обращаться как с обычной переменной, добавим нашему человеку денег на покушать: Запускаем и.. теперь у этого счастливчика ровно 600 условных денежных едениц, как жаль, что он их не может потратить Добавим нашему человеку пару друзей: Закомментируем или удалим строку с алёртом и запустим проект в дебаг-режиме , понаблюдаем как изменяются финансы этих людей.. и замечаем вселенскую несправедливость! У новых друзей всего по 350 монет, в то время как у первого целых 600, значит нужно и друзьям как-то добавить денег на обед. Полазив по всплывающей подсказке, мы могли наткнуться на getAllInstances(), попробуем заменить getFirstInstance() на неё, запускаем дебаг и.. замечаем, что теперь даже самый первый победнел, а это всё потому что С3 для нас упрощает многие вещи, и когда мы делаем в С3 pick all он незаметно добавляет туда цикл, который проходится по всем выбранным копиям объекта, значит пора снова разбираться, а что собственно мы запихнули в константу, для этого выведем в консоль: Получим такое, если раскроем пару списков: Как можно заметить, мы получили массив, который содержит все копии человечков, вспоминая предыдущий урок, а именно работу с массивами, предполагаем, что если мы поставим в конце pickPlayer квадратные скобки и впишем в них номер, то мы получим доступ к человеку с этим номером, и этим номером является IID объекта, попробуем последнему человеку (IID = 2) добавить деньжат: Запускаем дебаг и убеждаемся, что у человека с IID = 2 теперь 600 денежных единиц, но мы ведь хотим справедливости, и для этого у нас есть два способа, воспользоваться циклом в С3 или воспользоваться циклом в JS, так как мы все собрались здесь ради JS, то и использовать будем его: for (начало; условие; шаг) { // ... тело цикла ... } for (let i = 0; i<3; i++) { alert(i); //выведет 0, затем 1, затем 2 и закончится } Чтобы получше узнать о цикле for - гуглим "js for", одна из двух первых ссылок вам поможет в этом Для нас важно понимать, что в начало мы можем вставить переменную с любым названием и присвоить ей любое числовое значение, условие также может быть любым, и в шаге мы можем использовать любую мат. операцию Притронувшись к циклам - возвращаемся к проекту в С3, нам нужно в цикле каждому человеку добавить денег, кстати, чтобы узнать кол-во элементов в массиве, необходимо воспользоваться конструкцией массив.length, это нам пригодится Запускаем дебаг и убеждаемся, что справедливость восторжествовала, у всех теперь денег поровну Теперь добавим на макет кнопку, и если вы начинали в новом проекте - добавьте файл скрипта и настройте его также как в первом уроке, добавим функцию, которая будет обогащать наших человеков, скопируем скрипт из действия, зададим функцию и в её тело вставим скрипт: Добавим ивент, который по нажатию кнопки будет вызывать эту функцию: Запускаем дебаг, жмём кнопку, и... ничего не происходит, но это так только кажется, если мы откроем консоль, то увидим что консоль на нас ругается: И нам интересны только первые две строчки, если их перевести, то можно понять, что ошибка вызвана тем, что runtime не определён для функции add250(), это происходит потому, что runtime определён внутри списка событий, но не определён для подключаемого к этому списку событий файла скрипта, не беда - поможем функции найти runtime, для этого просто запихнём его в параметр этой функции: А в самой функции - примем этот параметр, можно под тем же именем, но для наглядности имя я чуть изменил: Запускаем дебаг, жмём кнопку - всё работает, смотрим в консоль - ошибок нет, а значит мы всё сделали правильно Почему я сразу не сделал правильно - решил наглядно показать как расправляться с ошибками, которые могут нас настигнуть, если что-то работает не так, как мы ожидаем - первым делом смотрим в консоль, может быть это какая-то простая ошибка, как в данном случае Теперь добавим на макет текст, в него будем выводить общее богатство всех человечков, как препарировать объект в консоли - вы уже знаете, поэтому объект текста поковыряйте сами, создадим в файле скрипта функцию, которая будет считать все деньги человечков, при старте макета и по нажатию кнопки будем её вызывать и возвращаемое значение вставлять в текст, единственное, что может нам помешать - незнание как число перевести в строку, я знаю три способа: использование метода - переменная.toString(), использование функции - String(переменная), и ленивый способ - добавить к переменной строку, чтобы преобразование произошло само переменная+"" Зная всё это мы уже можем реализовать функцию подсчёта всех денег: На этом можно сделать небольшую паузу Домашнее задание: - по нажатию кнопки все человеки должны повернуться по часовой стрелке на 5 градусов (в коде С3 использует радианы, не забываем переводить) - для каждого человека сделать 2 кнопки, одна будет добавлять деньги, вторая убавлять - "Дай в долг" сделайте функцию, которая будет забирать деньги (допустим 120 ден. ед.) у одного человека и передавать их другому: функция дайВДолг(у кого забрать, кому отдать){...} тестировать эту функцию можете в свободной форме, добавить 6 кнопок, для каждой пары параметров - (0,1),(0,2),(1,2)...(2,1) или посмотреть как преобразовать строку в число и добавить текстИнпуты на макет, для кажого параметра, или те же текстИнпуты привязать к локальным переменным и лок. пер. впихивать в параметры, всё на ваше усмотрение, лишь бы получилось *-"Скинуться" сделайте функцию, которая заберёт у каждого человека определённую параметром сумму, сложит их в одну кучу и "совершит покупку" на определённую вторым параметром сумму, остаток пусть вернёт всем человекам поровну Допустим, у каждого человека по 600, я вызвал функцию скинуться(200,510) У каждого человека после полного исполнения этой функции должно остаться по 430 Если какое-то задание не получилось или остались вопросы по материалу - задаём вопросы в этой теме, если имеются вопросы не относящиеся именно к этой теме - переходим в клуб, во вкладке Общее есть подходящие темы. Исходник урока - workWithGameObject.c3p вернуться в основную тему
    1 балл
  3. Math.PI, вся математика js - в Math контейнер в С3 - неосязаемая связь, реализованная через IID, авто-pick грубо говоря, реализация его замены - не сложная штука один цикл где счётчик i - IID объектов человечка и текста, но кодом можно управлять иерархией, getChild.. кажется Да, так как это добавляемы скрипт, а не главный, он служит надстройкой к игре, управлять переменными можно через методы классов или функциями, условия в привычном для С3 понимании будут в четвёртом уроке, а сам условный оператор if, кажется я рассматривал в третьем тут уже недостаток самой среды разработки и её разрозненности "код отдельно, ивенты отдельно и между ними интерфейсный мост", тут только замена через ctrl+F
    1 балл
  4. Подскажите пожалуйста проблема точно такая же случилась, реклама больше не показывается. Может кто знает как настроить без использования плагина?
    1 балл
  5. Через плагин не возможно подключить лидерборды. Вот тут есть как это делается без плагина:
    1 балл
  6. Официальный сайт Запустить версию r325 Изменения Instant Games exporter перемещено в категорию "Other"; Исправление ошибок Physics: сбой при создании соединения с объектом с отключенным поведением Physics; Иерархии: сбой во время выполнения при попытке восстановить состояние из сохраненной игры; Менеджер экспорта: таблица с экспортированными проектами не отображается при первом открытии диалогового окна; Tweens и Timelines: резкое движение с несколькими Timelines/Tweens, влияющими на один и тот же экземпляр (регрессия r321); Панель проекта: неправильное переименование вложенных папок после перетаскивания или вставки (регрессия r322). Обновление SDK Исправлено, что метод HandleWebGLContextLoss() не работает (регрессия r324); Метод onCreate() теперь необязательный для SDKTypeBase и SDKBehaviorTypeBase. Неточный перевод: ReviveR200 + Yandex translate. Нашли неточность - напишите комментарий.
    1 балл
×
×
  • Создать...