PDA

Просмотр полной версии : Date: Время суток, как отлавливать переход день/ночь


Хемуль
25.10.2006, 00:12
В последнее время часто задают эти вопросы, а после того, как сразу два пользователя написали мне личные сообщения по этому поводу, решил создать эту тему. Наверняка были уже подобные, но чего-то их никто не может найти. Пусть будет ещё такой пример, тем более, что в личные сообщения прикреплять файлы нельзя. Код я постарался прокомментировать. Если будут вопросы, пишите.
Нижеприведённый код в зависимости от времени суток прикрепляет на сцену из библиотеки изображение солнца или луны.

// Час, когда начинается ночь. По сути первый час ночи.
var nightBeginHour:Number = 22;
// Час, когда заканчивается ночь. По сути первый час дня.
var nightEndHour:Number = 5
// Интервал в миллисекундах, который определяет периодичность проверки времени.
var timeCheckInterval:Number = 1000;
// Булево значение, в которой хранятся данные о том, какая сейчас часть суток.
// Данная переменная необходима для осуществления перехода день/ночь.
// Получаем текущую часть суток и сохраняем в переменную currentDayStatus.
var currentDayStatus:Boolean = isThereIsDayNow();

// Инициализируем начальное состояние обьектов для текущей части суток.
// Для данного примера вызываем функцию создания на сцене небесного светила,
// соответствующего дню/ночи.
attachCurrentPlanet();

// Устанавливаем таймер для проверки времени через
// каждые timeCheckInterval секунд.
var timer:Number = setInterval(this, "checkTime", timeCheckInterval);

// Функция, возвращающая true, если сейчас день и false, если сейчас ночь.
function isThereIsDayNow():Boolean
{
// Создаём обьект Date для того, чтобы получить текущее время.
var myDate:Date = new Date();
// Проверяем, лежит ли значение текущего часа в пределах дня или нет.
return ((myDate.getHours() >= nightEndHour) && (myDate.getHours() < nightBeginHour))
}

// Функция проверки времени
function checkTime()
{
// В булеву переменную newDayStatus заносим данные о том,
// какая сейчас часть суток.
var newDayStatus:Boolean = isThereIsDayNow();
// Проверяем, произошёл ли переход день/ночь, то есть, изменилась ли текущая
// часть суток.
if (newDayStatus != currentDayStatus)
{
// Если переход день/ночь произошёл, сохраняем данные о текущей
// части суток в currentDayStatus.
currentDayStatus = newDayStatus;
// И производим необходимые действия.
// Для данного примера удаляем старое небесное светило и вытаскиваем
// из библиотеки на его место новое светило, соответствующее текущей
// части суток.
this.planet.removeMovieClip();
attachCurrentPlanet();
}
}

// Функция для примера
function attachCurrentPlanet()
{
// Для этого примера в зависимости от текущей части суток на сцену
// из библиотеки выкладывается солнце или луна.
// Мувиклип светила увеличивается в 2 раза и центрируется относительно сцены.
var planetClip:MovieClip = this.attachMovie(currentDayStatus ? "sun" : "moon", "planet", this.getNextHighestDepth());
planetClip._xscale *= 2;
planetClip._yscale *= 2;
planetClip._x = (Stage.width - planetClip._width) / 2;
planetClip._y = (Stage.height - planetClip._height) / 2;
}

Исходник прикрепляю...

Котяра2006
25.10.2006, 01:00
есть ведь добрые люди на земле, спасибо, пригодится :)

repz
25.10.2006, 11:25
2 Хемуль:
И все же не про то я спрашивал.... как бы по точнее....
Как через определенный промежуток времени выполнять одно и то же действие?

Хемуль
25.10.2006, 13:13
2 repz:

// Интервал в миллисекундах.
var repeatInterval:Number = 1000;
// Создаём таймер.
var timer:Number = setInterval(functionToRepeat, repeatInterval);

// Описываем функцию, которая будет повторяться через repeatInterval.
function functionToRepeat()
{
// Действие, которое повторяется через repeatInterval
}

repz
25.10.2006, 13:39
2 Хемуль:
a_mc._visible=false;
b_mc._visible=false;
c_mc._visible=false;

var repeatInterval:Number = 1000;

var timer:Number = setInterval("functionToRepeat", repeatInterval);


function functionToRepeat()
{

var socket:XMLSocket = new XMLSocket();
if (!socket.connect("10.0.8.2",139)) {
c_mc._visible=true;
}
socket.onConnect = function(success:Boolean):Void {
if (!success) {
b_mc._visible=true;
} else {
a_mc._visible=true;
}
}
}
Что т не работает.

