// расчет времени суток, а так же смена его, при необходимости private void timer_Tick(object sender, EventArgs e) { tick++; if (tick == tickInterval) { int hourBefore = dayTime.Hour; dayTime = dayTime.AddMinutes(dayTimeTick); if (WorkWithTime.IsNight(dayTime.Hour) && !net.IsNearLamp(new Point(lastClickNet.X + beginRenderNet.X, lastClickNet.Y + beginRenderNet.Y))) goingTime = dayTimeTick * 2; else goingTime = dayTimeTick; gameTime = gameTime.AddMinutes(-goingTime); // условие проигрыша if (gameTime.Day == 9) { OutMessageBox("время закончилось!!!", "Game end"); Close(); } GameTime.Text = gameTime.ToString("yyyy-MM-dd HH':'mm':'ss"); Time.Text = dayTime.ToShortTimeString(); // перерисовываем, если день сменился ночью или наоборот if (WorkWithTime.TimesOfDay(hourBefore, dayTime.Hour)) AllRender(); tick = 0; } }
// перерисовка всех отображаемых в данный момент объектов private void AllRender() { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); GameRendering.RenderNet(net, beginRenderNet, Scene, scale, WorkWithTime.IsNight(dayTime.Hour)); GameRendering.RenderMouseClickAlgorithmPoint(lastClickNet.X, lastClickNet.Y, Textures.CurrentCharactert); GameRendering.RenderWayByAlgorithmPoint(way); GameRendering.RenderMouseClickGraphPoint(currentClickGraph.X, currentClickGraph.Y, Textures.TransparentCharacter); GameRendering.RenderMouseClickAlgorithmPoint(subClickNet.X, subClickNet.Y, Textures.TransparentCharacter); Scene.Invalidate(); }
// вспомогательный метод, расчет пути по предполагаемому расположению персонажа // и отображение минут, которых потребуется на этот переход private void CalculationPathForCurrentCell() { subClickNet.X = lastClickNetWithoutOffset.X; subClickNet.Y = lastClickNetWithoutOffset.Y; way = GameControl.FindPath(net.CellsOfNet, lastClickNet, subClickNet, beginRenderNet, scale); if (way?.Count > 1) { distance = WorkWithTime.SubTotalTimeCountingForWay(way, DateTime.Parse(Time.Text), beginRenderNet, net, dayTimeTick); TravelTime.Text = distance.ToString(); } else { TravelTime.Text = "0"; distance = 0; } AllRender(); }
// двойной клик на клетку, расчет времени и отображение персонажа в новой позиции private void Scene_MouseDoubleClick(object sender, MouseEventArgs e) { int mouseArgX = e.X; int mouseArgY = Scene.Height - e.Y; // инвертирование значения ординаты курсора var currentClickNet = GameRendering.GraphPointToAlgorithmPoint(mouseArgX, mouseArgY); lastClickNetWithoutOffset.X = currentClickNet.X; lastClickNetWithoutOffset.Y = currentClickNet.Y; currentClickNet.X += beginRenderNet.X; currentClickNet.Y += beginRenderNet.Y; if (net.IsFree(currentClickNet)) { subClickNet.X = lastClickNetWithoutOffset.X; subClickNet.Y = lastClickNetWithoutOffset.Y; way = GameControl.FindPath(net.CellsOfNet, lastClickNet, subClickNet, beginRenderNet, scale); if (way?.Count > 1) distance = WorkWithTime.SubTotalTimeCountingForWay(way, DateTime.Parse(Time.Text), beginRenderNet, net, dayTimeTick); MoveCharacterAndRecountingPath(currentClickNet); flagForFirstDrawing = true; } }