Вопросы новичка

Страница 2 из 8 Предыдущий  1, 2, 3, 4, 5, 6, 7, 8  Следующий

Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Пт Дек 29, 2017 2:25 pm

Вот более-менее правильный способ для множественных функций. Сейчас попробую через скобки.
Код:
function turn(mytext){

 var sum = 0; //это будет общая для всех последующих функций переменная

 function console1(){
 var local = 0; //это переменная создается каждый раз заново
 local++;

 sum++;

 console.log(mytext + "Sum: " + sum + " Local: " + local);
 }

 console1();//для первого вызова


 return function m(mytext){

 console1();

 return m;
 };
}

turn("Первый вызов ")("Второй вызов ")("Третий вызов ")("Четвертый вызов ");

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Пт Дек 29, 2017 2:29 pm

ай блеять, новый год, все. Отвлекают. Всем что-то от меня надо.
Только вошел в раж.

jquery множественные вызовы (если я правильно понял термин) как-то через скобки делает.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Пт Дек 29, 2017 2:30 pm

Распиши, пожалуйста, как это работает:
Код:
function turn(mytext){

 console.log(mytext); //для первого вызова

 return function m(mytext){

 console.log(mytext);

 return m;
 };
}

turn("Первый вызов")("Второй вызов")("Третий вызов")("Четвертый вызов");
Я понимаю, что стартуем с запуска turn("Первый вызов")("Второй вызов")("Третий вызов")("Четвертый вызов") - и аргумент в скобках подставляется вместо (mytext). Оно сразу все 4 подставляет или сначала первый текст, отработала функция, второй текст пошёл, отработала функция и т.д.?

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Пт Дек 29, 2017 7:14 pm

по очереди. Если поймешь как это происходит, то ты считай очень умный программист.

Мне то это легче далось, т.к. у мну уже опыт есть. А тебе скачек нужен.

Попробуй сам. Тут объяснение одна строчка. И эту строчку все равно не понятная окажется.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Сб Дек 30, 2017 12:33 am

Ты прямо знал как меня занять на неопределённый срок!
Сижу разбираю
Спойлер:
Код:
function a() {

    alert('A!');

    function b(){
        alert('B!');
    }

    return b();
}

var s = a();
alert('break');
s();

Код:
function a() {

    alert('A!');

    function b(){
        alert('B!');
    }

    return b;
}

var s = a();
alert('break');
s();

Код:
function d() {
    function e() {
        alert('E');
    }
    return e;
}
d()();

Код:
function counter() {
    var count = 0;
    return function() {
        alert(count++);
    }
}
var count = counter();
count();
count();
count();

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Сб Дек 30, 2017 12:52 am

Ты прямо знал как меня занять на неопределённый срок!
Сижу разбираю
Обычный процесс программирования=)

Вот этот вариант хорош:
Код:
function counter() {
    var count = 0;
    return function() {
        alert(count++);
    }; //тут точка с запятой.
}
var count = counter();  //вот так лучше не делать
count();

//попробуй проделать это:
console.log(counter);
console.log(counter());
Дал небольшую подсказку. Если результат удивит - значит на правильном пути. Если не удивит, значит ты упустил кое-что важное.
Только не делай так: var count = counter();. А то совсем все запутается.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Сб Дек 30, 2017 1:09 am

и почему там точка с запятой?
и почему результат выполнения console.log(counter()); это:
Код:
ƒ () {
       console.log(count++);
    }

А как надо присваивать функции новую переменную тогда?

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Сб Дек 30, 2017 1:16 am

если не делать так
Код:
var count = counter();
а сразу написать counter();
то код функции не выполняется и мы не получим 0, тогда надо делать так, чтоб 0 получить:
Код:
function counter() {
    var count = 0;
    return function() {
      console.log(count++);
    };
}

counter()();

console.log(counter);
console.log(counter());

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Сб Дек 30, 2017 1:26 am

Ладно, я умываю руки. Давай после НГ=)
если не делать так
КОД:
var count = counter();
а сразу написать counter();
то код функции не выполняется и мы не получим 0, тогда надо делать так, чтоб 0 получить:
Ты 10 разных вещей одновременно пытаешься понять. Слишком большой обхват.

