View difference between Paste ID: zBnx2ytA and wdH6QHuu
SHOW: | | - or go back to the newest paste.
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Threading.Tasks;
9
using System.Windows.Forms;
10
using System.IO;
11
using GameCore;
12
13
namespace Game1
14
{
15
    public partial class Form1 : Form
16
    {
17
        int[,] _map = new int[50, 50];
18
19
        Image _groundBlock = Resource1.Ground1;
20
        Image _sandBlock = Resource1.Ground2;
21
        Image _player = Resource1.ForestGump;
22
23
        const int blockWidth = 80, blockHeight = 80;
24
        Camera mainCamera = new Camera(80);
25
        float playerX = 0;
26
        float playerY = 0;
27
        int currentPlacedBlock = 0;
28
29
        public Form1()
30
        {
31
            InitializeComponent();
32
            this.SetStyle(ControlStyles.UserPaint |
33
                ControlStyles.AllPaintingInWmPaint |
34
                ControlStyles.DoubleBuffer, true);
35
36
            KeyPreview = true;
37
            GenerateWorld();
38
        }
39
40
        private void exitButton_Click(object sender, EventArgs e)
41
        {
42
            Application.Exit();
43
        }
44
45
        private void MainLoopTimer_Tick(object sender, EventArgs e)
46
        {
47
            Point cursor = PointToClient(Cursor.Position);
48
49
            MoveCamera(cursor);
50
51
            log.Text = $"{cursor.ToString()}\n{mainCamera.ToString()}";
52
53
            if (!IsGrounded())
54
            {
55
                float prevY = playerY;
56
57
                playerY = playerY + (1f / 10f);
58
59
                if((int)playerY < Math.Round(prevY, MidpointRounding.AwayFromZero))
60
                {
61
                    playerY = (int)Math.Round(prevY, MidpointRounding.AwayFromZero);
62
                }
63
            }
64
65
            Invalidate();
66
            Refresh();
67
        }
68
69
        private void MoveCamera(Point point)
70
        {
71
            mainCamera.X += (int)(10 * CalcDeep(800, 50, point.X));
72
            mainCamera.Y += (int)(10 * CalcDeep(600, 50, point.Y));
73
74
            mainCamera.Y = Clamp(mainCamera.Y, 0, _map.GetLength(1) * mainCamera.Scale - 600);
75
            mainCamera.X = Clamp(mainCamera.X, 0, _map.GetLength(0) * mainCamera.Scale - 800);
76
        }
77
78
        private float CalcDeep(float length, float border, float current)
79
        {
80
            if(current < border)
81
            {
82
                return -(1 - Clamp(current, 0, border) / border);
83
            }
84
85
            if(current > (length - border))
86
            {
87
                return Clamp(1f - (length - current) / border, 0 , 1);
88
            }
89
90
            return 0;
91
        }
92
93
        private float Clamp(float value, float min, float max)
94
        {
95
            if (value > max)
96
            {
97
                return max;
98
            }
99
            else if (value < min)
100
            {
101
                return min;
102
            }
103
104
            return value;
105
        }
106
107
108
        private int Clamp(int value, int min, int max)
109
        {
110
            if(value > max)
111
            {
112
                return max;
113
            }
114
            else if(value < min)
115
            {
116
                return min;
117
            }
118
119
            return value;
120
        }
121
122
        private void Form1_Paint(object sender, PaintEventArgs e)
123
        {
124
            Graphics g = e.Graphics;
125
126
            for(int x = 0; x < _map.GetLength(0); x++)
127
            {
128
                for(int y = 0; y < _map.GetLength(1); y++)
129
                {
130
                    int blockType = _map[x, y];
131
                    Rectangle rect = mainCamera.MatrixToSceenProjection(x, y);
132
                    DrawBlock(rect, blockType, g);
133
                }
134
            }
135
136
            g.DrawImage(_player, mainCamera.MatrixToSceenProjection(playerX, playerY));
137
        }
138
139
        private void Form1_Click(object sender, EventArgs e)
140
        {
141
            Point cursor = PointToClient(Cursor.Position);
142
            
143
            if(cursor.X < 0 || cursor.Y < 0 || cursor.X > 800 || cursor.Y > 600)
144
            {
145
                return;
146
            }
147
148
            int x, y;
149
150
            x = (cursor.X + (int)mainCamera.X) / blockWidth;
151
            y = (cursor.Y + (int)mainCamera.Y) / blockHeight;
152
153
            _map[x, y] = currentPlacedBlock;
154
155
            if (currentPlacedBlock == 0)
156
            {
157
                DestroyNotChainedBlocks();
158
            }
159
160
        }
161
162
        private void DrawBlock(Rectangle rect, int blockType, Graphics g)
163
        {
164
            Image currentImage = null;
165
166
            if (blockType == 1)
167
            {
168
                currentImage = _groundBlock;
169
            }
170
            else if (blockType == 2)
171
            {
172
                currentImage = _sandBlock;
173
            }
174
175
            if (currentImage == null)
176
                return;
177
178
            g.DrawImage(currentImage, rect);
179
        }
180
181
        private void ClearWorld()
182
        {
183
            for(int x = 0; x < _map.GetLength(0); x++)
184
            {
185
                for(int y = 0; y < _map.GetLength(1); y++)
186
                {
187
                    _map[x, y] = 0;
188
                }
189
            }
190
        }
191
192
        private void GenerateWorld()
193
        {
194
            ClearWorld();
195
196
            Random r = new Random();
197
            int direction = 1;
198
            int y = 40;
199
            for (int x = 0; x < _map.GetLength(0); x++)
200
            {
201
                y += direction;
202
                direction = r.Next(-1, 2);
203
                for (int _y = y; _y < _map.GetLength(1); _y++)
204
                {
205
                    _map[x, _y] = 1;
206
                }
207
            }
208
209
            for(int i = 0; i < _map.GetLength(1); i++)
210
            {
211
                if(_map[3, i] != 0)
212
                {
213
                    playerY = i - 1;
214
                    playerX = 3;
215
216
                    break;
217
                }
218
            }
219
        }
220
221
        private void SaveWorld()
222
        {
223
            File.Delete("first.world");
224
225
            for (int x = 0; x < _map.GetLength(0); x++)
226
            {
227
                for (int y = 0; y < _map.GetLength(1); y++)
228
                {
229
                    if(_map[x, y] != 0)
230
                    {
231
                        File.AppendAllText("first.world", $"Block:X={x};Y={y};Type={_map[x,y]}\n");
232
                    }
233
                }
234
            }
235
            File.AppendAllText("first.world", $"Camera:X={mainCamera.X};Y={mainCamera.X}\n");
236
        }
237
        
238
        private void DestroyNotChainedBlocks()
239
        {
240
            List<Point> whiteList = new List<Point>();
241
242
            Queue<Point> queue = new Queue<Point>();
243
244
            for(int x = 0; x < 50; x++)
245
            {
246
                queue.Enqueue(new Point(x, 49));
247
248
                while(queue.Count > 0)
249
                {
250
                    Point current = queue.Dequeue();
251
                    whiteList.Add(current);
252
253
                    Point[] points =
254
                    {
255
                        new Point(current.X + 1, current.Y - 1),
256
                        new Point(current.X + 1, current.Y + 1),
257
                        new Point(current.X - 1, current.Y - 1),
258
                        new Point(current.X - 1, current.Y + 1),
259
                        new Point(current.X, current.Y - 1),
260
                        new Point(current.X, current.Y + 1),
261
                        new Point(current.X + 1, current.Y),
262
                        new Point(current.X - 1, current.Y),
263
                    };
264
265
                    for(int i = 0; i < points.Length; i++)
266
                    {
267
                        if (points[i].X > 49 || points[i].X < 0) continue;
268
                        if (points[i].Y > 49 || points[i].Y < 0) continue;
269
270
                        if (!whiteList.Contains(points[i]) &&
271
                            _map[points[i].X, points[i].Y] != 0)
272
                        {
273
                            whiteList.Add(points[i]);
274
                            queue.Enqueue(points[i]);
275
                        }
276
                    }
277
                }
278
            }
279
280
            for(int x = 0; x < _map.GetLength(0); x++)
281
            {
282
                for(int y = 0; y < _map.GetLength(1); y++)
283
                {
284
                    if(!whiteList.Contains(new Point(x, y)))
285
                    {
286
                        _map[x, y] = 0;
287
                    }
288
                }
289
            }
290
        }
291
292
        private bool IsGrounded()
293
        {
294
            if (playerY == 49) return true;
295
296
            if(_map[(int)playerX, (int)playerY + 1] != 0)
297
            {
298
                return true;
299
            }
300
301
            if(_map[(int)Math.Round(playerX, MidpointRounding.AwayFromZero), (int)playerY + 1] != 0)
302
            {
303
                return true;
304
            }
305
306
            return false;
307
        }
308
309
        //UI Handles
310
        private void button1_Click(object sender, EventArgs e)
311
        {
312
            currentPlacedBlock = 1;
313
        }
314
315
        private void button2_Click(object sender, EventArgs e)
316
        {
317
            currentPlacedBlock = 2;
318
        }
319
320
        private void generateButton_Click(object sender, EventArgs e)
321
        {
322
            GenerateWorld();
323
        }
324
325
        private void loadButton_Click(object sender, EventArgs e)
326
        {
327
            ClearWorld();
328
            _map = Core.LoadWorld();
329
        }
330
331
        private void saveButton_Click(object sender, EventArgs e)
332
        {
333
            SaveWorld();
334
        }
335
336
        private void Form1_KeyDown(object sender, KeyEventArgs e)
337
        {
338
            if(e.KeyCode == Keys.D)
339
            {
340
                playerX += 0.2f;
341
            }
342
343
            if(e.KeyCode == Keys.E)
344
            {
345
                mainCamera.X = (int)playerX * mainCamera.Scale;
346
                mainCamera.Y = (int)playerY * mainCamera.Scale;
347
            }
348
        }
349
350
        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
351
        {
352
353
        }
354
355
        private void button3_Click(object sender, EventArgs e)
356
        {
357
            currentPlacedBlock = 0;
358
        }
359
    }
360
}