Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание искусственного времени [D7, Win2k]


!Trinix ©   (2005-06-10 15:28:00) 

Я создаю игру, как The Sims (подробнее на sgstd.nm.ru), со временем у меня полный порядок, но с датой не выходит. Дата у меня принадлежит к типу TDayOfWeek. Когда время становится 24(00) часа, то настает следующий день, но почему-то день не ихменяется и вообще t.Day равняется 0. Помогите, пожалуйста, вот мой код:
procedure Timer
type
TCanTime = 0..59;
TDayOfWeek = 1..7;
TCurTime = record
Minutes : TCanTime;
Hours : TCanTime;
Day : TDayOfWeek;
end;

var
t : TCurTime;

procedure TForm1.Timer_TimeTimer(Sender: TObject);
begin
t.Minutes := t.Minutes + 1;
if t.Minutes > 58 then begin
t.Minutes := 0;
t.Hours := t.Hours + 1;
end;
if t.Hours > 23 then begin
t.Hours := 0;
if t.Day = 1 then t.Day := 2;
if t.Day = 2 then t.Day := 3;
if t.Day = 3 then t.Day := 4;
if t.Day = 4 then t.Day := 5;
if t.Day = 5 then t.Day := 6;
if t.Day = 6 then t.Day := 7;
if t.Day = 7 then t.Day := 1;
end;
LabelHour.Caption := IntToStr(t.Hours);
LabelMinutes.Caption := IntToStr(t.Minutes);
case t.Day of
1 : LabelDay.Text := 'пон';
2 : LabelDay.Text := 'втр';
3 : LabelDay.Text := 'срд';
4 : LabelDay.Text := 'чтв';
5 : LabelDay.Text := 'пят';
6 : LabelDay.Text := 'суб';
7 : LabelDay.Text := 'вос';
end;
end;


!Trinix   (2005-06-10 16:46:00) [1]

Спасибо, моя вина - сам недосмотрел с прибавлением дня.
Туплю...:)


Alexander Panov   (2005-06-10 16:18:00) [2]

type

 THH=0..23;
 TMM=0..59;
 TDD=1..7;

 TSyntheticTime=class
 private
   FDaysWeek: array[1..7] of String;
   FDay: TDD;
   FHH: THH;
   FMM: TMM;

   function GetDay: String;

 public
   constructor Create(aDay: TDD; aHH: THH; aMM: TMM);

   procedure NextTime;

   property DayOfWeek: String read GetDay;
   property DD: TDD read FDay write FDay;
   property HH: THH read FHH write FHH;
   property MM: TMM read FMM write FMM;
 end;

var
 Form1: TForm1;
 ST: TSyntheticTime;

constructor TSyntheticTime.Create(aDay: TDD; aHH: THH; aMM: TMM);
begin
 FHH := aHH;
 FMM := aMM;
 FDay := aDay;
 FDaysWeek[1] :='пон';
 FDaysWeek[2] :='втр';
 FDaysWeek[3] :='срд';
 FDaysWeek[4] :='чтв';
 FDaysWeek[5] :='пят';
 FDaysWeek[6] :='суб';
 FDaysWeek[7] :='вос';
end;

function TSyntheticTime.GetDay: String;
begin
 Result := FDaysWeek[FDay];
end;

procedure TSyntheticTime.NextTime;
begin
 if FMM=59 then
 begin
   FMM := 0;
   if FHH=23 then
   begin
     FHH := 0;
     if FDay=7
     then FDay := 1
     else FDay := FDay+1;
   end
   else FHH := FHH+1;
 end
 else FMM := FMM+1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ST := TSyntheticTime.Create(1,0,0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Label1.Caption := ST.DayOfWeek+' '+ IntToStr(ST.HH)+':'+IntToStr(ST.MM);
 ST.NextTime;
end;


Чапаев   (2005-06-10 16:17:00) [3]

if Day<High(TDayOfWeek)
 then Inc(Day)
 else Day:=Low(TDayOfWeek);


default   (2005-06-10 15:56:00) [4]

TUser ©   (10.06.05 15:53) [11]
так я это и написал:)


TUser   (2005-06-10 15:53:00) [5]

> Ega23 ©   (10.06.05 15:44) [4]
> default ©   (10.06.05 15:49) [8]

t.Day:=(t.Day mod 7)+1;


Antonn   (2005-06-10 15:51:00) [6]

incDay не переплюнуть:)


-=XP=-   (2005-06-10 15:50:00) [7]

P.S. Я Ваш "шедевр" распечатал и на стену повесил. :)


-=XP=-   (2005-06-10 15:49:00) [8]

Посмотрите в сторону TDateTime и не изобретайте двухколесное транспортное средство.


default   (2005-06-10 15:49:00) [9]

t.day:= (t.day mod 7) + 1
Ega23 ©   (10.06.05 15:44) [4]
(6 + 1) mod 7 = 0
а должно давать 7


TUser   (2005-06-10 15:47:00) [10]

Сорри, не то ляпнул.


TUser   (2005-06-10 15:46:00) [11]

t.Day:=[4]+1;


Ega23   (2005-06-10 15:44:00) [12]

А вообще t.day:=(t.day+1) mod 7;


Ega23   (2005-06-10 15:41:00) [13]

2 TUser ©   (10.06.05 15:40) [1]
Как ты думаешь, что получиться в результате последоватлеьного выполнения вот этих строчек, если t.Day = 1?

Да даже, если t.Day = 2 или t.Day =7


TUser   (2005-06-10 15:40:00) [14]

Как ты думаешь, что получиться в результате последоватлеьного выполнения вот этих строчек, если t.Day = 1?


> if t.Day = 1 then t.Day := 2;
> if t.Day = 2 then t.Day := 3;
> if t.Day = 3 then t.Day := 4;
> if t.Day = 4 then t.Day := 5;
> if t.Day = 5 then t.Day := 6;
> if t.Day = 6 then t.Day := 7;
> if t.Day = 7 then t.Day := 1;


Подсказка - строчки выполняются действительно последовательно, никакого ветвления или циклов тут нет.


Ega23   (2005-06-10 15:40:00) [15]

1.  if t.Minutes > 58 then begin   Может быть 59?
2.
if t.Day = 1 then t.Day := 2
if t.Day = 2 then t.Day := 3;
if t.Day = 3 then t.Day := 4;
if t.Day = 4 then t.Day := 5;
if t.Day = 5 then t.Day := 6;
if t.Day = 6 then t.Day := 7;
if t.Day = 7 then t.Day := 1;

У тебя t.Day ВСЕГДА будет 1. Почему - подумай.


Наверх

Титульная страница Поиск, карта сайта Написать письмо