Мне кажется ты должен понять
почему результат выполнения console.log(counter()); это:
КОД:
ƒ () {
console.log(count++);
}
Но я не учитель, чтобы учить и направлять. Мы, помнится, вообще с другого начали.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Сб Дек 30, 2017 3:05 am

raingo пишет:
Мне кажется ты должен понять
почему результат выполнения console.log(counter()); это:
КОД:
ƒ () {
      console.log(count++);
   }
Но я не учитель, чтобы учить и направлять. Мы, помнится, вообще с другого начали.
Потому что
Код:
return function() {
      console.log(count++);
    };
не имеет исполнительного кода и является только ссылкой, её можно представить как return f; Поэтому команда console.log(counter());  запускает функцию counter(), которая возвращает нам ссылку на function() и мы видим код этой функции по ссылке. Это же делает и отдельная команда counter(); поэтому мы её запускаем дважды counter()(); и уже второй запуск выполняет нашу return функцию.

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Сб Дек 30, 2017 3:36 am

raingo пишет:
Код:
function turn(mytext){

 console.log(mytext); //для первого вызова

 return function m(text){

 console.log(text);

 return m;
 };
}

turn("Первый вызов")("Второй вызов")("Третий вызов")("Четвертый вызов");


а это можно представить вообще вот так:
Код:
 function turn (text){

 console.log(text);

 return turn;
 }



turn("Первый вызов")("Второй вызов")("Третий вызов")("Четвертый вызов");

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Чт Янв 04, 2018 1:51 pm

Вот код отрисовки квадрата в канвасе и цикличное движение вправо/влево:

Спойлер:
Код:
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');

var gameEngine;
var x=10,
    y=10;

function drawRect (){
context.fillStyle = 'black'; //цвет для рисования
context.clearRect(0,0,800,100);//очистка экрана
context.fillRect(x,y,50,50); // рисование квадрата
}

var nextGameStep = (function(){
    return requestAnimationFrame      ||
              mozRequestAnimationFrame    ||
              webkitRequestAnimationFrame ||
              oRequestAnimationFrame      ||
              msRequestAnimationFrame    ||
function (callback){
   setTimeout(callback, 1000/60);
};
})();

var gameEngineStart = function (callback){
gameEngine = callback;
   gameEngineStep();
};

var  gameEngineStep = function (){
   gameEngine();
   nextGameStep(gameEngineStep);

};

var setGameEngine = function (callback) {
gameEngine = callback;
};

 var gameLoopRight = function(){
   drawRect();
   x+=5;
    if (x>=700){
       setGameEngine(gameLoopLeft);
       }
};

 var gameLoopLeft = function(){
   drawRect();
   x-=5;
 if (x<0){
       setGameEngine(gameLoopRight);
       }
   };

gameEngineStart(gameLoopRight);

Начинается всё с кода gameEngineStart(gameLoopRight); и переходим в функцию
Код:
var gameEngineStart = function (callback){
gameEngine = callback;
   gameEngineStep();
};

Как будет выглядеть эта функция после получения всех аргументов?

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Чт Янв 04, 2018 3:28 pm

Как этот код выше свести в одну функцию?как оно всё подставляется и переходит из функции в функцию? Вот ниже я начал, но это неправильно, я хочу знать как это будет правильно. На каналах ютьюба такого нет почему-то.
Код:
gameEngineStart(gameLoopRight);

var gameEngineStart = function (gameLoopRight){    //var gameEngineStart = function (callback){
gameEngine = gameLoopRight;  //gameEngine = callback;
  gameEngineStep(){
              gameEngine(){
                drawRect(){
                    context.fillStyle = 'black'; //цвет для рисования
                    context.clearRect(0,0,800,100);//очистка экрана
                    context.fillRect(x,y,50,50); // рисование квадрата
                      }
                x+=5;
                if (x>=700){
                        var setGameEngine = function (gameLoopLeft) {      //setGameEngine(gameLoopLeft);
                        gameEngine = gameLoopLeft;
                                }; 
                }
};
  nextGameStep(gameEngineStep);

};
};



Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Чт Янв 04, 2018 3:57 pm

Это не нужно сводить в одну функцию. Один из важнейших принципов программирования - модульность. Нужно разбивать отдельные части на компоненты.

Вот это вообще главный цикл. Вернее менеджер. Его ничем нельзя забивать.
Код:
var gameEngineStart = function (callback){
gameEngine = callback;
   gameEngineStep();
};

Если хочешь сделать все заново, то тебе нужно написать функцию главного цикла (бесконечного), мы обсуждали как. И функцию рисования. Это как минимум две функции.

То, что в спойлере - большая часть кода относится к главному циклу. Сложная система, как мне кажется.


Последний раз редактировалось: raingo (Чт Янв 04, 2018 4:02 pm), всего редактировалось 1 раз(а)

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Чт Янв 04, 2018 4:00 pm

Вообще неправильно. И это считай невозможно. В одну функцию нельзя свести.
Либо пиши главный цикл с нуля, либо старайся разобраться без существенных изменений.
Спойлер:
Код:
gameEngineStart(gameLoopRight);

var gameEngineStart = function (gameLoopRight){    //var gameEngineStart = function (callback){
gameEngine = gameLoopRight;  //gameEngine = callback;
  gameEngineStep(){
              gameEngine(){
                drawRect(){
                    context.fillStyle = 'black'; //цвет для рисования
                    context.clearRect(0,0,800,100);//очистка экрана
                    context.fillRect(x,y,50,50); // рисование квадрата
                      }
                x+=5;
                if (x>=700){
                        var setGameEngine = function (gameLoopLeft) {      //setGameEngine(gameLoopLeft);
                        gameEngine = gameLoopLeft;
                                }; 
                }
};
  nextGameStep(gameEngineStep);

};
};

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Чт Янв 04, 2018 4:03 pm

да я знаю, что так никто не пишет, я хочу видеть вживую что куда вставляется. У меня нет месяцев, чтоб пробовать все коды подряд и я не работаю программистом , чтоб иметь постоянный опыт. Мне нужно один раз всё увидеть на пальцах, весь механизм, как оно есть , потому что теории у всех много, практики очень мало на самом деле, пошагового разбора практики нет практически ни у кого

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Чт Янв 04, 2018 4:23 pm

Сверх-озаряющий пост за пять минут (да и за 40) никто не сможет написать.

Ок, давай попробуем разобраться что к чему. Может попутно выдумаем свой способ. Помнишь как в js сделать бесконечный цикл? У нас где-то тут был код.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Чт Янв 04, 2018 4:49 pm

вот он
Код:
var gameLoop = function(){
    //...
    requestAnimationFrame(gameLoop); 
};

gameLoop();

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Чт Янв 04, 2018 5:05 pm

Наверное придется освежить http://game-dev.forum2x2.ru/t18-topic
Буду объяснять опираясь на свой код.

Для начала протестируем цикл. Изменим game.js
Код:
monkey("canvas");
fillRect(30, 30, 50, 50, "rgb(200,0,0)");


//////////////////////////////////
var x=10,
    y=10;

function drawRect (){
_ctx.fillStyle = 'black'; //цвет для рисования
_ctx.clearRect(10,10,300,50);//очистка экрана
_ctx.fillRect(x,y,50,50); // рисование квадрата
}

var gameLoop = function(){
  drawRect();
  x+=5;
  requestAnimationFrame(gameLoop); 
};

gameLoop();
//////////////////////////////////
Еще должен быть index.html и monkey.js

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Чт Янв 04, 2018 5:11 pm

Вот этот код является аналогом нашего бесконечного цикла:
Код:
var gameEngineStart = function (callback){
gameEngine = callback; //вместо callback у нас "gameLoopRight"
   gameEngineStep();
};

//вот этот код - умудренный вариант нашего бесконечного цикла,
//...gameEngine() установили в предыдущей функции
//...nextGameStep(gameEngineStep) циклит саму себя
var  gameEngineStep = function (){
   gameEngine();
   nextGameStep(gameEngineStep);

};

/*
...
*/

gameEngineStart(gameLoopRight); //стартуем главный цикл
По-моему мудренный какой-то способ. Лапша код. Сейчас попробую сделать по-своему.
В чем суть: этот лапша код нужен для того, чтобы можно было менять один бесконечный цикл на другой без заминки.


Последний раз редактировалось: raingo (Чт Янв 04, 2018 5:47 pm), всего редактировалось 2 раз(а)

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Чт Янв 04, 2018 5:46 pm

