Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
5 / 5 / 0
Регистрация: 22.05.2012
Сообщений: 122

Создание стен в игре

29.12.2015, 22:52. Показов 9716. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, я решился создать простую игру бродилку по лабиринту, и сделать это как можно красивее в плане написания кода.
В общем я планирую сделать поле которое будет состоять из блоков стен, через которые мой персонаж проходить не сможет. Лабиринт будет генерироваться алгоритмом который я планирую найти и понять позже.
Так вот суть вопроса в том, что как правильнее описать эту "стену". Создать отдельный класс или как, натолкните на мысль
Еще, использовать простые лейблы мне кажется как то больно примитивно(Да, я видел тот пример лабиринта на msdn'e)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.12.2015, 22:52
Ответы с готовыми решениями:

Создание стен из picturebox для игры
Игра являет собой подобие Танчиков на Денди, каждый элемент в ней реализован с помощью PictureBox. Вся загвоздка на данный момент...

Создание "стен"(границ) у panel
Здравствуйте! Помогите пожалуйста. У меня такая проблема: У меня картинки падают вниз и рандомно двигаются на право и на лево, но некоторые...

Как правильно реализовать непроходимость и генерацию стен в игре
Я тут накодил вывод массива, рандомную генерацию стен и управление игроком(@) для игрушки. uses crt; const m = 24; n = 48; ...

32
5 / 5 / 0
Регистрация: 22.05.2012
Сообщений: 122
02.01.2016, 19:14  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Попробуйте вызывать метод Clear перед grf.DrawImage(...)
Нет не вышло, оно просто Panel закрасило цветом и все.
Я тут посмотрел проекты которые мне скинули и понял что надо использовать PictureBox, и сейчас все по новой реализую, как сделаю - отпишусь.
0
5 / 5 / 0
Регистрация: 22.05.2012
Сообщений: 122
02.01.2016, 19:46  [ТС]
Ну на данный момент у меня кое что получилось:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    static class Render
    {
        // Размер границы тайла
        private static int sizeOfBorderTile = 60;
        // Box
        private static Bitmap box;
 
        public static Bitmap DrawBox(int x, int y)
        {
            if (box == null)
                box = new Bitmap(960,600);
            var grph = Graphics.FromImage(box);
            grph.Clear(Color.Transparent);
            grph.DrawImage(Properties.Resources.TileWall,x,y,60,60);
            return box;
        }
    }
 
    public partial class TestForm : Form
    {
        bool boxMoving;
        int x, y;
        public TestForm()
        {
            InitializeComponent();
            BtnMove.Text = "Двигать";
            boxMoving = false;
            x = 0;
            y = 0;
        }
 
        private void BtnMove_Click(object sender, EventArgs e)
        {
            if (boxMoving)
            {
                BtnMove.Text = "Двигать";
                boxMoving = false;
                timerMoveBox.Enabled = false;
            }
            else
            {
                BtnMove.Text = "Остановить";
                boxMoving = true;
                timerMoveBox.Enabled = true;
            }
        }
 
        private void timerMoveBox_Tick(object sender, EventArgs e)
        {
            pbGameField.Image = Render.DrawBox(x, y);
            x += 5;
            y += 5;
        }
    }
0
5 / 5 / 0
Регистрация: 22.05.2012
Сообщений: 122
02.01.2016, 22:48  [ТС]
Все конечно зашибись, только данная строка:
C#
1
grph.Clear(Color.Transparent);
С огромным успехом затирает всю карту, собственно как затирать только движущийся объект?

Добавлено через 23 минуты
А если перерисовывать вместе с картой то это занимает время из за чего происходит задержка в прорисовке, и собственно обьект движется рывками.
Вот код того как я рисую:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public static Bitmap Draw(Level lvl, int x, int y)
        {
            var grph = Graphics.FromImage(box);
            grph.Clear(Color.Transparent);
 
            for (int i = 0; i < lvl.GameField.GetLength(0); i++)
                for (int j = 0; j < lvl.GameField.GetLength(1); j++)
                {
                    if (lvl.GameField[i, j].type == TypeOfContent.Wall)
                        grph.DrawImage(Properties.Resources.TileWall, j * sizeOfBorderTile, i * sizeOfBorderTile, sizeOfBorderTile, sizeOfBorderTile);
                    else if (lvl.GameField[i, j].type == TypeOfContent.Land)
                        grph.DrawImage(Properties.Resources.TileGround, j * sizeOfBorderTile, i * sizeOfBorderTile, sizeOfBorderTile, sizeOfBorderTile);
                }
            grph.DrawImage(Properties.Resources.TileWall,x,y,60,60);
            return box;
        }
Добавлено через 2 минуты
Карта у меня во время игры меняться то не будет, вот я и думаю что ее перерисовывать не нужно, или я не прав?
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,144
Записей в блоге: 243
02.01.2016, 23:23
Цитата Сообщение от влад0 Посмотреть сообщение
С огромным успехом затирает всю карту, собственно как затирать только движущийся объект?
Я думаю, что нет способа затирать только определённые места на форме. Придётся перерисовывать всю карту. Поправьте кто-нибудь если ошибаюсь.

Смотрел ваш код. Что-то я не понял, про какие рывки вы пишите?

Было бы интересно увидеть карту и чтобы можно было стрелками клавиатуры передвигать квадрат обозначающий главного героя.
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,144
Записей в блоге: 243
02.01.2016, 23:30
У меня есть SpriteSheet главного героя под рукой. Можно заменять рисунки с определённым интервалом при движении в определённом направлении и получится анимация движения. Если, конечно, вы ещё не нашли главного героя.
Изображения
 
0
5 / 5 / 0
Регистрация: 22.05.2012
Сообщений: 122
03.01.2016, 00:06  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Было бы интересно увидеть карту
Вот(Стены и землю сам нарисовал на скорую руку):


Цитата Сообщение от 8Observer8 Посмотреть сообщение
и чтобы можно было стрелками клавиатуры передвигать квадрат обозначающий главного героя.
Такого квадрата как такового еще и нету. На данный момент я пытаюсь только лишь передвинуть хоть какой-то квадрат по карте, не обращая внимания на препятствия. Вот собственно и происходит торможение. То-есть если чисто квадрат двигать(без прорисовки карты) то он(квадрат) двигается довольно шустро, а если с картой рисовать то движение происходит рывками, я бы даже сказал с меньшей скоростью.

Движения квадрата клавиатурой я тоже пока не смог реализовать.

Цитата Сообщение от 8Observer8 Посмотреть сообщение
У меня есть SpriteSheet главного героя под рукой. Можно заменять рисунки с определённым интервалом при движении в определённом направлении и получится анимация движения. Если, конечно, вы ещё не нашли главного героя.
За персонажа спасибо, и собственно тут же вопрос как пользоватся данными спрайтами, пример бы хотелось посмотреть, если есть
1
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,144
Записей в блоге: 243
03.01.2016, 00:23
Цитата Сообщение от влад0 Посмотреть сообщение
собственно тут же вопрос как пользоватся данными спрайтами, пример бы хотелось посмотреть, если есть
Я делал спрайтовую анимацию на Qt С++ OpenGL. Там никаких проблем с отрисовкой всей карты нет, потому что OpenGL заточен на отрисовку. Сам сейчас изучаю WPF. Мне самому интересно, почитать что кто напишет как на WinForms сделать спрайтовую анимацию. Может какие-то свои размышления попозже предложу. Хотел предложить многопоточность раз есть такие проблемы с отрисовкой. Но не знаю, стоит ли, и возможно ли её вообще здесь применить.

Сегодня Бомбермана делаю. Тайлы не сам нарисовал, а уровень сам создал:
Миниатюры
Создание стен в игре  
0
5 / 5 / 0
Регистрация: 22.05.2012
Сообщений: 122
03.01.2016, 00:46  [ТС]
Почему может не реагировать на события нажатия клавиш? обработчики вообще не вызываются...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 public partial class TestForm : Form
    {
        private Level gameLevel = new Level(false);
 
        bool boxMoving, btnDown;
        bool changeX, changeY;
        int x, y;
        int coefX, coefY;
        public TestForm()
        {
            InitializeComponent();
            BtnMove.Text = "Остановить";
            timerMoveBox.Enabled = true;
            boxMoving = false;
            x = 0;
            y = 0;
            coefX = 1;
            coefY = 1;
            changeX = false;
            changeY = false;
        }
 
        private void BtnMove_Click(object sender, EventArgs e)
        {
            if (boxMoving)
            {
                BtnMove.Text = "Двигать";
                boxMoving = false;
                timerMoveBox.Enabled = false;
            }
            else
            {
                BtnMove.Text = "Остановить";
                boxMoving = true;
                timerMoveBox.Enabled = true;
            }
        }
 
        private void timerMoveBox_Tick(object sender, EventArgs e)
        {
            
            pbGameField.Image = Render.DrawBox(x, y);
            if (btnDown)
            {
                if (changeX)
                    x += coefX * 5;
                if (changeY)
                    y += coefY * 5;
            }      
        }
 
        private void TestForm_Load(object sender, EventArgs e)
        {
            pbGameField.Image = Render.DrawLevel(gameLevel);
        }
 
        private void TestForm_KeyDown(object sender, KeyEventArgs e)
        {
            btnDown = true;
            if (e.KeyCode == Keys.Up)
            {
                coefY = -1;
                changeY = true;
            }
            if (e.KeyCode == Keys.Down)
            {
                coefY = 1;
                changeY = true;
            }
            if (e.KeyCode == Keys.Left)
            {
                coefX = -1;
                changeX = true;
            }
            if (e.KeyCode == Keys.Right)
            {
                coefX = 1;
                changeX = true;
            }
        }
 
        private void TestForm_KeyUp(object sender, KeyEventArgs e)
        {
            btnDown = false;
            changeX = false;
            changeY = false;
        }     
    }
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
03.01.2016, 12:32
влад0, попробуйте в конструкторе формы прописать
C#
1
KeyPreview = true;
Еще вместо события KeyPress можно использовать это
C#
1
2
3
protected override bool ProcessDialogKey(Keys keyData)
{
}
Если серьезно графикой решили заняться, то имеет смысл использовать например OpenGL. А то щас напишете свой велосипед...
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,144
Записей в блоге: 243
03.01.2016, 12:44
Цитата Сообщение от tarasalk Посмотреть сообщение
Если серьезно графикой решили заняться, то имеет смысл использовать например OpenGL. А то щас напишете свой велосипед...
Добавлю, что если решили заняться серьёзно разработкой игр на C#, то имеет смысли изучать фреймворк Unity. Опять же, чтобы свой велосипед не писать.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.01.2016, 15:07
влад0,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Windows.Forms;
 
namespace WindowsFormsApplication326
{
    public partial class MainForm : Form
    {
        private LevelPanel pnLevel;
 
        public MainForm()
        {
            InitializeComponent();
 
            GameResources.Init();
            Game.Init();
 
            SetClientSizeCore(Game.State.Level.Width * Game.TileSize.Width, Game.State.Level.Height * Game.TileSize.Height);
            pnLevel = new LevelPanel() { Parent = this, Dock = DockStyle.Fill };
 
            Application.Idle += delegate { UpdateInterface(); };
        }
 
        private void UpdateInterface()
        {
            pnLevel.Invalidate();
            Game.Update();
        }
    }
 
    public static class Game
    {
        public static Size TileSize = new Size(32, 32);
        public static GameState State { get; set; }
        public static PlayerController PlayerController { get; set; }
        public static CoinController CoinController { get; set; }
 
        public static void Init()
        {
            State = new GameState();
            PlayerController = new PlayerController();
            CoinController = new CoinController();
 
            State.Level = Level.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "level.txt"));
            State.Player = new Player() { Location = new PointF(1, 1), Sprite = new RowSprite() { FrameSize = new Size(70, 70)} };
            State.CoinSprite = new Sprite {FrameCount = 64, FrameSize = new Size(64, 64)};
        }
 
        public static void Update()
        {
            PlayerController.Update();
            CoinController.Update();
        }
    }
 
    /// <summary>
    /// State of the game (can be saved and loaded form file)
    /// </summary>
    [Serializable]
    public class GameState
    {
        public Level Level { get; set; }
        public Player Player { get; set; }
        public Sprite CoinSprite { get; set; }
    }
 
    public static class GameResources
    {
        public static Bitmap Wall;
        public static Bitmap Player;
        public static Bitmap Floor;
        public static Bitmap Empty;
        public static Bitmap Coin;
        public static Bitmap Water;
 
        public static void Init()
        {
            Empty = new Bitmap(Game.TileSize.Width, Game.TileSize.Height);
            Wall = LoadTile("http://figli.pp.ua/wp-content/uploads/2014/01/stone-pat-001.jpg");
            Floor = LoadTile("http://preview.turbosquid.com/Preview/2014/08/01__18_23_50/Floor.JPG289273a2-a646-40b7-9029-0944498b1a40Small.jpg");
            Player = Load("http://rpgmaker.net/media/content/users/2220/locker/Lilaf8.png");
            Coin = Load("http://assets.indiecity.com/eeaca254-71c1-4709-bdad-e9170a766504/screenshot_1353671388.png");
            Water = Load("http://i678.photobucket.com/albums/vv143/GameGuysProjects/water.png");
        }
 
        static Bitmap LoadTile(string url)
        {
            using (var res = (Bitmap)Image.FromStream(new WebClient { Proxy = null }.OpenRead(url)))
            {
                res.SetResolution(96, 96);
                return new Bitmap(res, Game.TileSize);
            }
        }
 
        static Bitmap Load(string url)
        {
            var res = (Bitmap) Image.FromStream(new WebClient {Proxy = null}.OpenRead(url));
            res.SetResolution(96, 96);
            return res;
        }
    }
 
    public static class Keyboard
    {
        [Flags]
        private enum KeyStates
        {
            None = 0,
            Down = 1,
            Toggled = 2
        }
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        private static extern short GetKeyState(int keyCode);
 
        private static KeyStates GetKeyState(Keys key)
        {
            KeyStates state = KeyStates.None;
 
            short retVal = GetKeyState((int)key);
 
            if ((retVal & 0x8000) == 0x8000)
                state |= KeyStates.Down;
 
            if ((retVal & 1) == 1)
                state |= KeyStates.Toggled;
 
            return state;
        }
 
        public static bool IsKeyDown(Keys key)
        {
            return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
        }
 
        public static bool IsKeyToggled(Keys key)
        {
            return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
        }
    }
 
    public class PlayerController
    {
        public float Speed { get;set;}
 
        public PlayerController()
        {
            Speed = 0.06f;
        }
 
        public void Update()
        {
            var sprite = Game.State.Player.Sprite;
            var tiles = Game.State.Level.Tiles;
 
            var dx = 0;
            var dy = 0;
            var speed = Speed;
            if(Keyboard.IsKeyDown(Keys.W)) dy = -1;
            if(Keyboard.IsKeyDown(Keys.A)) dx = -1;
            if(Keyboard.IsKeyDown(Keys.S)) dy = 1;
            if(Keyboard.IsKeyDown(Keys.D)) dx = 1;
            if(Keyboard.IsKeyDown(Keys.ShiftKey)) speed *= 1.5f;
 
            var x = Game.State.Player.Location.X + dx * speed;
            var y = Game.State.Player.Location.Y + dy * speed;
            var i = (int)x;
            var j = (int)y;
            if (tiles[i + 1, j + 1].CanWalk && 
                tiles[i, j].CanWalk &&
                tiles[i + 1, j].CanWalk &&
                tiles[i, j + 1].CanWalk)
            {
                Game.State.Player.Location = new PointF(x, y);
 
                if (dy > 0) sprite.Row = 0; else
                if (dy < 0) sprite.Row = 3; else
                if (dx > 0) sprite.Row = 2; else
                if (dx < 0) sprite.Row = 1; else
                {
                    //stay
                    sprite.Row = sprite.Row == 3 ? 3 : 0;
                    sprite.CurrentFrame = 0;
                }
 
                if (dx != 0 || dy != 0)
                    Game.State.Player.Sprite.GotoNextFrame(speed*8);
            }else
            {
                //stay
                Game.State.Player.Sprite.CurrentFrame = 0;
                Game.State.Player.Sprite.Row = 0;
            }
        }
    }
 
    public class CoinController
    {
        public float Speed { get; set; }
 
        public CoinController()
        {
            Speed = 3f;
        }
 
        public void Update()
        {
            Game.State.CoinSprite.GotoNextFrame(Speed);
 
            var i = (int)(Game.State.Player.Location.X + 0.5f);
            var j = (int)(Game.State.Player.Location.Y + 0.5f);
            if (Game.State.Level.Tiles[i, j] is Coin)
                Game.State.Level.Tiles[i, j] = new Floor(){Location = new Point(i, j)};
        }
    }
 
    public class RowSprite
    {
        public Size FrameSize { get; set; }
        public float CurrentFrame { get; set; }
        public int Row { get; set; }
 
        public void GotoNextFrame(float dt)
        {
            CurrentFrame += dt;
        }
 
        public void Draw(Graphics gr, Image image, Point location, Size size)
        {
            var framesPerRow = image.Width / FrameSize.Width;
            var x = (int)CurrentFrame % framesPerRow;
            var y = Row;
 
            if (CurrentFrame >= framesPerRow) CurrentFrame = 0;
 
            var p = new Point(x * FrameSize.Width, y * FrameSize.Height);
            gr.DrawImage(image, new Rectangle(location, size), new Rectangle(p, FrameSize), GraphicsUnit.Pixel);
        }
    }
 
    public class Sprite
    {
        public Size FrameSize { get; set; }
        public float CurrentFrame { get; set; }
        public int FrameCount { get; set; }
 
        public void GotoNextFrame(float dt)
        {
            CurrentFrame += dt;
            if (CurrentFrame >= FrameCount)
                CurrentFrame = 0;
        }
 
        public void Draw(Graphics gr, Image image, Point location)
        {
            var framesPerRow = image.Width / FrameSize.Width;
            var x = (int)CurrentFrame % framesPerRow;
            var y = (int)CurrentFrame / framesPerRow;
 
            var p = new Point(x * FrameSize.Width, y * FrameSize.Height);
            gr.DrawImage(image, new Rectangle(location, Game.TileSize), new Rectangle(p, FrameSize), GraphicsUnit.Pixel);
        }
    }
 
    /// <summary>
    /// Displays level
    /// </summary>
    public class LevelPanel : UserControl
    {
        public LevelPanel()
        {
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
        }
 
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            //nothing
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            //draw tiles
            foreach(var tile in Game.State.Level.Tiles)
                tile.Draw(e.Graphics);
 
            //draw player
            Game.State.Player.Draw(e.Graphics);
        }
    }
 
    [Serializable]
    public class Level
    {
        public Tile[,] Tiles { get; private set; }
 
        public int Width { get; private set; }
        public int Height { get; private set; }
 
        public static Level Load(string fileName)
        {
            var res = new Level();
            var lines = File.ReadAllLines(fileName);
 
            res.Width = lines[0].Length;
            res.Height = lines.Length;
 
            res.Tiles = new Tile[res.Width, res.Height];
 
            for (int j = 0; j < res.Height; j++)
            for (int i = 0; i < res.Width; i++) 
                switch(lines[j][i])
                {
                    case '.':
                    case ' ': res.Tiles[i, j] = new Floor { Location = new Point(i, j) }; break;
                    case '#': res.Tiles[i, j] = new Wall { Location = new Point(i, j) }; break;
                    case '@': res.Tiles[i, j] = new Coin { Location = new Point(i, j) }; break;
                    case 'w':
                    case 'W': res.Tiles[i, j] = new Water { Location = new Point(i, j) }; break;
                    default: goto case ' ';
                }
 
            return res;
        }
    }
 
    [Serializable]
    public abstract class Tile
    {
        public Point Location { get; set; }
        public Rectangle Rect
        {
            get { return new Rectangle(Game.TileSize.Width * Location.X, Game.TileSize.Width * Location.Y, Game.TileSize.Width, Game.TileSize.Height); }
        }
 
        public virtual bool CanWalk{ get { return true; } }
 
        public abstract void Draw(Graphics gr);
    }
 
    [Serializable]
    public class Floor: Tile
    {
        public override void Draw(Graphics gr)
        {
            gr.DrawImageUnscaledAndClipped(GameResources.Floor, Rect);
        }
    }
 
    [Serializable]
    public class Wall : Tile
    {
        public override bool CanWalk { get { return false; } }
 
        public override void Draw(Graphics gr)
        {
            gr.DrawImageUnscaledAndClipped(GameResources.Wall, Rect);
        }
    }
 
    [Serializable]
    public class Coin : Tile
    {
        public override void Draw(Graphics gr)
        {
            gr.DrawImageUnscaledAndClipped(GameResources.Floor, Rect);
            Game.State.CoinSprite.Draw(gr, GameResources.Coin, Rect.Location);
        }
    }
 
    [Serializable]
    public class Water : Tile
    {
        public override bool CanWalk { get{ return false; } }
 
        public override void Draw(Graphics gr)
        {
            gr.DrawImageUnscaledAndClipped(GameResources.Water, Rect);
        }
    }
 
    [Serializable]
    public class Character
    {
        public PointF Location { get;set;}
        public RowSprite Sprite { get; set; }
 
        public virtual void Draw(Graphics gr)
        {
        }
    }
 
    [Serializable]
    public class Player : Character
    {
        public override void Draw(Graphics gr)
        {
            var x = (int)(Location.X * Game.TileSize.Width);
            var y = (int)(Location.Y * Game.TileSize.Height);
            Sprite.Draw(gr, GameResources.Player, new Point(x, y), Game.TileSize);
        }
    }
}
Управление: WASD (+Shift)
Файл уровня: level.txt (должен лежать рядом с exe)
Миниатюры
Создание стен в игре  
2
5 / 5 / 0
Регистрация: 22.05.2012
Сообщений: 122
03.01.2016, 23:40  [ТС]
Цитата Сообщение от tarasalk Посмотреть сообщение
Если серьезно графикой решили заняться, то имеет смысл использовать например OpenGL. А то щас напишете свой велосипед...
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Добавлю, что если решили заняться серьёзно разработкой игр на C#, то имеет смысли изучать фреймворк Unity. Опять же, чтобы свой велосипед не писать.
Опять же, мне интересно изучать как все это работает. Когда ты это знаешь остальное гораздо проще приходит в понимание. Да и я думаю лишние знания мне не повредят, пока есть стремление, лучше мучать свою голову, а то потом лень будет

Добавлено через 2 часа 36 минут
Цитата Сообщение от Storm23 Посмотреть сообщение
Управление: WASD (+Shift)
Файл уровня: level.txt (должен лежать рядом с exe)
Огромное спасибо, я думаю мне это очень поможет
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,144
Записей в блоге: 243
07.01.2016, 11:52
Я нашёл серию уроков, как рисовать с помощью DirectX на форме: DirectX Programming Tutorial With C#

P.S. В восьмом видео показано, как работать с Sprite Sheet. Причём, все видео по 2-6 минут.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2016, 11:52

Создание Стен
Задум такой. У меня есть инпут для текста, пользователь вводит туда число (например 5 и создается комната 5х5). Все роботает но беда со...

Создание магазина в игре
Здравствуйте люди, хотел бы так сказать попросить о помощи, по поводу создания магазинов в играх. Нужен совет потому что у самого чего-то...

Создание ландшафт в игре
Всем добрый день! Есть кто, кто занимался созданием ландшафт в 3д максе или других прогах? На данный момент я заканчиваю бэтту версию...

Создание паузы в игре
Подскажите, пожалйста, как грамотно можно реализовать паузу в игре? Т.е. чтобы нажать клавишу один раз - меню паузы появилось и при этом...

Создание меню в игре
Здравствуйте. Столкнулся с проблемой создания меню в игре. Дело в том, что у меня при запуске игры она начинается буквально сразу. Т.е....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru