From ae6aff16a5ac0544ab70d85d57d810cc657a9fc6 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 00:34:36 +0300 Subject: [PATCH 01/21] Map format change --- DangerousD/Content/debug.tmx | 371 +++++++++++++++++++++ DangerousD/Content/lvl.tmx | 12 +- DangerousD/Content/tiles.BMP | Bin 0 -> 668982 bytes DangerousD/GameCore/Managers/AppManager.cs | 2 +- DangerousD/GameCore/Managers/MapManager.cs | 5 +- 5 files changed, 381 insertions(+), 9 deletions(-) create mode 100644 DangerousD/Content/debug.tmx create mode 100644 DangerousD/Content/tiles.BMP diff --git a/DangerousD/Content/debug.tmx b/DangerousD/Content/debug.tmx new file mode 100644 index 0000000..de462c2 --- /dev/null +++ b/DangerousD/Content/debug.tmx @@ -0,0 +1,371 @@ + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570 + + +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,50,50,50,50,50, +0,0,0,0,0,0,0,0,0,0,0,50,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,50,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +371,371,371,371,371,371,371,371,371,371,371,371,371,371,371,371, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +371,371,371,371,371,371,371,371,371,371,371,371,371,371,371,371, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +49,49,49,49,49,49,49,49,49,49,49,49,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370 + + +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +382,383,0,0,0,0,0,0,0,0,382,383,0,0,0,0, +395,396,0,0,0,0,0,0,0,0,395,396,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,382,383,0,0,0,0,0,0,0,0,382,383, +0,0,0,0,395,396,0,0,0,0,0,0,0,0,395,396, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DangerousD/Content/lvl.tmx b/DangerousD/Content/lvl.tmx index 271b1e5..d643830 100644 --- a/DangerousD/Content/lvl.tmx +++ b/DangerousD/Content/lvl.tmx @@ -1,7 +1,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -130,19 +130,19 @@ 0,0,0,0,0,0,0,0,0,0,13,75,0,0,0,0 -52,0,0,0,52,0,0,0,52,52,52,52,52,52,52,52, +52,0,0,0,0,0,0,0,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -52,52,0,0,52,0,0,52,52,52,52,52,52,52,52,52, +52,52,0,0,0,0,0,52,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -52,52,52,0,52,0,52,52,52,52,52,52,52,52,52,52, +52,52,52,0,0,0,52,52,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -311,7 +311,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -517,7 +517,7 @@ - + 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, diff --git a/DangerousD/Content/tiles.BMP b/DangerousD/Content/tiles.BMP new file mode 100644 index 0000000000000000000000000000000000000000..a9709a09d41fed0b00c3abe188c136694e915519 GIT binary patch literal 668982 zcmeFaOOh=+vMY9Erj|zVhVYu|=ng>r*Q)_(I5nI%pfbCH6C?uR`~+ita%bjVv{g(H z4hNkK&&WLceCq%GU;p+0{9pgX_%HnLf8u}t8~^*i|IdH^`9J>oA3zv2&IRXx|MSmF zKL1}Cz14qz#^(m?2GAk@`q#hyUB-X@^B;WeXON*;cIKzw>{35)dIRh?wj4UGA8fWy zzfEuO6S#8&dbtf-uD;puW%-K3%S}I{(`)cfEg$Xgzk$+9@iUZzeTCjj?MGSaB`*1s zlym<(;qSk}&k66`02-)U_+vWX(X8ZJ8yN%D+@eT0jCR>g#G~&dt zEkFG>zQhl^eFN;b+D=&5uXAN}Fo8zzH@yZ0T((`vNBCFV0GbHRwlik^hVJs=%?A8e zT;k`D+cz-mw;7pw$(L+7XNb28`3V1t8$eg2m)o$}py_*Qhxscm@pH)S8|eEjT5I$} zcBi{~&2}Ll;a_nB?2z<|>szjGq)q0pxWvyPw{O7PMqTIcHy1pBw+s0Q|B4%UpoLzQ zfcWcPmucE>p|oA7%jJK+O|G; z3WDD=pUT>WmqV4E({JhchcxiV{`{xa{s|mQY+8QZ!i)h1qtp^SHPaoREcnUv^LhCw zb=wW#G;s(WA@K88y+e2#7(q+VbYfAT5E zDO{O!&j8qoErgl-lfiw^;z;{f?Zar!yCr?0p3kct`FND=p5u~B)Gql&<<+e(-Odjv z6+@HR9H+SShv2-0yWv64qO9a%i|WkoIPS2X{fI{646Mrgs?<>Gh*Ild-nrn}|s**)-bj%FL&#w!ZOju-c1&EQ3<@-yI*t!J^sEmK2cR8%L7h- zW)-TqkkB+daI0ldGn?B+W!vbSqgy~>cg}pL(Ges8W(+L(r>{}U*}>hu1J-pJzzJBm zK)GAHhgVhJHd^_|g|Y=|Rjh3`7kNpEe%Py7{xD@ptp}+VR2GHkn27$mjAD^Se%@-Y)P?6C^K9w@#HlrbJf!{}y7Rffyyx4vNX`#+M)uXC&r zGk#AaMz!1k)bxZlkFV_juw%N1;<<5@ zs2L-ay-D&+%aT=dk&m*=eA#lb*ZOm}l2jO$tfxHHm{28VG#ddKV2rA~d{WN~qLA9; z7w13Uj#hCk_2&W%SbID*3i?aP%<%)IWS1#xmd9*qQGQg?#I3?wQd{bj;+w%aT|R42 zlB;LA%T>QoS1w1ptDaK4)xX|%D_WbMb;ay2Iv%@~6tOpcN(skNyN9t3QC{w?w$|_t zL0%uBeBbGj^HQ#}&X?2DYrmm9IuzcI0s>3T1=i`*tGfl%Z>umw<=m-UZM@%nCy?By zY3fhatt&bocDFWWS<7K-^cx0?ITifO7VF%0Ej;*RbGge%wU+bitge?g!^gzTcue(* zjtfC3o0NBHBJJ6hs)|o55*{Em7kDgds2*f}bzRh)t>5@-WVvVT6X$9_%TPA%mA=4OS$eE9NIv)ncxK{2fkrTE%NC;%)OXb3P<8s=pj%Qro7w`G&76abID z7Pphut0~Xs85|F^JoI=#^%pSsVH~dHv5q57j#KoJRvrO=#KaN(Q#OMh
  • 0Qq4REzA3!WMWwakHO6J>tor9&{DUtvp;|8X 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
  • A^wnL;UR@$x(55NE&1 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 IXR%@VfBL4of&c&j literal 0 HcmV?d00001 diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index a4a1063..e781ae1 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -188,7 +188,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("lvl"); + GameManager.mapManager.LoadLevel("debug"); break; case GameState.Death: break; diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index 5d7d6fc..b38ac9f 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -100,12 +100,13 @@ namespace DangerousD.GameCore.Managers private void InstantiateEntities(XmlNode group) { - string entityType = group.Attributes["class"].Value; + string entityGroup = group.Attributes["class"] is not null ? group.Attributes["class"].Value : ""; float offsetX = group.Attributes["offsetx"] is not null ? float.Parse(group.Attributes["offsetx"].Value) : 0; float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0; foreach (XmlNode entity in group.ChildNodes) { - Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityType}"); + string entityType = group.Attributes["type"] is not null ? "." + group.Attributes["type"].Value : ""; + Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityGroup}{entityType}"); Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale); inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); inst.Height *= _scale; From 2deaa74edecfde6d1af65456fab36503334c8877 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 01:05:36 +0300 Subject: [PATCH 02/21] Add debug level --- DangerousD/Content/debug.tmx | 12 +++++++----- DangerousD/GameCore/Managers/MapManager.cs | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/DangerousD/Content/debug.tmx b/DangerousD/Content/debug.tmx index de462c2..c24a642 100644 --- a/DangerousD/Content/debug.tmx +++ b/DangerousD/Content/debug.tmx @@ -1,5 +1,5 @@ - + @@ -77,6 +77,11 @@ + + + + + @@ -189,7 +194,7 @@ - + @@ -343,9 +348,6 @@ - - - diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index b38ac9f..cf209f4 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -105,7 +105,8 @@ namespace DangerousD.GameCore.Managers float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0; foreach (XmlNode entity in group.ChildNodes) { - string entityType = group.Attributes["type"] is not null ? "." + group.Attributes["type"].Value : ""; + Debug.WriteLine(entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""); + string entityType = entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""; Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityGroup}{entityType}"); Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale); inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); From dec773d29067f4c76421bf72e4faa439ea3ee1c9 Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 01:06:16 +0300 Subject: [PATCH 03/21] CameraAndScaleFix --- .../GameObjects/Entities/SilasBall.cs | 16 +++++++++++++- .../LivingEntities/Player/Player.cs | 2 +- .../GameCore/Graphics/GraphicsComponent.cs | 21 +++++++++++++++++-- DangerousD/GameCore/Managers/AppManager.cs | 2 +- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs index b14d8af..1c11e0e 100644 --- a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs +++ b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs @@ -1,7 +1,9 @@ using DangerousD.GameCore.Graphics; using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; + using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,6 +12,7 @@ namespace DangerousD.GameCore.GameObjects.Entities { public class SilasBall : LivingEntity { + private bool IsVisibility=true; public SilasBall(Vector2 position) : base(position) { Height = 60; @@ -30,7 +33,18 @@ namespace DangerousD.GameCore.GameObjects.Entities public override void Update(GameTime gameTime) { base.Update(gameTime); - + if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(Rectangle).Count>0) + { + IsVisibility = false; + } + } + public override void Draw(SpriteBatch spriteBatch) + { + if (IsVisibility) + { + base.Draw(spriteBatch); + } + } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 39b1926..8249673 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -100,7 +100,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public override void Update(GameTime gameTime) { - GraphicsComponent.CameraPosition = (_pos-new Vector2(200, 350)).ToPoint(); + GraphicsComponent.SetCameraPosition(Pos); if (!isAttacked) { Move(gameTime); diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs index e4546b5..f218ba6 100644 --- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs +++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs @@ -16,6 +16,7 @@ namespace DangerousD.GameCore.Graphics private List textures; private List texturesNames; private AnimationContainer currentAnimation; + static private int scaling=3; public AnimationContainer CurrentAnimation { get @@ -167,6 +168,8 @@ namespace DangerousD.GameCore.Graphics destinationRectangle.X -= CameraPosition.X; destinationRectangle.Y -= CameraPosition.Y; + + destinationRectangle = Scaling(destinationRectangle); _spriteBatch.Draw(texture, destinationRectangle, sourceRectangle, Color.White); } @@ -191,10 +194,18 @@ namespace DangerousD.GameCore.Graphics destinationRectangle.X -= CameraPosition.X; destinationRectangle.Y -= CameraPosition.Y; + destinationRectangle = Scaling(destinationRectangle); _spriteBatch.Draw(texture, destinationRectangle, sourceRectangle, Color.White); } - + private Rectangle Scaling(Rectangle destinationRectangle) + { + destinationRectangle.X *= scaling; + destinationRectangle.Y *= scaling; + destinationRectangle.Width *= scaling; + destinationRectangle.Height *= scaling; + return destinationRectangle; + } private void buildSourceRectangle() { sourceRectangle = new Rectangle(); @@ -222,6 +233,12 @@ namespace DangerousD.GameCore.Graphics interval = lastInterval; } } - public static Point CameraPosition = new Point(0, 0); + public static void SetCameraPosition(Vector2 playerPosition) + { + CameraPosition=(playerPosition).ToPoint(); + CameraPosition.X -= 300; + CameraPosition.Y -= 200; + } + public static Point CameraPosition = new Point(-700, 300); } } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 9c07648..488442f 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -26,7 +26,7 @@ namespace DangerousD.GameCore public GameState gameState { get; private set; } public MultiPlayerStatus multiPlayerStatus { get; private set; } = MultiPlayerStatus.SinglePlayer; public Point resolution = new Point(1920, 1080); - public Point inGameResolution = new Point(1366, 768); + public Point inGameResolution = new Point(1920, 1080); IDrawableObject MenuGUI; IDrawableObject OptionsGUI; IDrawableObject LoginGUI; From 925b03fd3aa83fee70cc1c5dd890092a8642ea9d Mon Sep 17 00:00:00 2001 From: MARKPRO44 <119742977+MARKPRO4444@users.noreply.github.com> Date: Fri, 18 Aug 2023 01:11:17 +0300 Subject: [PATCH 04/21] commit 000 --- .../GameObjects/LivingEntities/Monsters/CoreEnemy.cs | 7 +------ .../GameObjects/LivingEntities/Monsters/FlameSkull.cs | 11 +++-------- .../GameObjects/LivingEntities/Monsters/Frank.cs | 6 ++++-- .../GameObjects/LivingEntities/Monsters/FrankBalls.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/Ghost.cs | 7 +++++-- .../GameObjects/LivingEntities/Monsters/Hunchman.cs | 4 ++-- .../LivingEntities/Monsters/HunchmanDagger.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/SilasHands.cs | 4 ++-- .../LivingEntities/Monsters/SilasMaster.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/Slime.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/Spider.cs | 7 +++++-- .../GameObjects/LivingEntities/Monsters/SpiderWeb.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/Werewolf.cs | 7 +++++-- .../GameObjects/LivingEntities/Monsters/Zombie.cs | 7 +++++-- 14 files changed, 42 insertions(+), 38 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs index 22ea566..06fed0f 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs @@ -13,11 +13,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public abstract class CoreEnemy : LivingEntity { protected int monster_health; - protected float monster_speed = 2; + protected int monster_speed; protected string name; protected bool isAlive = true; - protected bool isAttack = false; - protected bool isGoRight; protected int leftBoarder = 0; protected int rightBoarder = 700; @@ -33,7 +31,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public abstract void Death(); public abstract void Attack(); - public abstract void Attack(GameTime gameTime); public abstract void Move(GameTime gameTime); @@ -46,7 +43,5 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities isAlive = false; } } - - public abstract void Target(); } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs index f7591ac..b4f3ec7 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs @@ -12,6 +12,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class FlameSkull : CoreEnemy { + private bool isGoRight; + private bool isAttack; + public FlameSkull(Vector2 position) : base(position) { Width = 62; @@ -71,14 +74,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) - { - } - - public override void Target() - { - throw new NotImplementedException(); - } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs index 8ecddcd..fd25246 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs @@ -12,6 +12,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { internal class Frank : CoreEnemy { + private bool isGoRight; + public Frank(Vector2 position) : base(position) { isGoRight = false; @@ -70,12 +72,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs index bc28f6b..4c37e6a 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs @@ -82,12 +82,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs index 6236554..3df9012 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs @@ -10,6 +10,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Ghost : CoreEnemy { + private bool isGoRight; + private bool isAttack; + public Ghost(Vector2 position) : base(position) { isGoRight = true; @@ -76,12 +79,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs index ba342ec..d804512 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs @@ -81,7 +81,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -129,7 +129,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters Debug.WriteLine("Collision"); } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs index 9cd2b4f..9c2415b 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs @@ -27,7 +27,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -42,7 +42,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs index 16c06e1..ed4dfcb 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs @@ -30,7 +30,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -61,7 +61,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 5dc8df2..66f9527 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -72,7 +72,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -113,7 +113,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs index 0e5e954..1cdf9bb 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs @@ -233,12 +233,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters base.Update(gameTime); } - public override void Target() + public void Target() { } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs index 0d797aa..93f3ef4 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs @@ -12,6 +12,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Spider : CoreEnemy { + private bool isGoRight; + private bool isAttack; + protected SpiderWeb web; protected float delay; protected int webLength; @@ -57,7 +60,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters /// Атака паука РАБОЧАЯ /// /// - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { //48 72 if (isDownUp) { @@ -144,7 +147,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs index cde2ab0..8bd0af1 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs @@ -28,7 +28,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -43,7 +43,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs index 2d9ebae..c5f1b8c 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs @@ -12,6 +12,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Werewolf : CoreEnemy { + private bool isGoRight; + private bool isAttack; + public Werewolf(Vector2 position) : base(position) { name = "Wolf"; @@ -70,11 +73,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index 4ab4494..06c41a1 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -13,6 +13,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Zombie : CoreEnemy { + private bool isGoRight; + private bool isAttack; + float leftBorder; float rightBorder; bool isAttaking = false; @@ -118,7 +121,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } base.OnCollision(gameObject); } - public override void Target() + public void Target() { if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 100, Height), typeof(Player)).Count > 0) { @@ -149,7 +152,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) {} } } From 424583837a4458606e3eb3e5d8bd19ff989b5cb3 Mon Sep 17 00:00:00 2001 From: AnloGames <7383an@gmail.com> Date: Fri, 18 Aug 2023 01:20:35 +0300 Subject: [PATCH 05/21] Pre 3 player support --- .../GameObjects/LivingEntities/Player/Player.cs | 12 +++++++----- DangerousD/GameCore/Managers/AppManager.cs | 12 +++++++++--- DangerousD/GameCore/Managers/GameManager.cs | 5 ++--- DangerousD/GameCore/Managers/MapManager.cs | 12 +++++++++++- DangerousD/GameCore/Managers/PhysicsManager.cs | 6 +++--- DangerousD/GameCore/Network/NetworkManager.cs | 13 +++++++++---- 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 03c24b6..5149e24 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -27,15 +27,17 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities private bool isAttacked = false; public GameObject objectAttack; - public Player(Vector2 position) : base(position) + public Player(Vector2 position, bool isNetworkPlayer = false) : base(position) { Width = 16; Height = 32; - AppManager.Instance.InputManager.ShootEvent += Shoot; - - AppManager.Instance.InputManager.MovEventJump += Jump; - AppManager.Instance.InputManager.MovEventDown += MoveDown; + if (!isNetworkPlayer) + { + AppManager.Instance.InputManager.ShootEvent += Shoot; + AppManager.Instance.InputManager.MovEventJump += Jump; + AppManager.Instance.InputManager.MovEventDown += MoveDown; + } velocity = new Vector2(0, 0); rightBorder = (int)position.X + 100; diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 5e53677..49187a0 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -231,16 +231,22 @@ namespace DangerousD.GameCore case NetworkTaskOperationEnum.ChangeState: break; case NetworkTaskOperationEnum.ConnectToHost: - Player connectedPlayer = new Player(Vector2.Zero); + Player connectedPlayer = new Player(Vector2.Zero, true); NetworkTasks.Add(new NetworkTask(connectedPlayer.id)); NetworkTask task = new NetworkTask(); - NetworkTasks.Add(task.AddConnectedPlayer(GameManager.GetPlayer1.id, GameManager.GetPlayer1.Pos)); + foreach (Player player in GameManager.players) + { + if (player.id != connectedPlayer.id) + { + NetworkTasks.Add(task.AddConnectedPlayer(player.id, player.Pos)); + } + } break; case NetworkTaskOperationEnum.GetClientPlayerId: GameManager.GetPlayer1.id = networkTask.objId; break; case NetworkTaskOperationEnum.AddConnectedPlayer: - Player remoteConnectedPlayer = new Player(networkTask.position); + Player remoteConnectedPlayer = new Player(networkTask.position, true); remoteConnectedPlayer.id = networkTask.objId; GameManager.players.Add(remoteConnectedPlayer); break; diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 7e4851a..d4363d5 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -99,7 +99,8 @@ namespace DangerousD.GameCore public void Update(GameTime gameTime) { - AppManager.Instance.DebugHUD.Set("playerId: ", GetPlayer1.id.ToString()); + Player p = players.Find(x => x.id == 16); + if (p != null) AppManager.Instance.DebugHUD.Set("NextPlayerVelocity: ", p.velocity.ToString()); if (AppManager.Instance.NetworkTasks.Count > 0) { AppManager.Instance.NetworkManager.SendMsg(AppManager.Instance.NetworkTasks.ToList()); @@ -117,7 +118,6 @@ namespace DangerousD.GameCore { livingEntitiesWithoutPlayers[i].Update(gameTime); } - GetPlayer1.Update(gameTime); } else { @@ -125,7 +125,6 @@ namespace DangerousD.GameCore { livingEntitiesWithoutPlayers[i].PlayAnimation(); } - GetPlayer1.Update(gameTime); } GetPlayer1.Update(gameTime); foreach (var item in otherObjects) diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index 5d7d6fc..3367a2f 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -9,6 +9,7 @@ using Microsoft.Xna.Framework.Graphics; using System.Xml.Serialization; using DangerousD.GameCore.GameObjects; using System.Globalization; +using DangerousD.GameCore.GameObjects.LivingEntities; namespace DangerousD.GameCore.Managers { @@ -106,7 +107,16 @@ namespace DangerousD.GameCore.Managers foreach (XmlNode entity in group.ChildNodes) { Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityType}"); - Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale); + Vector2 vector = new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY); + Entity inst; + if (type.Equals(typeof(Player))) + { + inst = (Entity)Activator.CreateInstance(type, vector * _scale, false); + } + else + { + inst = (Entity)Activator.CreateInstance(type, vector * _scale); + } inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); inst.Height *= _scale; inst.Width *= _scale; diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 7899c98..95bb8a1 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -21,9 +21,9 @@ namespace DangerousD.GameCore.Managers item.velocity = item.velocity + item.acceleration * delta; } - CheckCollisionsLE_MO(livingEntities, mapObjects); - CheckCollisionsE_LE(entities, livingEntities); - CheckCollisionsLE_LE(livingEntities); + CheckCollisionsLE_MO(livingEntities.ToList(), mapObjects); + CheckCollisionsE_LE(entities, livingEntities.ToList()); + CheckCollisionsLE_LE(livingEntities.ToList()); //entities dont move //Living entities dont move diff --git a/DangerousD/GameCore/Network/NetworkManager.cs b/DangerousD/GameCore/Network/NetworkManager.cs index 292e210..2d6bfc5 100644 --- a/DangerousD/GameCore/Network/NetworkManager.cs +++ b/DangerousD/GameCore/Network/NetworkManager.cs @@ -91,7 +91,7 @@ namespace DangerousD.GameCore.Network } catch { } } - public void SendMsg(List networkTask) + public void SendMsg(List networkTask, Socket ignoreSocket = null) { byte[] Data = Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(networkTask)); int count = Data.Length; @@ -101,8 +101,11 @@ namespace DangerousD.GameCore.Network { foreach (Socket socket in clientSockets) { - socket.Send(BitConverter.GetBytes(count)); - socket.Send(Data); + if (!(socket == ignoreSocket)) + { + socket.Send(BitConverter.GetBytes(count)); + socket.Send(Data); + } } } catch { } @@ -148,7 +151,9 @@ namespace DangerousD.GameCore.Network } else { - GetReceivingMessages(JsonConvert.DeserializeObject>(so.sb.ToString())); + List tasks = JsonConvert.DeserializeObject>(so.sb.ToString()); + //SendMsg(tasks, clientSocket); + GetReceivingMessages(tasks); } } catch { } From b9f0740c17b03b98a043f9e8801195c257f9196b Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 01:29:21 +0300 Subject: [PATCH 06/21] Add map god mode --- DangerousD/Content/debug.tmx | 12 +++---- .../LivingEntities/Player/Player.cs | 6 ++-- DangerousD/GameCore/Managers/MapManager.cs | 31 +++++++++---------- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/DangerousD/Content/debug.tmx b/DangerousD/Content/debug.tmx index c24a642..f52dbe7 100644 --- a/DangerousD/Content/debug.tmx +++ b/DangerousD/Content/debug.tmx @@ -1,5 +1,5 @@ - + @@ -77,11 +77,6 @@ - - - - - @@ -194,6 +189,11 @@ + + + + + diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 03c24b6..43e191f 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -25,9 +25,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public int leftBorder; public bool isVisible = true; private bool isAttacked = false; + public bool isInvincible; public GameObject objectAttack; - public Player(Vector2 position) : base(position) + public Player(Vector2 position, bool isInvincible = false) : base(position) { Width = 16; Height = 32; @@ -40,6 +41,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities velocity = new Vector2(0, 0); rightBorder = (int)position.X + 100; leftBorder = (int)position.X - 100; + this.isInvincible = isInvincible; } @@ -98,7 +100,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public override void Update(GameTime gameTime) { GraphicsComponent.CameraPosition = (_pos-new Vector2(200, 350)).ToPoint(); - if (!isAttacked) + if (!isAttacked || isInvincible) { Move(gameTime); } diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index cf209f4..a8e1239 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -9,6 +9,7 @@ using Microsoft.Xna.Framework.Graphics; using System.Xml.Serialization; using DangerousD.GameCore.GameObjects; using System.Globalization; +using DangerousD.GameCore.GameObjects.LivingEntities; namespace DangerousD.GameCore.Managers { @@ -70,22 +71,8 @@ namespace DangerousD.GameCore.Managers Rectangle sourceRect = new(new Point((tiles[i] -1) % _columns, (tiles[i] -1) / _columns) * tileSize.ToPoint(), tileSize.ToPoint()); Type type = Type.GetType($"DangerousD.GameCore.GameObjects.MapObjects.{tileType}"); Activator.CreateInstance(type, pos, tileSize * _scale, sourceRect); - - /*switch (tileType) - { - case "collidable": - new StopTile(pos, tileSize * _scale, sourceRect); - break; - case "platform": - new Platform(pos, tileSize * _scale, sourceRect); - break; - case "non_collidable": - new Tile(pos, tileSize * _scale, sourceRect); - break; - }*/ - } - } + } } } @@ -105,10 +92,20 @@ namespace DangerousD.GameCore.Managers float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0; foreach (XmlNode entity in group.ChildNodes) { - Debug.WriteLine(entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""); string entityType = entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""; Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityGroup}{entityType}"); - Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale); + Vector2 pos = + new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, + float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale; + Entity inst; + if (type.Equals(typeof(Player)) && entity.Attributes["name"].Value == "DEBUGUS") + { + inst = (Entity)Activator.CreateInstance(type, pos, true); + } + else + { + inst = (Entity)Activator.CreateInstance(type, pos); + } inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); inst.Height *= _scale; inst.Width *= _scale; From 9c9b2b035e46f4cf7db443cfba7ae793b9c4a70d Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 01:36:16 +0300 Subject: [PATCH 07/21] Main map convert to new format --- DangerousD/Content/lvl.tmx | 10 +++++----- .../GameObjects/LivingEntities/Monsters/SilasHands.cs | 2 +- .../GameObjects/LivingEntities/Player/Player.cs | 11 +++++++---- DangerousD/GameCore/Managers/AppManager.cs | 2 +- DangerousD/GameCore/Managers/MapManager.cs | 2 +- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/DangerousD/Content/lvl.tmx b/DangerousD/Content/lvl.tmx index d643830..5377e12 100644 --- a/DangerousD/Content/lvl.tmx +++ b/DangerousD/Content/lvl.tmx @@ -1,7 +1,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -311,7 +311,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -441,7 +441,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -517,7 +517,7 @@ - + 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, @@ -701,7 +701,7 @@ - + diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs index 16c06e1..a250868 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs @@ -1,4 +1,4 @@ -using DangerousD.GameCore.Graphics; + using DangerousD.GameCore.Graphics; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 43e191f..4e0b0cc 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -25,10 +25,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public int leftBorder; public bool isVisible = true; private bool isAttacked = false; - public bool isInvincible; + public bool isInvincible = false; public GameObject objectAttack; - public Player(Vector2 position, bool isInvincible = false) : base(position) + public Player(Vector2 position) : base(position) { Width = 16; Height = 32; @@ -41,8 +41,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities velocity = new Vector2(0, 0); rightBorder = (int)position.X + 100; leftBorder = (int)position.X - 100; - this.isInvincible = isInvincible; + } + public Player(Vector2 position, bool isInvincible = false) : this(position) + { + this.isInvincible = isInvincible; } public bool IsAlive { get { return isAlive; } } @@ -127,7 +130,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities if (GraphicsComponent.GetCurrentAnimation != "playerMoveLeft") { GraphicsComponent.StartAnimation("playerMoveLeft"); - } + } } else if(AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит { diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index cd8bfe4..5e53677 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -202,7 +202,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("debug"); + GameManager.mapManager.LoadLevel("lvl"); break; case GameState.Death: break; diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index a8e1239..fd23e3c 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -98,7 +98,7 @@ namespace DangerousD.GameCore.Managers new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale; Entity inst; - if (type.Equals(typeof(Player)) && entity.Attributes["name"].Value == "DEBUGUS") + if (type.Equals(typeof(Player)) && entity.Attributes["name"] is not null && entity.Attributes["name"].Value == "DEBUGUS") { inst = (Entity)Activator.CreateInstance(type, pos, true); } From 24919cf07f26336c8929c68db80a890ce855e719 Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 01:44:29 +0300 Subject: [PATCH 08/21] player can shoot --- DangerousD/Content/animation1.png | Bin 0 -> 39961 bytes DangerousD/Content/animations/playerReload | 1 + DangerousD/Content/animations/playerShootLeft | 1 + .../Content/animations/playerShootRight | 1 + .../LivingEntities/Monsters/Zombie.cs | 17 ++- .../LivingEntities/Player/Player.cs | 103 +++++++++++++++--- 6 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 DangerousD/Content/animation1.png create mode 100644 DangerousD/Content/animations/playerReload create mode 100644 DangerousD/Content/animations/playerShootLeft create mode 100644 DangerousD/Content/animations/playerShootRight diff --git a/DangerousD/Content/animation1.png b/DangerousD/Content/animation1.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc21578051879474ccecca9bd1ad8082331373e GIT binary patch literal 39961 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

    $9%q07X|K^A0boh2(Fyy`btyMs@XS{ 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 MtR1W{mNygs4@|oGiU0rr literal 0 HcmV?d00001 diff --git a/DangerousD/Content/animations/playerReload b/DangerousD/Content/animations/playerReload new file mode 100644 index 0000000..2dd0586 --- /dev/null +++ b/DangerousD/Content/animations/playerReload @@ -0,0 +1 @@ +{"id":"playerReload","textureName":"playerAnimation","startSpriteRectangle":{"X":101,"Y":67,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/playerShootLeft b/DangerousD/Content/animations/playerShootLeft new file mode 100644 index 0000000..f2b9f3b --- /dev/null +++ b/DangerousD/Content/animations/playerShootLeft @@ -0,0 +1 @@ +{"id":"playerShootLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":201,"Y":34,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"4, 0"} diff --git a/DangerousD/Content/animations/playerShootRight b/DangerousD/Content/animations/playerShootRight new file mode 100644 index 0000000..922862b --- /dev/null +++ b/DangerousD/Content/animations/playerShootRight @@ -0,0 +1 @@ +{"id":"playerShootRight","textureName":"playerAnimation","startSpriteRectangle":{"X":201,"Y":1,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"4, 0"} diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index 4ab4494..02fa96d 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -24,8 +24,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters Height = 40; monster_speed = 3; name = "Zombie"; - leftBorder = (int)position.X - 50; - rightBorder = (int)position.X + 50; + monster_health = 2; + leftBorder = (int)position.X - 100; + rightBorder = (int)position.X + 100; physicsManager = new PhysicsManager(); Random random = new Random(); if(random.Next(0, 2) == 0) @@ -74,7 +75,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Death() { - + AppManager.Instance.GameManager.Remove(this); } public override void Move(GameTime gameTime) @@ -151,5 +152,15 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Attack(GameTime gameTime) {} + + public void TakeDamage() + { + monster_health--; + GraphicsComponent.StartAnimation("ZombieRightAttack"); + if (monster_health <= 0) + { + Death(); + } + } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 39b1926..2071350 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using DangerousD.GameCore.GameObjects.PlayerDeath; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; +using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; namespace DangerousD.GameCore.GameObjects.LivingEntities { @@ -24,7 +25,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public int leftBorder; public bool isVisible = true; private bool isAttacked = false; + private bool isShooting = false; public GameObject objectAttack; + private int bullets; public Player(Vector2 position) : base(position) { @@ -35,17 +38,30 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities AppManager.Instance.InputManager.MovEventJump += Jump; AppManager.Instance.InputManager.MovEventDown += MoveDown; + AppManager.Instance.InputManager.ShootEvent += Shoot; velocity = new Vector2(0, 0); rightBorder = (int)position.X + 100; leftBorder = (int)position.X - 100; + bullets = 5; + this.GraphicsComponent.actionOfAnimationEnd += (a) => + { + if (a == "playerShootLeft" || a == "playerShootRight") + { + isShooting = false; + } + if (a == "playerReload") + { + bullets++; + } + }; } public bool IsAlive { get { return isAlive; } } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft", - "playerJumpRight" , "playerJumpLeft"}, "playerStayLeft"); + "playerJumpRight" , "playerJumpLeft", "playerShootLeft", "playerShootRight", "playerReload"}, "playerReload"); public void Attack() { @@ -53,6 +69,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { isVisible = false; } + } public override void OnCollision(GameObject gameObject) { @@ -95,9 +112,47 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void Shoot() { - + if (bullets > 0) + { + if (!isShooting) + { + isShooting = true; + bullets--; + if (isRight) + { + if (GraphicsComponent.GetCurrentAnimation != "playerShootRight") + { + GraphicsComponent.StartAnimation("playerShootRight"); + } + var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), 100, 10), typeof(Zombie)); + if (targets != null) + { + foreach (var target in targets) + { + Zombie targetZombie = (Zombie)target; + targetZombie.TakeDamage(); + } + } + } + else + { + if (GraphicsComponent.GetCurrentAnimation != "playerShootRight") + { + GraphicsComponent.StartAnimation("playerShootRight"); + } + var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), -100, 10), typeof(Zombie)); + if (targets != null) + { + foreach (var target in targets) + { + Zombie targetZombie = (Zombie)target; + targetZombie.TakeDamage(); + } + } + } + } + } } - public override void Update(GameTime gameTime) { GraphicsComponent.CameraPosition = (_pos-new Vector2(200, 350)).ToPoint(); @@ -116,25 +171,41 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { float delta = (float)gameTime.ElapsedGameTime.TotalSeconds; velocity.X = 5 * AppManager.Instance.InputManager.VectorMovementDirection.X; - if (AppManager.Instance.InputManager.VectorMovementDirection.X > 0) + if (GraphicsComponent.GetCurrentAnimation != "playerShootLeft" && GraphicsComponent.GetCurrentAnimation != "playerShootRight") { - if (GraphicsComponent.GetCurrentAnimation != "playerMoveRight")//идёт направо + if (AppManager.Instance.InputManager.VectorMovementDirection.X > 0) { - GraphicsComponent.StartAnimation("playerMoveRight"); + isRight = true; + if (GraphicsComponent.GetCurrentAnimation != "playerMoveRight")//идёт направо + { + GraphicsComponent.StartAnimation("playerMoveRight"); + } } - } - else if (AppManager.Instance.InputManager.VectorMovementDirection.X < 0)//идёт налево - { - if (GraphicsComponent.GetCurrentAnimation != "playerMoveLeft") + else if (AppManager.Instance.InputManager.VectorMovementDirection.X < 0)//идёт налево { - GraphicsComponent.StartAnimation("playerMoveLeft"); + isRight = false; + if (GraphicsComponent.GetCurrentAnimation != "playerMoveLeft") + { + GraphicsComponent.StartAnimation("playerMoveLeft"); + } } - } - else if(AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит - { - if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveLeft") + else if (AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит { - GraphicsComponent.StartAnimation("ZombieMoveLeft"); + if(bullets < 5) + { + if (GraphicsComponent.GetCurrentAnimation != "playerReload") + { + GraphicsComponent.StartAnimation("playerReload"); + } + } + else if (isRight) + { + GraphicsComponent.StartAnimation("playerRightStay"); + } + else if (!isRight) + { + GraphicsComponent.StartAnimation("playerStayLeft"); + } } } } From d4b29d72033383a9eaa05ad83cf3e06345899888 Mon Sep 17 00:00:00 2001 From: Ivan Filipenkov Date: Fri, 18 Aug 2023 01:52:31 +0300 Subject: [PATCH 09/21] GameManager.Remove --- DangerousD/GameCore/Managers/GameManager.cs | 30 +++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 7e4851a..75dba06 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -83,6 +83,36 @@ namespace DangerousD.GameCore otherObjects.Add(gameObject); } } + + public void Remove(GameObject gameObject) + { + GetAllGameObjects.Remove(gameObject); + if (gameObject is Player objPl) + { + livingEntities.Remove(gameObject as LivingEntity); + players.Remove(objPl); + } + else if (gameObject is LivingEntity objLE) + { + livingEntities.Remove(objLE); + } + else if (gameObject is Entity objE) + { + entities.Remove(objE); + } + else if (gameObject is MapObject obj) + { + if (obj.IsColliderOn) + mapObjects.Remove(obj); + else + BackgroundObjects.Remove(obj); + } + else + { + otherObjects.Remove(gameObject); + } + } + public void Draw(SpriteBatch _spriteBatch) { foreach (var item in BackgroundObjects) From 52b404c9db441dfe49134d7e9e919e5102560065 Mon Sep 17 00:00:00 2001 From: Ivan Filipenkov Date: Fri, 18 Aug 2023 01:58:34 +0300 Subject: [PATCH 10/21] laaaaaaaaaadder --- .../LivingEntities/Player/Player.cs | 2 + DangerousD/GameCore/Managers/GameManager.cs | 2 +- .../GameCore/Managers/PhysicsManager.cs | 40 ++++++++++++++++++- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 066b1d4..9358d38 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -9,6 +9,7 @@ using DangerousD.GameCore.GameObjects.PlayerDeath; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; +using DangerousD.GameCore.Network; namespace DangerousD.GameCore.GameObjects.LivingEntities { @@ -84,6 +85,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void Death(string monsterName) { + return; isAttacked = true; if(monsterName == "Zombie") { diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 75dba06..6b3c2b4 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -161,7 +161,7 @@ namespace DangerousD.GameCore foreach (var item in otherObjects) item.Update(gameTime); - physicsManager.UpdateCollisions(entities, livingEntities, mapObjects, gameTime); + physicsManager.UpdateCollisions(entities, livingEntities, mapObjects, players, gameTime); } } } \ No newline at end of file diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 7899c98..e41b848 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using DangerousD.GameCore.GameObjects.LivingEntities; +using DangerousD.GameCore.GameObjects.MapObjects; using Microsoft.Xna.Framework; namespace DangerousD.GameCore.Managers @@ -13,7 +14,7 @@ namespace DangerousD.GameCore.Managers { public void UpdateCollisions(List entities, List livingEntities, - List mapObjects, GameTime gameTime) + List mapObjects, List players, GameTime gameTime) { float delta = (float)gameTime.ElapsedGameTime.TotalSeconds; foreach (var item in livingEntities) @@ -21,7 +22,8 @@ namespace DangerousD.GameCore.Managers item.velocity = item.velocity + item.acceleration * delta; } - CheckCollisionsLE_MO(livingEntities, mapObjects); + CheckCollisionsLE_MO(livingEntities, mapObjects.Where(mo => mo is StopTile).ToList()); + CheckCollisionsPlayer_Platform(players, mapObjects.OfType().ToList()); CheckCollisionsE_LE(entities, livingEntities); CheckCollisionsLE_LE(livingEntities); @@ -100,6 +102,40 @@ namespace DangerousD.GameCore.Managers currentEntity.SetPosition(new Vector2(newRect.X, newRect.Y)); } + } + private void CheckCollisionsPlayer_Platform(List players, List platforms) + { + foreach (var player in players) + { + if (player.velocity.Y <= 0) + { + continue; + } + var currentRect = player.Rectangle; + var newRect = currentRect; + + var collidedY = false; + var tryingRectY = currentRect; + tryingRectY.Offset(0, (int)Math.Ceiling(player.velocity.Y)); + AppManager.Instance.DebugHUD.Set("intersects platform", "false"); + foreach (var platform in platforms) + { + if (tryingRectY.Intersects(platform.Rectangle)) + { + AppManager.Instance.DebugHUD.Set("intersects platform", "true"); + collidedY = true; + break; + } + } + if (collidedY) + { + player.isOnGround = true; + player.velocity.Y = 0; + } + + player.SetPosition(new Vector2(newRect.X, newRect.Y)); + } + } private void CheckCollisionsE_LE(List entities, List livingEntities) { From ba49674c3b963d1dff9caf1d8ec3f9246fd44f98 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 02:13:01 +0300 Subject: [PATCH 11/21] Boss level --- DangerousD/Content/boss.tmx | 162 ++++++++++++++++++ .../GameObjects/Entities/SilasBall.cs | 2 +- .../LivingEntities/Monsters/SilasMaster.cs | 1 + .../LivingEntities/Player/Player.cs | 9 +- DangerousD/GameCore/Managers/AppManager.cs | 2 +- 5 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 DangerousD/Content/boss.tmx diff --git a/DangerousD/Content/boss.tmx b/DangerousD/Content/boss.tmx new file mode 100644 index 0000000..97ea7e8 --- /dev/null +++ b/DangerousD/Content/boss.tmx @@ -0,0 +1,162 @@ + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,799,799,799,799,799,799,799, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,799,799,799,799,799,799,799 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799 + + +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,0,0,0,0,0 + + + + + + + + + + + + + + diff --git a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs index 1c11e0e..48dd53b 100644 --- a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs +++ b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs @@ -12,7 +12,7 @@ namespace DangerousD.GameCore.GameObjects.Entities { public class SilasBall : LivingEntity { - private bool IsVisibility=true; + public bool IsVisibility=true; public SilasBall(Vector2 position) : base(position) { Height = 60; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 66f9527..4b3b5cb 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -67,6 +67,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters for (int i = 0; i < balls.Count; i++) { balls[i].SetPosition(new Vector2(Pos.X + i * 40, Pos.Y + 120)); + balls[i].IsVisibility=true; } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 066b1d4..41a7aad 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -9,6 +9,7 @@ using DangerousD.GameCore.GameObjects.PlayerDeath; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; +using DangerousD.GameCore.Network; namespace DangerousD.GameCore.GameObjects.LivingEntities { @@ -27,6 +28,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities private bool isAttacked = false; private bool isShooting = false; public GameObject objectAttack; + public bool isInvincible; private int bullets; public Player(Vector2 position) : base(position) @@ -58,6 +60,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities }; } + public Player(Vector2 position, bool isInvincible) : this(position) + { + this.isInvincible = isInvincible; + } + public bool IsAlive { get { return isAlive; } } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft", @@ -152,7 +159,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public override void Update(GameTime gameTime) { GraphicsComponent.SetCameraPosition(Pos); - if (!isAttacked) + if (!isAttacked || isInvincible) { Move(gameTime); } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 84d6b07..661932c 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -202,7 +202,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("lvl"); + GameManager.mapManager.LoadLevel("boss"); break; case GameState.Death: break; From 5f36ee7b79deba5dfb0653759a9a43cf391710e7 Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 02:19:11 +0300 Subject: [PATCH 12/21] edited player --- DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 066b1d4..eef557f 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -9,6 +9,7 @@ using DangerousD.GameCore.GameObjects.PlayerDeath; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; +using DangerousD.GameCore.Network; namespace DangerousD.GameCore.GameObjects.LivingEntities { From e7c375d9e7adbe9146dc40b08e55f7fd98b1a2ee Mon Sep 17 00:00:00 2001 From: Ivan Filipenkov Date: Fri, 18 Aug 2023 02:27:44 +0300 Subject: [PATCH 13/21] ladders somewhat work --- DangerousD/GameCore/GUI/DebugHUD.cs | 24 ++++++++++++++++++- .../LivingEntities/Player/Player.cs | 11 +++++++-- .../GameCore/Managers/PhysicsManager.cs | 5 +++- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/DangerousD/GameCore/GUI/DebugHUD.cs b/DangerousD/GameCore/GUI/DebugHUD.cs index b56d90a..c4e3e55 100644 --- a/DangerousD/GameCore/GUI/DebugHUD.cs +++ b/DangerousD/GameCore/GUI/DebugHUD.cs @@ -11,6 +11,7 @@ namespace DangerousD.GameCore.GUI { private SpriteFont _spriteFont; private Dictionary _text = new(); + private List _log = new(); public void Initialize() { @@ -27,10 +28,11 @@ namespace DangerousD.GameCore.GUI public void Draw(SpriteBatch spriteBatch) { + var keysString = Join("\n", _text.Select(el => el.Key + ": " + el.Value).ToList()); spriteBatch.Begin(); spriteBatch.DrawString( _spriteFont, - Join("\n", _text.Select(el => el.Key + ": " + el.Value).ToList()), + keysString, new Vector2(10, 10), Color.Cyan, 0, @@ -39,6 +41,17 @@ namespace DangerousD.GameCore.GUI SpriteEffects.None, 0 ); + spriteBatch.DrawString( + _spriteFont, + Join("\n", _log), + new Vector2(10, 10 + _spriteFont.MeasureString(keysString).Y), + Color.Green, + 0, + Vector2.Zero, + 1, + SpriteEffects.None, + 0 + ); spriteBatch.End(); } @@ -46,5 +59,14 @@ namespace DangerousD.GameCore.GUI { _text[key] = value; } + + public void Log(string value) + { + _log.Add(value); + if (_log.Count > 30) + { + _log.RemoveAt(0); + } + } } } \ No newline at end of file diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 9358d38..62bad69 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -29,6 +29,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities private bool isShooting = false; public GameObject objectAttack; private int bullets; + public bool FallingThroughPlatform = false; public Player(Vector2 position) : base(position) { @@ -153,6 +154,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public override void Update(GameTime gameTime) { + if (isOnGround && FallingThroughPlatform) + { + FallingThroughPlatform = false; + AppManager.Instance.DebugHUD.Log("not falling"); + } GraphicsComponent.SetCameraPosition(Pos); if (!isAttacked) { @@ -214,8 +220,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void MoveDown() { - // ПОЧЕМУ - velocity.Y = -11; + FallingThroughPlatform = true; + isOnGround = false; + AppManager.Instance.DebugHUD.Log("FallingThroughPlatform"); } } diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index e41b848..dee4c27 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -77,6 +77,7 @@ namespace DangerousD.GameCore.Managers if (currentEntity is Player) { AppManager.Instance.DebugHUD.Set("velocity", currentEntity.velocity.ToString()); + AppManager.Instance.DebugHUD.Set("falling", (currentEntity as Player).FallingThroughPlatform.ToString()); AppManager.Instance.DebugHUD.Set("intersects y", ""); } foreach (var mapObject in mapObjects) @@ -107,7 +108,7 @@ namespace DangerousD.GameCore.Managers { foreach (var player in players) { - if (player.velocity.Y <= 0) + if (player.velocity.Y <= 0 || player.FallingThroughPlatform) { continue; } @@ -129,6 +130,8 @@ namespace DangerousD.GameCore.Managers } if (collidedY) { + // костыль потому что в CheckCollisionsLE_MO он спускается + newRect.Y -= (int)Math.Ceiling(player.velocity.Y); player.isOnGround = true; player.velocity.Y = 0; } From c9523578e4c02bbc3ea83b5873faa79a4a3a5f8d Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 02:59:53 +0300 Subject: [PATCH 14/21] SilasCommit --- .../GameObjects/Entities/SilasBall.cs | 24 ++++++++-------- .../LivingEntities/Monsters/SilasHands.cs | 4 +-- .../LivingEntities/Monsters/SilasMaster.cs | 28 +++++++++---------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs index 48dd53b..94e7ca6 100644 --- a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs +++ b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs @@ -12,20 +12,22 @@ namespace DangerousD.GameCore.GameObjects.Entities { public class SilasBall : LivingEntity { - public bool IsVisibility=true; + + private Vector2 v; public SilasBall(Vector2 position) : base(position) { - Height = 60; - Width = 60; + Height = 24; + Width = 24; acceleration = Vector2.Zero; } public SilasBall(Vector2 position, Vector2 velosity) : base(position) { - Height = 60; - Width = 60; + Height = 24; + Width = 24; acceleration = Vector2.Zero; velocity = velosity; + v = velosity; } @@ -33,17 +35,17 @@ namespace DangerousD.GameCore.GameObjects.Entities public override void Update(GameTime gameTime) { base.Update(gameTime); - if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(Rectangle).Count>0) + if (AppManager.Instance.GameManager.physicsManager.CheckRectangle( new Rectangle(Rectangle.X-2,Rectangle.Y-2,Rectangle.Width+8,Rectangle.Height+8)).Count>0) { - IsVisibility = false; + AppManager.Instance.GameManager.Remove(this); } + velocity = v; } public override void Draw(SpriteBatch spriteBatch) { - if (IsVisibility) - { - base.Draw(spriteBatch); - } + + base.Draw(spriteBatch); + } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs index e16f168..a54a59b 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs @@ -15,8 +15,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public SilasHands(Vector2 position) : base(position) { name = "SilasHand"; - Width = 48; - Height = 48; + Width = 16; + Height = 16; monster_health = 2; monster_speed = 2; acceleration = Vector2.Zero; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 4b3b5cb..34069af 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -24,21 +24,17 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public SilasMaster(Vector2 position) : base(position) { name = "SilasMaster"; - Width = 144; - Height = 160; + Width = 48; + Height = 53; monster_health = 15; - monster_speed = 4; + monster_speed = 2; acceleration = Vector2.Zero; leftBorder = (int)position.X - 60; rightBorder = (int)position.X + 120; acceleration = Vector2.Zero; - hands.Add(new SilasHands(new Vector2(Pos.X+60,Pos.Y+120))); - hands.Add(new SilasHands(new Vector2(Pos.X + 90, Pos.Y + 120))); - for (int i = 0; i < 4; i++) - { - SilasBall silasball = new SilasBall(new Vector2(Pos.X + i * 40, Pos.Y + 120), new Vector2((i - 2) * 4, 6)); - balls.Add(silasball); - } + hands.Add(new SilasHands(new Vector2(Pos.X+0,Pos.Y+53))); + hands.Add(new SilasHands(new Vector2(Pos.X + 24, Pos.Y + 53))); + } protected override GraphicsComponent GraphicsComponent { get; } = new GraphicsComponent(new List() { "SilasMove", "SilasAttack" }, "SilasMove"); public override void Attack() @@ -64,13 +60,15 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters private void SpawnAttackBall() { - for (int i = 0; i < balls.Count; i++) + balls.Clear(); + for (int i = 0; i < 4; i++) { - balls[i].SetPosition(new Vector2(Pos.X + i * 40, Pos.Y + 120)); - balls[i].IsVisibility=true; + SilasBall silasball = new SilasBall(new Vector2(Pos.X + i * 12, Pos.Y + 53), new Vector2((i - 2) * 2, 2)); + + balls.Add(silasball); } - - + + } public void Attack(GameTime gameTime) From f26c88ffdcbe56f6b27a22afea47d992a1d714cd Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 03:16:42 +0300 Subject: [PATCH 15/21] nightCommit --- DangerousD/GameCore/GUI/HUD.cs | 4 +--- .../GameCore/GameObjects/LivingEntities/Player/Player.cs | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DangerousD/GameCore/GUI/HUD.cs b/DangerousD/GameCore/GUI/HUD.cs index 07e446a..ee17186 100644 --- a/DangerousD/GameCore/GUI/HUD.cs +++ b/DangerousD/GameCore/GUI/HUD.cs @@ -11,7 +11,6 @@ namespace DangerousD.GameCore.GUI { public class HUD : AbstractGui { - int ammout = 0; List rects = new List { }; int wigth = AppManager.Instance.inGameResolution.X; int height = AppManager.Instance.inGameResolution.Y; @@ -27,9 +26,8 @@ namespace DangerousD.GameCore.GUI } public override void Update(GameTime gameTime) { - rects.Clear(); - for (int i = 0; i < ammout; i++) + for (int i = 0; i < AppManager.Instance.GameManager.GetPlayer1.Bullets; i++) { rects.Add(new Rect(Manager) { rectangle = new Rectangle(wigth / 29 + i * 13, height / 17, 5, 20), mainColor = Color.Yellow }); rects[i].LoadTexture(AppManager.Instance.Content); diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index eef557f..2a2a7ca 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -30,6 +30,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public GameObject objectAttack; private int bullets; + public int Bullets { get { return bullets; } } + public Player(Vector2 position) : base(position) { Width = 16; From 465fc4056246edb9a6b4d2ac9171a51b0179f9a5 Mon Sep 17 00:00:00 2001 From: SergoDobro Date: Fri, 18 Aug 2023 03:41:38 +0300 Subject: [PATCH 16/21] added cool sign --- DangerousD/GameCore/GUI/MenuGUI.cs | 31 +++++++++++++++++----- DangerousD/GameCore/Managers/AppManager.cs | 2 +- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/DangerousD/GameCore/GUI/MenuGUI.cs b/DangerousD/GameCore/GUI/MenuGUI.cs index 82170b1..5842e62 100644 --- a/DangerousD/GameCore/GUI/MenuGUI.cs +++ b/DangerousD/GameCore/GUI/MenuGUI.cs @@ -1,9 +1,12 @@ using DangerousD.GameCore.Managers; +using Microsoft.VisualBasic; using Microsoft.Xna.Framework; using MonogameLibrary.UI.Base; using MonogameLibrary.UI.Elements; +using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Runtime.Serialization; namespace DangerousD.GameCore.GUI; @@ -11,6 +14,12 @@ namespace DangerousD.GameCore.GUI; internal class MenuGUI : AbstractGui { int selected = 0; + Color[] colors = new Color[] { new Color(64, 53, 51), new Color(84, 58, 52), + new Color(170, 101, 63), new Color(254, 208, 116), new Color(252, 231, 124) }; + List

    - + diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs index f218ba6..00d6298 100644 --- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs +++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs @@ -1,4 +1,5 @@ -using Microsoft.Xna.Framework; +using DangerousD.GameCore.Managers; +using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using System; @@ -16,7 +17,7 @@ namespace DangerousD.GameCore.Graphics private List textures; private List texturesNames; private AnimationContainer currentAnimation; - static private int scaling=3; + static private int scaling = 4; public AnimationContainer CurrentAnimation { get @@ -129,12 +130,12 @@ namespace DangerousD.GameCore.Graphics { if (!currentAnimation.IsCycle) { - if(actionOfAnimationEnd != null) + if (actionOfAnimationEnd != null) { actionOfAnimationEnd(currentAnimation.Id); - } + } currentAnimation = neitralAnimation; - + } currentFrame = 0; @@ -152,12 +153,12 @@ namespace DangerousD.GameCore.Graphics { Texture2D texture = textures[texturesNames.FindIndex(x => x == currentAnimation.TextureName)]; float scale; - if (currentAnimation.Offset.X!=0) + if (currentAnimation.Offset.X != 0) { destinationRectangle.X -= (int)currentAnimation.Offset.X; - scale=destinationRectangle.Height/sourceRectangle.Height; + scale = destinationRectangle.Height / sourceRectangle.Height; destinationRectangle.Width = (int)(sourceRectangle.Width * scale); - + } else if (currentAnimation.Offset.Y != 0) { @@ -235,9 +236,26 @@ namespace DangerousD.GameCore.Graphics } public static void SetCameraPosition(Vector2 playerPosition) { - CameraPosition=(playerPosition).ToPoint(); + CameraPosition = (playerPosition).ToPoint(); CameraPosition.X -= 300; CameraPosition.Y -= 200; + if (CameraPosition.X < AppManager.Instance.GameManager.CameraBorder.X) + { + CameraPosition.X = (int)AppManager.Instance.GameManager.CameraBorder.X; + } + if (CameraPosition.X > AppManager.Instance.GameManager.CameraBorder.Y - 460) + { + CameraPosition.X = (int)AppManager.Instance.GameManager.CameraBorder.Y - 460; + } + if (CameraPosition.Y < AppManager.Instance.GameManager.CameraBorder.Z) + { + CameraPosition.Y = (int)AppManager.Instance.GameManager.CameraBorder.Z; + } + if (CameraPosition.Y > AppManager.Instance.GameManager.CameraBorder.W - 470) + { + CameraPosition.Y = (int)AppManager.Instance.GameManager.CameraBorder.W - 470; + } + AppManager.Instance.DebugHUD.Set("CameraPosition", $"{CameraPosition.X}, {CameraPosition.Y}"); } public static Point CameraPosition = new Point(-700, 300); } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 661932c..f957271 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -202,7 +202,8 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("boss"); + GameManager.mapManager.LoadLevel("lvl"); + GameManager.FindBorders(); break; case GameState.Death: break; diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 6b3c2b4..b60d776 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -28,7 +28,7 @@ namespace DangerousD.GameCore public PhysicsManager physicsManager; public List players; public List otherObjects = new(); - + public Vector4 CameraBorder; public Player GetPlayer1 { get; private set; } public GameManager() { @@ -42,6 +42,7 @@ namespace DangerousD.GameCore players = new List(); mapManager = new MapManager(1); physicsManager = new PhysicsManager(); + CameraBorder = Vector4.Zero; } @@ -150,6 +151,8 @@ namespace DangerousD.GameCore GetPlayer1.Update(gameTime); } else + + { for (int i = 0; i < livingEntitiesWithoutPlayers.Count; i++) { @@ -163,5 +166,27 @@ namespace DangerousD.GameCore physicsManager.UpdateCollisions(entities, livingEntities, mapObjects, players, gameTime); } + public void FindBorders() + { + foreach (var item in GetAllGameObjects) + { + if (item.Pos.X CameraBorder.Y) + { + CameraBorder.Y = item.Pos.X; + } + if (item.Pos.Y < CameraBorder.Z) + { + CameraBorder.Z = item.Pos.X; + } + if (item.Pos.Y > CameraBorder.W) + { + CameraBorder.W = item.Pos.X; + } + } + } } } \ No newline at end of file From 25ecea60f835a2609db573aa920e5e419e9ae1f0 Mon Sep 17 00:00:00 2001 From: SergoDobro Date: Fri, 18 Aug 2023 05:15:39 +0300 Subject: [PATCH 21/21] menu ui rework --- DangerousD/GameCore/GUI/AbstractGui.cs | 5 +-- DangerousD/GameCore/GUI/MenuGUI.cs | 19 ++++++-- .../LivingEntities/Player/Player.cs | 2 +- MonogameLibrary/UI/Base/UIManager.cs | 6 ++- MonogameLibrary/UI/Elements/ButtonText.cs | 45 ++++++++++++++++--- MonogameLibrary/UI/Elements/Label.cs | 2 + 6 files changed, 65 insertions(+), 14 deletions(-) diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs index 7f7b212..feb3294 100644 --- a/DangerousD/GameCore/GUI/AbstractGui.cs +++ b/DangerousD/GameCore/GUI/AbstractGui.cs @@ -19,8 +19,7 @@ public abstract class AbstractGui : IDrawableObject private GraphicsDevice graphicsDevice; public virtual void Initialize() { - Manager.Initialize(AppManager.Instance.GraphicsDevice); - this.graphicsDevice = graphicsDevice; + Manager.Initialize(AppManager.Instance.GraphicsDevice); CreateUI(); } @@ -31,7 +30,7 @@ public abstract class AbstractGui : IDrawableObject public virtual void Update(GameTime gameTime) { - Manager.Update(); + Manager.Update(gameTime); } public virtual void Draw(SpriteBatch spriteBatch) diff --git a/DangerousD/GameCore/GUI/MenuGUI.cs b/DangerousD/GameCore/GUI/MenuGUI.cs index 5842e62..fedaacb 100644 --- a/DangerousD/GameCore/GUI/MenuGUI.cs +++ b/DangerousD/GameCore/GUI/MenuGUI.cs @@ -31,8 +31,9 @@ internal class MenuGUI : AbstractGui for (int i = 0; i < colors.Length; i++) { - Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2 - 60, 200, 50, 50), text = "Dangerous", mainColor = Color.Transparent, scale = 1.35f - 0.05f * i * i / 10, fontName = "Font2", fontColor = colors[i] }); + Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2 - 60, 220, 50, 50), text = "Dangerous", mainColor = Color.Transparent, scale = 1.35f - 0.05f * i * i / 10, fontName = "Font2", fontColor = colors[i] }); MainLetterLabels.Add(Elements.Last() as Label); + MainLetterPositions.Add(new Vector2(Elements.Last().rectangle.X, Elements.Last().rectangle.Y)); } int dx = 50; @@ -40,6 +41,7 @@ internal class MenuGUI : AbstractGui { Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2 + 480 + dx - i * i, 260 - i * i / 5, 50, 50), text = "D", mainColor = Color.Transparent, scale = 2.15f - 0.05f * i * i / 5, fontName = "Font2", fontColor = colors[i] }); BigLetterLabels.Add(Elements.Last() as Label); + BigLetterPositions.Add(new Vector2(Elements.Last().rectangle.X, Elements.Last().rectangle.Y)); } var butSingle = new ButtonText(Manager) { rectangle = new Rectangle((wigth - (int)(300 * 2.4)) / 2, 350, (int)(300 * 2.4), (int)(50 * 2.4)), text = "Singleplayer", scale = 1.2f, fontName = "ButtonFont" }; @@ -77,10 +79,21 @@ internal class MenuGUI : AbstractGui { for (int i = 0; i < MainLetterLabels.Count; i++) { - MainLetterLabels[i].fontColor = Color.FromNonPremultiplied(colors[i].ToVector4() * (float)((Math.Sin(gameTime.TotalGameTime.TotalSeconds*2) + 1) / 2f + 0.5f) + MainLetterLabels[i].fontColor = Color.FromNonPremultiplied(colors[i].ToVector4() * + (float)(((Math.Sin(gameTime.TotalGameTime.TotalSeconds * 4) + 1) / 2f) * 0.3 + 0.8f) ); - BigLetterLabels[i].fontColor = Color.FromNonPremultiplied(colors[i].ToVector4() * (float)((Math.Sin(gameTime.TotalGameTime.TotalSeconds * 2) + 1) / 2f + 0.5f) + BigLetterLabels[i].fontColor = Color.FromNonPremultiplied(colors[i].ToVector4() + * (float)(((Math.Sin(gameTime.TotalGameTime.TotalSeconds * 4 - Math.PI) + 1) / 2f) * 0.3 + 0.8f) ); + MainLetterLabels[i].fontColor.A = 255; + BigLetterLabels[i].fontColor.A = 255; + MainLetterLabels[i].rectangle.Y = (int)(MainLetterPositions[i].Y + + (20 * (Math.Sin(gameTime.TotalGameTime.TotalSeconds * 4) + 1) / 2f * 0.25) * (i - MainLetterLabels.Count / 2) + ); + BigLetterLabels[i].rectangle.Y = (int)(BigLetterPositions[i].Y + + (20 * (Math.Sin(gameTime.TotalGameTime.TotalSeconds * 4 - Math.PI) + 1) / 2f * 0.25) * (i - MainLetterLabels.Count / 2) + ); + } base.Update(gameTime); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index edfc3bc..60eaf05 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -92,7 +92,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void Death(string monsterName) { - return; + return; //godmode isAttacked = true; if(monsterName == "Zombie") { diff --git a/MonogameLibrary/UI/Base/UIManager.cs b/MonogameLibrary/UI/Base/UIManager.cs index d37416d..826a0a1 100644 --- a/MonogameLibrary/UI/Base/UIManager.cs +++ b/MonogameLibrary/UI/Base/UIManager.cs @@ -51,8 +51,10 @@ namespace MonogameLibrary.UI.Base } } } - public void Update() - { + public GameTime gameTime; + public void Update(GameTime gameTime) + { + this.gameTime = gameTime; try { keyboardState = Keyboard.GetState(); diff --git a/MonogameLibrary/UI/Elements/ButtonText.cs b/MonogameLibrary/UI/Elements/ButtonText.cs index ba6243d..58ad958 100644 --- a/MonogameLibrary/UI/Elements/ButtonText.cs +++ b/MonogameLibrary/UI/Elements/ButtonText.cs @@ -16,22 +16,57 @@ namespace MonogameLibrary.UI.Elements public ButtonText(UIManager manager, int layerIndex = 0) : base(manager, layerIndex) { } + float gameTime = 0; + public override bool InteractUpdate(MouseState mouseState, MouseState prevmouseState) + { + gameTime += (float)Manager.gameTime.ElapsedGameTime.TotalSeconds; + return base.InteractUpdate(mouseState, prevmouseState); + } + public override void Draw(SpriteBatch _spriteBatch) { if (hoverState == HoverState.None) { - fontColor = Color.White; + var d = (float)(((Math.Sin(gameTime * 2 - Math.PI) + 1) / 2f) * 0.1 + 0.7f); + fontColor = Color.FromNonPremultiplied(new Vector4(0.8f,0.15f, 0.15f, 1) * d + ); } else if (hoverState == HoverState.Hovering) - { - fontColor = new Color(211, 211, 211); + { + var d2 = (float)(((Math.Sin(gameTime * 2 - Math.PI) + 1) / 2f) * 0.1 + 0.7f); + fontColor = Color.FromNonPremultiplied(new Vector4(0.8f, 0.15f, 0.15f, 1) * d2 + ); } else { - fontColor = new Color(112, 128, 144); + //fontColor = new Color(112, 128, 144); + fontColor = new Color(212, 228, 244); } - DrawText(_spriteBatch); + if (hoverState == HoverState.Hovering) + { + int kk = 50; + scale += 0.005f; + var d = (float)(((Math.Sin(gameTime * 1 - Math.PI) + 1) / 2f) * 0.1 + 1f); + Color oldColor = fontColor; + fontColor = Color.FromNonPremultiplied(new Vector4(252 / 255f, 231 / 255f, 124 / 255f, 1) * d + ); + DrawText(_spriteBatch); + fontColor = oldColor; + fontColor.A = 255; + scale -= 0.005f; + scale -= 0.0002f; + } + if (hoverState == HoverState.Pressing) + { + scale -= 0.025f; + DrawText(_spriteBatch); + scale += 0.025f; + } + else + { + DrawText(_spriteBatch); + } } } } diff --git a/MonogameLibrary/UI/Elements/Label.cs b/MonogameLibrary/UI/Elements/Label.cs index e14fc0d..1a8871e 100644 --- a/MonogameLibrary/UI/Elements/Label.cs +++ b/MonogameLibrary/UI/Elements/Label.cs @@ -19,8 +19,10 @@ namespace MonogameLibrary.UI.Elements } protected HoverState hoverState = HoverState.None; + float gameTime = 0; public virtual bool InteractUpdate(MouseState mouseState, MouseState prevmouseState) { + gameTime += (float)Manager.gameTime.ElapsedGameTime.TotalSeconds; if (rectangle.Intersects(new Rectangle(mouseState.Position, Point.Zero))) { if (mouseState.LeftButton == ButtonState.Pressed)