Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114

Передвижение объекта к координатам клика

17.09.2012, 12:13. Показов 5152. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, делаю маленькую игру, и мне нужно, что бы при нажатии мышью на какую-нибудь область объект начинал двигаться в эту область(как в стратегиях или рпг).
Проблем с координатами у меня нет, единственная проблема, это как рассчитать путь от клика до объекта.
Сможете мне помочь? Помощь ваша очень нужна! Буду сильно вам благодарен. Пишу на OpenGL(Tao)
Код:
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
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
using Tao.FreeGlut;
using Tao.Platform.Windows;
 
namespace Game_Test
{
    public partial class Test : Form
    {
        public Test()
        {
            InitializeComponent();
            MoG.InitializeContexts();
        }
        double ScreenW, ScreenH;
        double MousX, MousY;
        private float devX;
        private float devY; 
        private bool mousClick;
        private double x=0, y=0, R=0;
        private void Form1_Load(object sender, EventArgs e)
        {
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
            Gl.glClearColor(0, 0, 0, 1);
            Gl.glViewport(0, 0, MoG.Width, MoG.Height);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            //перехожу в декартову систему координат
            if ((float)MoG.Width <= (float)MoG.Height)
            {
                ScreenW = 30.0;
                ScreenH = 30.0 * (float)MoG.Height / (float)MoG.Width;
                Glu.gluOrtho2D(0.0, ScreenW, 0.0, ScreenH);
            }
            else
            {
                ScreenW = 30.0 * (float)MoG.Width / (float)MoG.Height;
                ScreenH = 30.0; 
                Glu.gluOrtho2D(0.0, 30.0 * (float)MoG.Width / (float)MoG.Height, 0.0, 30.0);
            }
            //Соотношение сторон экрана
            devX = (float)ScreenW / (float)MoG.Width;
            devY = (float)ScreenH / (float)MoG.Height;
            //Координаты центра объекта
            x = 5.0;
            y = 5.0;
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            RenderTimer.Start();
        }
 
        private void RenderTimer_Tick(object sender, EventArgs e)
        {
            Draw();
        }
        private void Draw()
        {
            R = (double)trackBarR.Value;
 
                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
            //отрисовка сетки координат
                for (double d_x = 0.0; d_x <= 31.0; d_x = d_x + 1.0)
                {
                    Gl.glBegin(Gl.GL_LINES);
                    Gl.glColor3d(0.25, 0.25, 0.25);
                    Gl.glVertex2d(d_x, 0.0);
                    Gl.glVertex2d(d_x, 30.0);
                    Gl.glEnd();
 
                }
                for (double d_y = 0.0; d_y <= 30.0; d_y = d_y + 1.0)
                {
                    Gl.glBegin(Gl.GL_LINES);
                    Gl.glColor3d(0.25, 0.25, 0.25);
                    Gl.glVertex2d(0.0, d_y);
                    Gl.glVertex2d(31.0, d_y);
                    Gl.glEnd();
 
                }
            //отрисовка оси Y
                Gl.glBegin(Gl.GL_LINES);
                Gl.glColor3d(0.0, 0.0, 1.0);
                Gl.glVertex2d(0.0, 1.0);
                Gl.glVertex2d(31.0, 1.0);
                Gl.glEnd();
            //отрисовка оси X
                Gl.glBegin(Gl.GL_LINES);
                Gl.glColor3d(0.0, 1.0, 0.0);
                Gl.glVertex2d(1, 0.0);
                Gl.glVertex2d(1, 30.0);
                Gl.glEnd();
                Polygon(x, y, R);
                Gl.glFlush();
            MoG.Invalidate();
        }
        //функция рисования круга
        private void Circle(double x0, double y0, double R)
        {
            double[,] GrapValuesArray;
            int elements_count = 0;
            double x, y;
            elements_count = 0; 
            GrapValuesArray = new double[63, 2];
            for (double fi = 0.0; fi < 2.0*Math.PI; fi += 0.1)
            {
                x = x0 + R * (Math.Cos(fi));
                y = y0 + R * (Math.Sin(fi));
                GrapValuesArray[elements_count, 0] = x;
                GrapValuesArray[elements_count, 1] = y;
                elements_count++;
            };
            Gl.glBegin(Gl.GL_LINE_LOOP);
            Gl.glVertex2d(GrapValuesArray[0, 0], GrapValuesArray[0, 1]);
            for (int ax = 1; ax < elements_count; ax += 2)
            {
                Gl.glVertex2d(GrapValuesArray[ax, 0], GrapValuesArray[ax, 1]);
            }
            Gl.glEnd();
        }
        //функция рисования окружности
        private void Polygon(double x0, double y0, double R)
        {
            double[,] GrapValuesArray;
            int elements_count = 0;
            double x, y;
            elements_count = 0;
            GrapValuesArray = new double[63, 2];
            for (double fi = 0.0; fi < 2.0 * Math.PI; fi += 0.1)
            {
                x = x0 + R * (Math.Cos(fi));
                y = y0 + R * (Math.Sin(fi));
                GrapValuesArray[elements_count, 0] = x;
                GrapValuesArray[elements_count, 1] = y;
                elements_count++;
            }
            Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex2d(GrapValuesArray[0, 0], GrapValuesArray[0, 1]);
            for (int ax = 1; ax < elements_count; ax += 2 )
                Gl.glVertex2d(GrapValuesArray[ax, 0], GrapValuesArray[ax, 1]);
            Gl.glEnd();
        }
 