Хемуль
25.10.2006, 14:03
2 repz:
А что вы хотели получить?

repz
25.10.2006, 14:21
Проверку своего условия через 1000 мл/сек

Хемуль
25.10.2006, 15:18
2 repz:
А так:

var timer:Number = setInterval(functionToRepeat, repeatInterval);

либо так:

var timer:Number = setInterval(this, "functionToRepeat", repeatInterval);

Я извиняюсь - я там кавычки забыл убрать... Второй вариант - вызов функции как метода.

repz
25.10.2006, 15:52
2 Хемуль:
a_mc._visible=false;
b_mc._visible=false;
c_mc._visible=false;
var socket:XMLSocket = new XMLSocket();
var repeatInterval:Number = 500;

var timer:Number = setInterval(this, "functionToRepeat", repeatInterval);


function functionToRepeat()
{
if (!socket.connect("10.0.8.2",139)) {
c_mc._visible=true;
}
socket.onConnect = function(success:Boolean):Void {
if (!success) {
b_mc._visible=true;
} else {
a_mc._visible=true;
}
}
}
Так работает, но почему-то только в одну сторону, т.е. есть соединение показывает a_mc, нет соединения показывает b_mc, а вот если снова есть, то a_mc обратно не показывает.

Хемуль
25.10.2006, 16:25
2 repz:
Ну, я вам показал, как делать проверку через определённое время... Разьирайтесь с кодом сокета... А вообще, как мне кажется, некорректно так делать, как вы делаете. Вы уверены, что onConnect выполняется раньше, чем пройдёт 500 миллисекунд?

repz
25.10.2006, 16:33
2 Хемуль:
Ну пока только так умею. onConnect срабатывает через 500 млсек. Здесь вопрос в другом почему повторно не возвращает другое значение. Да кстати не возвращает и из положения нет сети b_mc, есть сеть - a_mc - не срабатывает.
P.S. a_mc - b_mc - работает
b_mc - a_mc - не работает

AxelRB
13.03.2007, 08:49
Сорри, что поднимаю старую тему.
Где-то с месяц назад написал код, определяющий время восхода и заката для заданной широты (может не работать для полярной ночи/дня).
Погрешность около 10 минут.
Использовал http://en.wikipedia.org/wiki/sunrise_equation

var LAT:Number = 42; // широта местности

function toRad(x:Number) {
return x*Math.PI/180;
}

function toDeg(x:Number) {
return x*180/Math.PI;
}

function getMin(t:Number) {
return Math.floor((t-Math.floor(t))*60);
}

var T:Date = new Date();
var startOfYear:Date = new Date(T.getYear()+1900, 0, 1);
var doy:Number = Math.floor((T-startOfYear)/86400000)+1;

var decl:Number = -23.45*Math.cos(toRad((doy+10)*360/365))
var st:Number = toDeg(Math.acos(-Math.tan(toRad(LAT))*Math.tan(toRad(decl))))/15+0.1;
var stSunrise = 13.25-st;
var stSunset = 13.25+st;
trace(Math.floor(stSunrise)+":"+getMin(stSunrise));
trace(Math.floor(stSunset)+":"+getMin(stSunset));

etc
13.03.2007, 13:27
Замечательно, только уж если либо вы используете типизацию везде, либо никогда.

AxelRB
14.03.2007, 09:45
Замечательно, только уж если либо вы используете типизацию везде, либо никогда.
:victory:
Ну если совсем по-хорошему то тогда:
funtion solveSunriseQuotion(LAT:Number):Object {
...
return {sunrise: 13.25-st, sunset: 13.25+st};
}
;)

etc
14.03.2007, 11:34
Нет-нет, в приведенном коде в шести местах типизация отсутствует.

AxelRB
15.03.2007, 11:46
__etc
О великий человек-компилятор, может тогда стоить меня ткнуть носом, как котёнка, а не говорить загадками? :D
Ну ладно, у функций :Number забыл написать, stSunrise и stSunset вообще выкинуть надо (см. выше)... Где шестое место???

iNils
15.03.2007, 12:04
Не знаю где 6-ое, но вижу еще три :) Не указаны типы возращаемые методами.

AxelRB
15.03.2007, 12:12
Не указаны типы возращаемые методами.
Я это и имел ввиду (видимо):
Ну ладно, у функций :Number забыл написать
PS: Это не методы, это функции... :) Нет, ну конечно можно долго спорить, что это user-defined методы объекта _root, но все-таки более привычно методами называть функции объявленные внутри "class".

etc
15.03.2007, 13:04
И что? Они должны иметь тип возврата. Функции внутри класса — методы.