Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Settimeout( "speed", "right" ) (https://javascript.ru/forum/misc/55982-settimeout-speed-right.html)

Maxsim_Smolim 24.05.2015 08:14

Settimeout( "speed", "right" )
 
Как сделать чтобы функция Settimeout через 3 секунды вызвала RIGHT: player.row(2); speed = 10; prop = 'right';
А не по клавишам.


$(function() {

	var player = $('#player1').sprite({
		cellSize: [32,32],
		cells: [4, 3],
		initCell: [2,0],
		offset: [4, 0],
		wrap: true
	}).css({left: 5, top:440});

	var UP = 87,
		DOWN = 83,
		LEFT = 65,
		RIGHT = 68,
		direct = DOWN,
		speed = 43,
		prop = 'top',
		BOARD_WIDTH = 1000,
		BOARD_HEIGHT = 1000,
		char = false;

	$(window).keydown(function(e) {
		var key = e.which;

		if($.inArray(key, [UP,DOWN,LEFT,RIGHT]) >= 0) {
			if (key == direct) {
				player.next();
				var nextPos = parseInt(player.css(prop),10) + speed;
				if (prop == 'top') {
					if(nextPos < 0) nextPos = BOARD_HEIGHT - 1;
					player.css(prop, nextPos % BOARD_HEIGHT);
				} else if (prop == 'left') {
					if(nextPos < 0) nextPos = BOARD_WIDTH - 1;
					player.css(prop, nextPos % BOARD_WIDTH);
				}
			} else {
				switch(key) {
					case UP: player.row(3); speed = -10; prop = 'top'; break;
					case DOWN: player.row(0); speed = 10; prop = 'top'; break;
					case LEFT: player.row(1); speed = -10; prop = 'left'; break;
					case RIGHT: player.row(2); speed = 10; prop = 'left'; break;
					
				}
				direct = key;
				
				
				
				
			}
		} else if (key == 13) {
			char = !char;
			player.offset(char ? 93 : 0,0);
		}
	});
});



<span id="player1" class="player"></span>

ruslan_mart 25.05.2015 16:06

Maxsim_Smolim, тебе нужно имитировать нажатие стрелочки или что?

Maxsim_Smolim 25.05.2015 20:02

Не по стрелочкам, и по клавишам я знаю как.! Дело в том что когда жмёшь на 65-тую то есть "D" допустим то player1 двигается влево.! А я не могу понять как сделать, что бы не по клавишам он двигался, а например через Settimeout через 3 секунды результат был такой же что жмёшь на "D" то есть через определённое время он, влево двигался, а не по нажатию.!

ruslan_mart 25.05.2015 21:23

Maxsim_Smolim,

попробуй так:

setTimeout(function() {
    player.row(1);
    speed = -10;
    prop = 'left';
}, 2000);


Но а вообще, если по хорошему, то каждое движение нужно делать отдельной ф-цией/методом.

Maxsim_Smolim 25.05.2015 22:17

Ну уже что то.! Так он только поворачивается на лева. Но не идёт. А на счёт "отдельной ф-цией/методом" возьму на заметку.!) ))

Leon-on12 25.05.2015 22:26

Maxsim_Smolim,
Конечно поворачивается. Ты же эмулируеш быстрое быстрое нажатие, а не keyDown
Так что у тебя нажатие происходит долю секунды. А не с задержкой. Будь внимателен к тому что ты вызываешь.

Maxsim_Smolim 25.05.2015 22:57

Так почему не идёт.???

Leon-on12 26.05.2015 11:14

Maxsim_Smolim,
Почитал код. Проблема та же. Ты эмулируешь одно событие. А тебе нужно эмулировать залипание.

setTimeout(function() {   
    var stopInter = 0;
    var inerv = setInterval(function() {
        player.row(1);
        speed = -10;
        prop = 'left';
        stopInter++;
        if (stopInter>30)clearInterval(inerv);  //Вместо 30 поставь любое число. Смотря сколько тебе нужно что бы он шел. надеюсь пойдёт.
    }, 10)  //Попробуй так же уменьшить интервал. Может пойдёт.
}, 2000);


Проблема в том что эти строчки эквивалентны быстрому быстрому нажатию кнопки вправо. А не зажатию этой кнопки.

Хотя моё решение и представляет из себя быстрое быстрое многократное нажатие клавиши вправо, но может он сдвинется.

Maxsim_Smolim 26.05.2015 21:06

Неа не идёт, уже по всякому разному перепробовал, стоит и всё.!

Leon-on12 26.05.2015 22:18

ААААА; Чёрт побери;
Jsовским же языком написано:
if (key == direct)

Если нажатая стрелочка совпадает с направлением переместить перса.
else

В противном случае повернуть перса. Вот этот код и поворачивает перса.
player.row(2); speed = 10; prop = 'left'


А Нам нужно другое.
player.next();
                var nextPos = parseInt(player.css(prop),10) + speed;
                if (prop == 'top') {
                    if(nextPos < 0) nextPos = BOARD_HEIGHT - 1;
                    player.css(prop, nextPos % BOARD_HEIGHT);
                } else if (prop == 'left') {
                    if(nextPos < 0) nextPos = BOARD_WIDTH - 1;
                    player.css(prop, nextPos % BOARD_WIDTH);
                }

Дельше убираем всё лишнее и оборачиваем задержкой.
setTimeout(function() { 
                //speed = ; //Можно попробовать поиграться со скоростью. И посмотреть что из этого выйдет. Видимо по структуре кода, игра пошаговая. И зажатия клавиш в принципе нет. 
                player.next();
                var nextPos = parseInt(player.css(prop),10) + speed;
                if(nextPos < 0) nextPos = BOARD_WIDTH - 1;  //Не знаю зачем этот if, оставлю его на всякий случай;
                player.css(prop, nextPos % BOARD_WIDTH);
}, 3000);


Часовой пояс GMT +3, время: 12:48.