        private void MoG_MouseDown(object sender, MouseEventArgs e)
        {
            mousClick = true;
        }
 
        private void MoG_MouseUp(object sender, MouseEventArgs e)
        {
            mousClick = false;
        }
 
        private void MoG_MouseMove(object sender, MouseEventArgs e)
        {
            if(mousClick)
           {     
          //Координаты мыши                       
                MousX = devX * e.X;
                MousY = (double)(ScreenH - devY * e.Y);
           }
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.09.2012, 12:13
Ответы с готовыми решениями:

Передвижение объекта по форме
Написал следующий код. Объекты передвигаются, но с жуткой инерцией. Т.е. еще некоторое время продолжают идти в предыдущем направлении. Кто...

Отправка SendMessage для клика по координатам внутри формы, при этом не передвигать курсор
Необходимо кликнуть по координатам внутри формы,при этом не передвигать курсор. Полазив по форумам я понял что реализовать это можно...

Не работает 2D передвижение объекта к месту клика мышкой
Суть в том, что после клика мыши объект получает координаты X и Y клика, и должен двигаться в том направлении. Координаты передаются в...

20
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
17.09.2012, 12:29
Цитата Сообщение от Демик Посмотреть сообщение
это как рассчитать путь от клика до объекта.
поищи волновой алгоритм
например
здесь есть реализация на шарпе
Волновой алгоритм
а здесь я объяснял что сие такое
С чего начать писать игру "Шарики"?
0
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
18.09.2012, 00:09  [ТС]
Спасибо, почитаю, попробую, вы очень помогли = )

Добавлено через 11 часов 19 минут
ValeryS, а вы не могли бы прокомментировать код(который на C#) просто мне там не всё понятно. Буду очень благодарен. Саму идею алгоритма я понял, хочу понять, как его правильно реализовать для моего случая.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.09.2012, 08:14
http://ru.wikipedia.org/wiki/%... 1%82%D0%B8
0
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
19.09.2012, 20:19  [ТС]
Подскажите пожалуйста, как реализовать класс тайла, т.е. для отрисовки я должен передавать ему из двумерного массива карты значения: индекс в массиве карты, проходимость тайла). Вся сложность у меня в том, что бы после этого отрисовать тайл в координатах экрана. Я хочу сделать так, кол-во тайлов на экране = кол-ву значений в массиве, а потом просто передавая индексы значений в класс тайла, формировать координаты для рисования квадрата(примерно так: индексы(2,2) это центр квадратного тайла,(2-1,2-1) левый нижний угол,(2+1,2+1) правый верхний угол... и т.д) . И всё бы ничего, но я не знаю что делать с первым элементом массива(который (0,0) и с последним) ведь тогда получится (0-1,0-1) за пределами экрана). Подскажите пожалуйста как быть?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.09.2012, 20:33
Демик, можете написать свой класс массива, который точно такой же, как и обычный, но индексация начинается с 1 и заканчивается где вы хотите.
0
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
19.09.2012, 20:50  [ТС]
Psilon, блин я понял вашу идею, но честно говоря плохо представляю как это нужно сделать. Я просто не знаю как устроен класс массива в c#. Или всё это делается как-то проще?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.09.2012, 22:36
Ну так например:
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
using System;
 
 
namespace Indexer
{
    class MyArray<T>
    {
        private readonly T[] _a;
 
 
        public MyArray(int a)
        {
            _a = new T[a];
        }
 
        public T this[int index]
        {
            get { return _a[index + 5]; }
            set { _a[index + 5] = value; }
        }
    }
    class Program
    {
        static void Main()
        {
            var arr = new MyArray<int>(10);
            for (int i = -5; i < 5; i++)
            {
                arr[i] = i;
                Console.WriteLine(arr[i]);
            }
            Console.WriteLine(arr[-5]);
            Console.ReadKey();
        }
    }
}
1
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
19.09.2012, 22:57  [ТС]
Спасибо, а для двумерного массива этот класс не подходит, да?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.09.2012, 23:00
Демик, ну почему же, пишете индексатор с двумя параметрами и то же самое.
0
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
19.09.2012, 23:15  [ТС]
Понял, спасибо.

Добавлено через 12 минут
Вот так?
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
class Indexer
    {
        class MyArray<T,K>
        {
            private readonly T[] _a;
            private readonly K[] _b;
 
 
            public MyArray(int a, int b)
            {
                _a = new T[a];
                _b = new K[b];
            }
 
            public T this[int indexI]
            {
                get { return _a[indexI + 5]; }
                set { _a[indexI + 5] = value; }
            }
            public K this[int indexJ]
            {
                get { return _b[indexJ + 5]; }
                set { _b[indexJ + 5] = value; }
            }
        }
    }
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.09.2012, 23:17
Если элементы однотипные
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Indexer
    {
        class MyArray<T>
        {
            private readonly T[,] _a;
 
 
            public MyArray(int a, int b)
            {
                _a = new T[a, b];
            }
 
            public T this[int i, int j]
            {
                get { return _a[i + 5,j + 5 ]; }
                set { _a[i + 5,j + 5] = value; }
            }
        }
    }
1
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
20.09.2012, 00:53  [ТС]
Подскажите, эта функция имеет право на жизнь?
C#
1
2
3
4
5
6
7
8
9
10
11
//Функция рисования тайла
        private void Tile(int numberX, int numberY, int value)
        {
            Point[] P = new Point[2];
            if (value == 1) { Gl.glColor3d(1.0, 0.0, 0.0); }
            else { if (value == 0) { Gl.glColor3d(0.0, 0.0, 0.0); } }
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glVertex2d(P[0].X = numberX - 1, P[0].Y = numberY + 1);
            Gl.glVertex2d(P[1].X = numberX + 1, P[1].Y = numberY - 1);
            Gl.glEnd();
        }
Использую я её вот так:
C#
1
2
3
4
5
6
//Рисуем карту
                for (int i = 1; i < MapHeight; i+=2)
                    for (int j = 1; j < MapWidht; j+=2)
                    {
                        Tile(i, j, Map[i, j]); //Вот тут ошибка.
                    }
А карта загружается так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public void ReadMap()
        {
            string[] s = System.IO.File.ReadAllLines("level.txt");
            var Map = new MyArray<int>(s.Length, s[0].Length);
            for (int i = 1; i < s.Length; i++)
            {
                for (int j = 1; j < s[0].Length ; j++)
                {
                    Map[i, j] = (int)char.GetNumericValue(s[i][j]);
                }
            }
            MapWidht = s[0].Length;
            MapHeight = s.Length;
        }
Но почему-то мне выдаёт ошибку о том, что "Ссылка на объект не указывает на экземпляр объекта."

Добавлено через 6 минут
Я понял в чём ошибка, появился другой вопрос, как мне объявить этот массив
C#
1
var Map = new MyArray<int>(s.Length, s[0].Length);
глобальной переменной?
Получилось обойти эту проблему, но получился какой-то было код.

Добавлено через 30 минут
Появилась другая ошибка, объявляю массив
C#
1
public MyArray<int> Map = new MyArray<int>(s.Length, s[0].Length);
и на это строке при компиляции выдаёт ошибку
"Ссылка на объект не указывает на экземпляр объекта" в чем может быть дело?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.09.2012, 09:00
Демик,
Хз, попробуйте написать
public MyArray<int> Map;
А остальное в form_load
C#
1
Map = new MyArray<int>(s.Length, s[0].Length);
Мб он не знает на этапе компиляции, что такое s.
Point[] P = new Point[2];
Для этого есть класс rectangle
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.09.2012, 09:10
Возможно проблема в том, что на этапе компиляции он не знает, что такое s.
0
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
20.09.2012, 12:15  [ТС]
Сделал вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public MyArray<int> ReadMap()
        {
            MyArray<int> Map = new MyArray<int>(s.Length, s[0].Length);
            s = System.IO.File.ReadAllLines("level.txt");
            for (int i = 1; i < s.Length; i++)
            {
                for (int j = 1; j < s[0].Length ; j++)
                {
                    Map[i, j] = (int)char.GetNumericValue(s[i][j]);
                }
            }
            MapWidht = s[0].Length;
            MapHeight = s.Length;
            return Map;
        }
А потом просто:
C#
1
 MyArray<int> Map = ReadMap();
Но, теперь почему-то отрисовывается всё черным, наверно проблема в индексах массива.
0
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
21.09.2012, 03:29  [ТС]
Доброе время суток, сделал загрузку массива из файла и отрисовываю по этому массиву карту. Массив состоит из нолей и единиц. По моей задумке если значение в массиве равно единице, то мы рисуем красный квадрат по координатам, взятым из индекса этого значения. Но почему-то у меня форма полностью зарисовывается черным цветом. Подскажите пожалуйста, что может быть не так?
Код и проект прилагаю.
Код
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
using Tao.FreeGlut;
using Tao.Platform.Windows;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public int[,] Map;
        //Кол-во тайлов
        double THeight;//По высоте
        double TWidth;//По ширине
        public Form1()
        {
            InitializeComponent();
            RoF.InitializeContexts();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            //Кол-во делений
            double DHeight = 32;//По высоте
            double DWidth = 32;//По ширине
            // инициализация Glut
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
 
            Gl.glClearColor(255, 255, 255, 1);
 
            Gl.glViewport(0, 0, RoF.Width, RoF.Height);
 
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
 
            if ((float)RoF.Width <= (float)RoF.Height)
            {
 
                Glu.gluOrtho2D(0.0, DWidth * (float)RoF.Height / (float)RoF.Width, DHeight, 0.0);
 
            }
            else
            {
 
                Glu.gluOrtho2D(0.0, DWidth * (float)RoF.Width / (float)RoF.Height, DHeight, 0.0);
 
            }
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            Gl.glLoadIdentity();
            RenderTimer.Start();
        }
 
        private void RenderTimer_Tick(object sender, EventArgs e)
        {
            ReadMap();
            Draw();
        }
 
        private void Draw()
        {
            for (int i = 1; i < THeight; i++)
            {
                for (int j = 1; i < TWidth; j++)
                {
                    Tile(i,j,Map[i,j]);
                } 
            }
            Gl.glFlush();
            RoF.Invalidate();
        }
 
        private void Tile(int numberX, int numberY, int value)
        {
            if (value == 1) { Gl.glColor3d(1.0, 0.0, 0.0); }
            else { Gl.glColor3d(0.0, 0.0, 0.0); }
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glVertex2d(numberY - 1, numberX - 1);
            Gl.glVertex2d(numberY - 1, numberX + 1);
            Gl.glEnd();
        }
 
        public void ReadMap()
        {
            string[] s;
            s = System.IO.File.ReadAllLines("level.txt");
            Map = new int[s.Length+1, s[0].Length+1];
            for (int t = 0, i = 1; i < s.Length; i++, t++)
            {
                for (int k = 0, j = 1; j < s[0].Length; j++, k++)
                {
                    Map[i, j] = (int)char.GetNumericValue(s[t][k]);
                }
            }
            TWidth = s[0].Length + 1;
            THeight = s.Length + 1;
        }
    }
}

Или может быть кто-нибудь посоветует, где можно почитать, про отрисовку уровня из массива или что-то подобное.В гугле искал, не смог найти.
Вложения
Тип файла: rar Test - копия.rar (67.0 Кб, 9 просмотров)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.09.2012, 07:10
Демик,без библиотек оно даже компилиться не хочет
А вообще, хороший код от плохого всегда легко можно отличить: когда вся логика программы висит на контролах формы, а не лежит в отдельном классе. Я уже не говорю про
C#
1
 public Gl.glColor3d[,] Map;
Что мешает сделать
C#
1
public Color[,] Map; //Ну или сами подберете, какой надо
А заполняется черным, очевидно, потому что у вас нету метода добавления в массив единиц => все нули => все закрашивает тем цветом, который поставлен на единицу.

Добавлено через 32 секунды
Демик,без библиотек оно даже компилиться не хочет
А вообще, хороший код от плохого всегда легко можно отличить: когда вся логика программы висит на контролах формы, а не лежит в отдельном классе. Я уже не говорю про
C#
1
 public Gl.glColor3d[,] Map;
Что мешает сделать
C#
1
public Color[,] Map; //Ну или сами подберете, какой надо
А заполняется черным, очевидно, потому что у вас нету метода добавления в массив единиц => все нули => все закрашивает тем цветом, который поставлен на единицу.

Добавлено через 1 минуту
В следующий раз давайте не только код, но и все используемые библиотеки.
0
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
21.09.2012, 12:09  [ТС]
Вот, исправил как вы сказали, и ещё, когда я прохожу всю программу построчно, то у меня всё вроде работает верно, а на визуализации этого не видно. Т.е. координаты и значения присваиваются верно, но как бы сами "тайлы" не отрисовываются.
Вот переделанный проект с используемыми библиотеками.
Вложения
Тип файла: rar Test - копия (2).rar (224.3 Кб, 6 просмотров)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.09.2012, 12:32
Демик, честно говоря, я не понимаю просто этой библиотеки. Массив цветов формируется правильно, если бы я рисовал на канве, то оно бы отрисовалось. Очевидно, что проблема может быть только в том месте, где у вас комментарий "рисуем карту".
Я вам код немного почистил, примерно так это я вам предлагал сделать:
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
using System;
using System.Drawing;
using System.Windows.Forms;
using Tao.OpenGl;
using Tao.FreeGlut;
 
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Color[,] Map;
        //Кол-во тайлов
        double THeight;//По высоте
        double TWidth;//По ширине
        //Кол-во делений
        double DHeight = 32;//По высоте
        double DWidth = 32;//По ширине
        public Form1()
        {
            InitializeComponent();
            RoF.InitializeContexts();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            // инициализация Glut
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
 
            Gl.glClearColor(255, 255, 255, 1);
 
            Gl.glViewport(0, 0, RoF.Width, RoF.Height);
 
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
 
            if (RoF.Width <= (float)RoF.Height)
            {
                Glu.gluOrtho2D(0.0, DWidth * RoF.Height / RoF.Width, DHeight, 0.0);
            }
            else
            {
                Glu.gluOrtho2D(0.0, DWidth * RoF.Width / RoF.Height, DHeight, 0.0);
            }
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            Gl.glLoadIdentity();
        }
 
        private void RenderTimer_Tick(object sender, EventArgs e)
        {
            Draw();
        }
 
        private void Draw()
        {
            //Рисуем сетку
            for (double dX = 0.0; dX <= 32.0; dX = dX + 2.0)
            {
                Gl.glBegin(Gl.GL_LINES);
                Gl.glColor3d(0.25, 0.25, 0.25);
                Gl.glVertex2d(dX, 0.0);
                Gl.glVertex2d(dX, 32.0);
                Gl.glEnd();
            }
            for (double dY = 0.0; dY <= 32.0; dY = dY + 2.0)
            {
                Gl.glBegin(Gl.GL_LINES);
                Gl.glColor3d(0.25, 0.25, 0.25);
                Gl.glVertex2d(0.0, dY);
                Gl.glVertex2d(32.0, dY);
                Gl.glEnd();
            }
            //Рисуем карту
            for (int j = 1, k = 0; j < DHeight / 2; j += 2, k++)
                for (int i = 1, t = 0; i < DWidth / 2; i += 2, t++)
                {
                    Gl.glColor3d(Map[i, j].R, Map[i, j].G, Map[i, j].B); 
                    Gl.glBegin(Gl.GL_QUADS);
                    Gl.glVertex2d(i - 1, j - 1);
                    Gl.glVertex2d(i + 1, j + 1);
                    Gl.glEnd();
                }
            Gl.glFlush();
            RoF.Invalidate();
        }
 
        private void buttonLoad_Click(object sender, EventArgs e)
        {
            string[] s = System.IO.File.ReadAllLines("level.txt");
            Map = new Color[s.Length, s[0].Length];
            for ( int i = 0; i < s.Length; i++)
                for (int j = 0; j < s[0].Length; j++)
                    Map[i, j] = s[i][j] == '1' ? Color.Red : Color.Black;
            TWidth = s[0].Length;
            THeight = s.Length;
        }
 
        private void buttonRender_Click(object sender, EventArgs e)
        {
            RenderTimer.Start();
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.09.2012, 12:32
Помогаю со студенческими работами здесь

Передвижение объекта по pictureBox клавиатурой
Приветствую! Столкнулся с проблемой,не могу двигать нарисованный мною квадрат по pictureBox.Подскажите как реализовать передвижение...

Как остановить передвижение объекта при столкновении с другим объектом
Как остановить передвижение объекта при столкновении с другим объектом при движении вправо, влево Код передвижения вправо (первый...

Определение объекта по координатам...
Здравствуйте! Можно ли определить какому объекту принадлежит заданная точка? Есть подобие векторного графического редактора и нужно по...

Подбор времени для таймера для передвижение объекта за точное время
Здравствуйте. Как подобрать время таймера и скорость передвижение например pictorebox за точное время Например дано 3 секунды за которое...

Плавное передвижение в точку клика
Есть объект который должен переместиться в точку куда попал луч. Но объект перемещается только во время GetMouseButtonDown, как сделать так...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru