Вопросы новичка
Участников: 4
Страница 2 из 8
Страница 2 из 8 • 1, 2, 3, 4, 5, 6, 7, 8
Re: Вопросы новичка
Вот более-менее правильный способ для множественных функций. Сейчас попробую через скобки.
- Код:
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- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
ай блеять, новый год, все. Отвлекают. Всем что-то от меня надо.
Только вошел в раж.
jquery множественные вызовы (если я правильно понял термин) как-то через скобки делает.
Только вошел в раж.
jquery множественные вызовы (если я правильно понял термин) как-то через скобки делает.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Распиши, пожалуйста, как это работает:
- Код:
function turn(mytext){
console.log(mytext); //для первого вызова
return function m(mytext){
console.log(mytext);
return m;
};
}
turn("Первый вызов")("Второй вызов")("Третий вызов")("Четвертый вызов");
Dessan- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
по очереди. Если поймешь как это происходит, то ты считай очень умный программист.
Мне то это легче далось, т.к. у мну уже опыт есть. А тебе скачек нужен.
Попробуй сам. Тут объяснение одна строчка. И эту строчку все равно не понятная окажется.
Мне то это легче далось, т.к. у мну уже опыт есть. А тебе скачек нужен.
Попробуй сам. Тут объяснение одна строчка. И эту строчку все равно не понятная окажется.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Ты прямо знал как меня занять на неопределённый срок!
Сижу разбираю
Сижу разбираю
- Спойлер:
- Код:
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- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Обычный процесс программирования=)Ты прямо знал как меня занять на неопределённый срок!
Сижу разбираю
Вот этот вариант хорош:
- Код:
function counter() {
var count = 0;
return function() {
alert(count++);
}; //тут точка с запятой.
}
var count = counter(); //вот так лучше не делать
count();
//попробуй проделать это:
console.log(counter);
console.log(counter());
Только не делай так: var count = counter();. А то совсем все запутается.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
и почему там точка с запятой?
и почему результат выполнения console.log(counter()); это:
А как надо присваивать функции новую переменную тогда?
и почему результат выполнения console.log(counter()); это:
- Код:
ƒ () {
console.log(count++);
}
А как надо присваивать функции новую переменную тогда?
Dessan- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
если не делать так
то код функции не выполняется и мы не получим 0, тогда надо делать так, чтоб 0 получить:
- Код:
var count = counter();
то код функции не выполняется и мы не получим 0, тогда надо делать так, чтоб 0 получить:
- Код:
function counter() {
var count = 0;
return function() {
console.log(count++);
};
}
counter()();
console.log(counter);
console.log(counter());
Dessan- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Ладно, я умываю руки. Давай после НГ=)
Мне кажется ты должен понять
Ты 10 разных вещей одновременно пытаешься понять. Слишком большой обхват.если не делать так
КОД:
var count = counter();
а сразу написать counter();
то код функции не выполняется и мы не получим 0, тогда надо делать так, чтоб 0 получить:
Мне кажется ты должен понять
Но я не учитель, чтобы учить и направлять. Мы, помнится, вообще с другого начали.почему результат выполнения console.log(counter()); это:
КОД:
ƒ () {
console.log(count++);
}
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Потому чтоraingo пишет:
Мне кажется ты должен понятьНо я не учитель, чтобы учить и направлять. Мы, помнится, вообще с другого начали.почему результат выполнения console.log(counter()); это:
КОД:
ƒ () {
console.log(count++);
}
- Код:
return function() {
console.log(count++);
};
Dessan- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
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- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Вот код отрисовки квадрата в канвасе и цикличное движение вправо/влево:
Начинается всё с кода gameEngineStart(gameLoopRight); и переходим в функцию
Как будет выглядеть эта функция после получения всех аргументов?
- Спойлер:
- Код:
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- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Как этот код выше свести в одну функцию?как оно всё подставляется и переходит из функции в функцию? Вот ниже я начал, но это неправильно, я хочу знать как это будет правильно. На каналах ютьюба такого нет почему-то.
- Код:
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- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Это не нужно сводить в одну функцию. Один из важнейших принципов программирования - модульность. Нужно разбивать отдельные части на компоненты.
Вот это вообще главный цикл. Вернее менеджер. Его ничем нельзя забивать.
Если хочешь сделать все заново, то тебе нужно написать функцию главного цикла (бесконечного), мы обсуждали как. И функцию рисования. Это как минимум две функции.
То, что в спойлере - большая часть кода относится к главному циклу. Сложная система, как мне кажется.
Вот это вообще главный цикл. Вернее менеджер. Его ничем нельзя забивать.
- Код:
var gameEngineStart = function (callback){
gameEngine = callback;
gameEngineStep();
};
Если хочешь сделать все заново, то тебе нужно написать функцию главного цикла (бесконечного), мы обсуждали как. И функцию рисования. Это как минимум две функции.
То, что в спойлере - большая часть кода относится к главному циклу. Сложная система, как мне кажется.
Последний раз редактировалось: raingo (Чт Янв 04, 2018 4:02 pm), всего редактировалось 1 раз(а)
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Вообще неправильно. И это считай невозможно. В одну функцию нельзя свести.
Либо пиши главный цикл с нуля, либо старайся разобраться без существенных изменений.
Либо пиши главный цикл с нуля, либо старайся разобраться без существенных изменений.
- Спойлер:
- Код:
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- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
да я знаю, что так никто не пишет, я хочу видеть вживую что куда вставляется. У меня нет месяцев, чтоб пробовать все коды подряд и я не работаю программистом , чтоб иметь постоянный опыт. Мне нужно один раз всё увидеть на пальцах, весь механизм, как оно есть , потому что теории у всех много, практики очень мало на самом деле, пошагового разбора практики нет практически ни у кого
Dessan- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Сверх-озаряющий пост за пять минут (да и за 40) никто не сможет написать.
Ок, давай попробуем разобраться что к чему. Может попутно выдумаем свой способ. Помнишь как в js сделать бесконечный цикл? У нас где-то тут был код.
Ок, давай попробуем разобраться что к чему. Может попутно выдумаем свой способ. Помнишь как в js сделать бесконечный цикл? У нас где-то тут был код.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
вот он
- Код:
var gameLoop = function(){
//...
requestAnimationFrame(gameLoop);
};
gameLoop();
Dessan- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Наверное придется освежить https://game-dev.forum2x2.ru/t18-topic
Буду объяснять опираясь на свой код.
Для начала протестируем цикл. Изменим game.js
Буду объяснять опираясь на свой код.
Для начала протестируем цикл. Изменим 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();
//////////////////////////////////
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Вот этот код является аналогом нашего бесконечного цикла:
В чем суть: этот лапша код нужен для того, чтобы можно было менять один бесконечный цикл на другой без заминки.
- Код:
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- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Собсно, я тоже сделал лапшу код. Суть точно такая же, как и у сканера. Попробую объяснить:
меняем последнюю часть game.js
Представим ситуацию, когда функция MoveRight - это уровень игры. Каждую итерацию главного цикла в теле gameLoop выполняется функция MoveRight.
gameLoop - это бесконечный цикл, до того, как он вызываем сам себя в коллбеке requestAnimationFrame(gameLoop); он вызывает функцию MoveRight. Но дело в том, что нам надо как-то автоматически менять MoveRight на любой другой (например, на MoveLeft). Как это реализовать?
Проще всего сделать пустую ссылку на функцию. Мы об этом кста тоже говорили. Это будет пустая переменная. Мы приравниваем её либо MoveRight, либо MoveLeft как нам захочется. И вызываем loop();
loop(), это не функция. Это грубо говоря ссылка на нужную нам функцию. Когда мы вызываем loop() мы на самом деле вызываем ту функцию, которую она хранит в своей памяти.
Наш главный цикл на самом деле должен выглядеть так:
меняем последнюю часть 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);
};
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
У меня, чтобы запустить цикл вначале надо его указать, а затем запустить. Сканер чутка заморочился и у него сразу два в одном, отсюда путаница.
- Код:
setloop(MoveRight); //устанавливаем loop на нужный нам цикл
gameLoop(); //запускаем цикл
//у сканера:
gameEngineStart(gameLoopRight);
- Код:
//НЕПРАВИЛЬНО:
var gameLoop = function(callback){
setloop(callback);
loop();
requestAnimationFrame(gameLoop);
};
gameLoop(MoveRight);
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы новичка
var loop = function(){}; //loop - это просто пустая ссылка - это вообще лишнее
Dessan- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
Вообще класс, спасибо, надо вникать сидеть. Но я вообще немножко не то просил.
Вот у тебя есть отдельные функции setLoop и moveRight
что делает setLoop(moveRight)? Функция moveRight у нас является аргументом функции setLoop. Аргумент же должен куда-то подставляться в какой-то параметр. Вот как он туда подставляется?
Я уже не спрашиваю почему без строчки setLoop(moveRight) наша программа продолжает успешно работать.
Вот у тебя есть отдельные функции setLoop и moveRight
что делает setLoop(moveRight)? Функция moveRight у нас является аргументом функции setLoop. Аргумент же должен куда-то подставляться в какой-то параметр. Вот как он туда подставляется?
Я уже не спрашиваю почему без строчки setLoop(moveRight) наша программа продолжает успешно работать.
Dessan- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы новичка
moveRight подставляется в loop. После чего loop будет ссылкой на moveRight.
Когда мы в главном цикле выполняем loop() выполняется moveRight().
Если мы в setLoop(moveLeft) зададим moveLeft, то соответственно будет выполняться moveLeft().
Когда мы в главном цикле выполняем loop() выполняется moveRight().
Если мы в setLoop(moveLeft) зададим moveLeft, то соответственно будет выполняться moveLeft().
Потому что loop - пустой. Просто в момент вызова loop() ничего не происходит.Я уже не спрашиваю почему без строчки setLoop(moveRight) наша программа продолжает успешно работать.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Страница 2 из 8 • 1, 2, 3, 4, 5, 6, 7, 8
Страница 2 из 8
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|