Собсно, я тоже сделал лапшу код. Суть точно такая же, как и у сканера. Попробую объяснить:
меняем последнюю часть game.js
Код:
//1 цикл игры
var MoveRight = function(){
 drawRect();
   x+=5;
};

//2 цикл игры
var MoveLeft = function(){
 drawRect();
   x-=5;
};


//функция смены лупа на произвольный
function setloop(callback){
 loop = callback;
}

var loop = function(){}; //loop - это просто пустая ссылка

//бесконечный цикл
var gameLoop = function(){

 if (x>=500) setloop(MoveLeft);
 if (x<=10) setloop(MoveRight);

 loop();

   requestAnimationFrame(gameLoop);  
};

setloop(MoveRight); //устанавливаем loop на нужный нам цикл,
 //иначе ничего не будет двигаться
gameLoop(); //запускаем цикл
//////////////////////////////////

Представим ситуацию, когда функция MoveRight - это уровень игры. Каждую итерацию главного цикла в теле gameLoop выполняется функция MoveRight.

gameLoop - это бесконечный цикл, до того, как он вызываем сам себя в коллбеке requestAnimationFrame(gameLoop); он вызывает функцию MoveRight. Но дело в том, что нам надо как-то автоматически менять MoveRight на любой другой (например, на MoveLeft). Как это реализовать?

Проще всего сделать пустую ссылку на функцию. Мы об этом кста тоже говорили. Это будет пустая переменная. Мы приравниваем её либо MoveRight, либо MoveLeft как нам захочется. И вызываем loop();

loop(), это не функция. Это грубо говоря ссылка на нужную нам функцию. Когда мы вызываем loop() мы на самом деле вызываем ту функцию, которую она хранит в своей памяти.

Наш главный цикл на самом деле должен выглядеть так:
Код:
//бесконечный цикл
var gameLoop = function(){

 loop();      //это либо MoveLeft, либо MoveRight

   requestAnimationFrame(gameLoop);  
};
А "if (x>=500) setloop(MoveLeft);" нужно перенести в функцию MoveRight. Это я для примера вставил её внутрь главного цикла.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Чт Янв 04, 2018 5:59 pm

У меня, чтобы запустить цикл вначале надо его указать, а затем запустить. Сканер чутка заморочился и у него сразу два в одном, отсюда путаница.
Код:
setloop(MoveRight); //устанавливаем loop на нужный нам цикл
gameLoop(); //запускаем цикл

//у сканера:
gameEngineStart(gameLoopRight);
Мы не можем засунуть в главный цикл первую настройку типа:
Код:
//НЕПРАВИЛЬНО:
var gameLoop = function(callback){

setloop(callback);
 loop();

  requestAnimationFrame(gameLoop); 
};

gameLoop(MoveRight);
Потому что теперь setloop(MoveRight); будет выполняться каждую итерацию цикла. Бесконечно. А это лишняя операция, отнимает ресурсы компьютера.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Чт Янв 04, 2018 10:42 pm

var loop = function(){}; //loop - это просто пустая ссылка - это вообще лишнее

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Dessan в Чт Янв 04, 2018 10:58 pm

Вообще класс, спасибо, надо вникать сидеть. Но я вообще немножко не то просил.

Вот у тебя есть отдельные функции setLoop и moveRight
что делает setLoop(moveRight)? Функция moveRight у нас является аргументом функции setLoop. Аргумент же должен куда-то подставляться в какой-то параметр. Вот как он туда подставляется?

Я уже не спрашиваю почему без строчки setLoop(moveRight) наша программа продолжает успешно работать.

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор raingo в Чт Янв 04, 2018 11:13 pm

moveRight подставляется в loop. После чего loop будет ссылкой на moveRight.

Когда мы в главном цикле выполняем loop() выполняется moveRight().

Если мы в setLoop(moveLeft) зададим moveLeft, то соответственно будет выполняться moveLeft().

Я уже не спрашиваю почему без строчки setLoop(moveRight) наша программа продолжает успешно работать.
Потому что loop - пустой. Просто в момент вызова loop() ничего не происходит.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы новичка

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Страница 2 из 8 Предыдущий  1, 2, 3, 4, 5, 6, 7, 8  Следующий

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения