Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/76: Рейтинг темы: голосов - 76, средняя оценка - 4.72
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323

Что изучать для совершенствования знаний по C++

08.11.2018, 09:25. Показов 18947. Ответов 361

Студворк — интернет-сервис помощи студентам
Изучил уже до ООП, вопрос что делать дальше? Могу ли я уже писать программы, с чего начинать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2018, 09:25
Ответы с готовыми решениями:

Что изучать после получения базовых знаний по c#
В каком направлении дальше двигаться? Или попытаться устроиться стажером для начала? А там дальше скажут в каком направлении двигаться...

Какой язык и технологию изучать после получения средних знаний
Здравствуйте! Я сейчас в 9 классе, буду поступать в техникум...Хорошие знания C#.NET, LINQ, ADO.NET, скоро буду начинать учить ASP.NET, и...

Ссылки для изучения и совершенствования
Ha всякий случай, несколько ссылок, больше на Rutracker. He знаю других трекеров c поиском в этих категориях. Темы c наибольшим спросом...

361
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
17.11.2018, 23:21
Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
    glBegin(GL_QUADS);
    glVertex2f(5.0f, 5.0f);
    glVertex2f(5.0f + 1.0f, 5.0f);
    glVertex2f(5.0f + 1.0f, 5.0f + 1.0f);
    glVertex2f(5.0f, 5.0f + 1.0f);
    glEnd();
Переменные width и height в данном случае равны друг другу и равны "1.0f", а так же в данном коде x и y равны друг другу и вместе равны "5.0f"

Так можно переписать код выше с учётом написанного:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void drawRectangle(int x, int y, int width, int height)
{
    glBegin(GL_QUADS);
    glVertex2f(x, y);
    glVertex2f(x + width, y);
    glVertex2f(x + width, y + height);
    glVertex2f(x, y + height);
    glEnd();
}
 
void draw()
{
    // ...
    // ...
    drawRectangle(5, 5, 7, 4);
    // ...
    // ...
}
Название: Rectangle.png
Просмотров: 50

Размер: 3.3 Кб

Ваше задание, по аналогии нарисовать квадрат, используя следующую заготовку. Нужно дописать две вершины квадрата в функции drawSquare.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void drawSquare(int x, int y)
{
    int size = 1;
 
    glBegin(GL_QUADS);
    glVertex2f(x, y);
    glVertex2f(x + size, y);
    // ...
    // ...
    glEnd();
}
 
void draw()
{
    // ...
    // ...
    drawSquare(5, 5);
    // ...
    // ...
}
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
18.11.2018, 10:03  [ТС]
8Observer8,
Ваше задание, по аналогии нарисовать квадрат
C++ (Qt)
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
#include <GL/freeglut.h>
 
#include <iostream>
#include <string>
using namespace std;
 
int lives = 3;
int score = 0;
 
void setNewCoordSystem(int width, int height, int internalWidth, int internalHeight)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0f, internalWidth, 0.0f, internalHeight, 0.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
    case 'w':
        cout << "Up" << endl;
        break;
    case 'a':
        cout << "Left" << endl;
        break;
    case 's':
        cout << "Down" << endl;
        break;
    case 'd':
        cout << "Right" << endl;
        break;
    default:
        cout << "This key is not used: " << key << endl;
        break;
    }
}
 
void update(int value)
{
    //cout << value << endl;
    glutTimerFunc(500, update, value);
}
 
void drawText(int x, int y, string text)
{
    glRasterPos2f(x, y);
    glutBitmapString(GLUT_BITMAP_8_BY_13, (const unsigned char*)text.c_str());
}
 
void drawSquare(int x, int y, int height, int wight)
{
    glBegin(GL_QUADS);
    glVertex2f(x, y);
    glVertex2f(x + wight, y);
    glVertex2f(x + wight, y + height);
    glVertex2f(x, y + height);
    glEnd();
}
 
void draw()
{
    drawText(0, 19, "Score: " + to_string(score));
    drawText(15, 19, "Lives: " + to_string(lives));
 
    glColor3f(0, 1, 0);
 
    drawSquare(5, 5, 1, 1);
 
    glutSwapBuffers();
}
 
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(256, 256); // 256x256 пикселей
    glutCreateWindow("Snake");
    glutDisplayFunc(draw);
    glutTimerFunc(500, update, 255);
    glutKeyboardFunc(keyboard);
    setNewCoordSystem(256, 256, 20, 20);
    glutMainLoop();
    return 0;
}


Возможно ли в функции, чтобы не указывать все типы аргументов, указать тип один раз, и чтобы все последующее переменные были того типа который указали?
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
18.11.2018, 10:11
Цитата Сообщение от CyberGame Посмотреть сообщение
Возможно ли в функции, чтобы не указывать все типы аргументов, указать тип один раз, и чтобы все последующее переменные были того типа который указали?
Это как? Можете написать?

Добавлено через 2 минуты
Пусть текст будет не зелёный, а, например, белый:
C++
1
2
3
4
5
6
void drawText(int x, int y, string text)
{
    glColor3f(1, 1, 1);
    glRasterPos2f(x, y);
    glutBitmapString(GLUT_BITMAP_8_BY_13, (const unsigned char*)text.c_str());
}
Добавлено через 2 минуты
C++
1
void drawSquare(int x, int y, int height, int wight)
Эта запись не имеет логики. Либо нужно назвать функцию drawRectangle, либо убрать height и width. Потому что Square переводится как квадрат, а у квадрата мы можем указать только его размер. Можно было написать так:
C++
1
void drawSquare(int x, int y, int size)
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
18.11.2018, 10:14  [ТС]
8Observer8,
Это как? Можете написать?
Ну типо
C++ (Qt)
1
void function(int, a, b, c)
Как это реализовать правильнее, чтобы не указывать у всех переменных тип данных, а чтобы по автомату, после int, все переменные с этим типом.
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
18.11.2018, 10:16
CyberGame, советую сохранить эту ссылку в закладки браузера: http://doc.instantreality.org/... alculator/

Этот инструмент позволяет подобрать цвет и скопировать его в нужном формате:

1
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
18.11.2018, 10:17  [ТС]
8Observer8,
Эта запись не имеет логики. Либо нужно назвать функцию drawRectangle, либо убрать height и width. Потому что Square переводится как квадрат, а у квадрата мы можем указать только его размер. Можно было написать так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void drawSquare(int x, int y, int size)
{
    glBegin(GL_QUADS);
    glVertex2f(x, y);
    glVertex2f(x + size, y);
    glVertex2f(x + size, y + size);
    glVertex2f(x, y + size);
    glEnd();
}
 
void draw()
{
    drawText(0, 19, "Score: " + to_string(score));
    drawText(15, 19, "Lives: " + to_string(lives));
 
    glColor3f(1, 1, 1);
 
    drawSquare(5, 5, 1);
 
    glutSwapBuffers();
}
Исправил, понял в чём проблема)
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
18.11.2018, 10:18
Цитата Сообщение от CyberGame Посмотреть сообщение
Как это реализовать правильнее, чтобы не указывать у всех переменных тип данных, а чтобы по автомату, после int, все переменные с этим типом.
В функции нельзя. Единственный вариант:
C++
1
int a, b, c;
Или с инициализацией:
C++
1
int a = 1, b = 2, c = 3;
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
18.11.2018, 10:20  [ТС]
8Observer8, хорошо.
Жду следующих указаний.
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
18.11.2018, 10:42
Нужно cделать, чтобы голова змейки двигалась вправо по таймеру. Если вправо, то в update() нужно инкриментировать переменную.

Можно создать две глобальные переменные:
C++
1
int x = 0, y = 0;
В update() инкриментировать и вызывать перерисовку области рисования (glutPostRedisplay):
C++
1
2
3
4
5
6
void update(int value)
{
    x++;
    glutTimerFunc(500, update, 0);
    glutPostRedisplay();
}
В draw нужно очищать весь экран с помощью команды glClear:
C++
1
2
3
void draw()
{
    glClear(GL_COLOR_BUFFER_BIT);
Добавлено через 10 минут
Получается, что закончены все технические детали от OpenGL и FreeGLUT. Теперь будет только чистый C++. Можно будет потом создать класс Snake, Food и т.д.

Обращу внимание, что те функции, которые начинаются с приставки "gl" относятся к OpenGL, а функции, которые начинаются с приставки "glut" относятся к библиотеки FreeGLUT. Библиотека FreeGLUT была использована для: создания окна, таймера, обработки ввода с клавиатуры.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
18.11.2018, 10:42  [ТС]
8Observer8, смысл этих переменных?
всё, понял. для движения по оси Xo
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
18.11.2018, 10:47
Смысл в том, что переменная "x" будет увеличиваться по таймеру на единицу. И я забыл написать, что в отрисовке тоже нужно написать "x":
C++
1
    drawSquare(x, 5, 1);
Добавлено через 1 минуту
Теперь нужно подумать, как менять направление змейки по нажатию клавиш. Есть идеи?

Добавлено через 1 минуту
У меня есть. Я, правда, подглядел в исходниках этого тутора по OpenGL и FreeGLUT: Python Snake Game
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
18.11.2018, 10:49  [ТС]
8Observer8, я еще не сделал чтобы по таймеру квадрат передвигался.
А по счет идей, при нажатии кнопки "w", идёт перерисовка и квадрат передвигается по осиY вверх на 1.
Я уже пытался, не получалось, ибо наверное нужно с указателями делать?

Всё сделал с квадратом, очень интересно выглядит.
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
18.11.2018, 10:53
Цитата Сообщение от CyberGame Посмотреть сообщение
ибо наверное нужно с указателями делать?
Тут нужно применить математику. Я не знаю есть ли сейчас геометрия в школе. У нас в геометрии были элементы линейной алгебры, а точнее работа с векторами. Нужно голову змейки сделать в виде вектора, то есть массива из двух чисел и направление сделать в виде вектора, тоже массива из двух чисел. При движении складывать эти два вектора. При нажатии на клавишу нужно менять направление вектора. Непонятно?
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
18.11.2018, 10:55  [ТС]
8Observer8, я сделал передвижение, ехууу! Сейчас всё скину.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
18.11.2018, 10:55
CyberGame, По-моему, даже я, не участвуя в этом, сходу могу сказать:
Цитата Сообщение от CyberGame Посмотреть сообщение
смысл этих переменных?
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Нужно cделать, чтобы голова змейки двигалась вправо по таймеру. Если вправо, то в update() нужно инкриментировать переменную.
Можно создать две глобальные переменные:
Вам нужно научиться выделять важные и нужные мысли в описании. Все олимпиадные задачки, к примеру, имеют в своем описании, как говорится, "словесный понос" (да простят меня за это высказывание), и необходимо четко найти основную мысль, чтобы понять, что от тебя хотят (часто можно вообще по входным/выходным параметрам определить задачу).

К тому же, не мешало бы осмысленно прочитать, прежде чем клепать комментарии. Исходя из ответа, ты даже его не прочитал толком, минута-в-минуту проследовал твой комментарий. Вроде выше звучала фраза - сначала прочитай, обдумай, поищи что не ясно, и если совсем туго - тогда спрашивай. Но почему-то ты игнорируешь этот совет, а зря. Программирование по своей сути - полное самообразование, тут могут лишь помочь натолкнуть, разобрать какие-то недопонимания, направить в нужное русло на ресурс, который сочли для себя более доходчивым. В остальном нужно пробовать, экспериментировать, узнавать и искать что-то новое.

А пока я вижу лишь то, что ты имеешь малое желание (но благо хоть такое есть) разбираться в том, что тебе пытаются помочь донести. Задача на то и задача - нужно найти ее решение и завершить, успешно скомпилировав и получив результат. Да, этот результат может быть неверный, отличаться от требуемого - но это уже успех. Дальше нужно поработать и найти, что не так. Поработать отладчиком, найти момент, в который неожиданно что-то начинает работать не так, не в то место перемещается курсор, не то значение имеет переменная, что ожидалось, ну и тд тп) Работай, трудись, не бойся неудач, пытайся решить, понять, сделать. Выдели пол часа, выдели час, прочитай один и тот же материал несколько раз, разберись и пойми, как работает.

Короче, я хз, к чему всё накатал, просто выделилось пару минут свободных во время рабочего дня
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
18.11.2018, 11:02  [ТС]
А посчет вектора, мы еще не проходили. Помню друг говорил, это что то типо направления. Смотри что у меня получилось.

Добавлено через 32 секунды
C++ (Qt)
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
#include <GL/freeglut.h>
 
#include <iostream>
#include <string>
using namespace std;
 
int lives = 3;
int score = 0;
int oX = 0, oY = 0;
 
 
void setNewCoordSystem(int width, int height, int internalWidth, int internalHeight)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0f, internalWidth, 0.0f, internalHeight, 0.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
    case 'w':
        cout << "Up" << endl;
        oY++;
        glutPostRedisplay();
        break;
    case 'a':
        cout << "Left" << endl;
        oX--;
        glutPostRedisplay();
        break;
    case 's':
        cout << "Down" << endl;
        oY--;
        glutPostRedisplay();
        break;
    case 'd':
        cout << "Right" << endl;
        oX++;
        glutPostRedisplay();
        break;
    default:
        cout << "This key is not used: " << key << endl;
        break;
    }
}
 
void update(int value)
{
    //x++;
    //glutPostRedisplay();
    //glutTimerFunc(500, update, 0);
}
 
void drawText(int x, int y, string text)
{
    glRasterPos2f(x, y);
    glutBitmapString(GLUT_BITMAP_8_BY_13, (const unsigned char*)text.c_str());
}
 
void drawSquare(int x, int y, int size)
{
    glBegin(GL_QUADS);
    glVertex2f(x, y);
    glVertex2f(x + size, y);
    glVertex2f(x + size, y + size);
    glVertex2f(x, y + size);
    glEnd();
}
 
void draw()
{
    drawText(0, 19, "Score: " + to_string(score));
    drawText(15, 19, "Lives: " + to_string(lives));
 
    glColor3f(0.878, 0, 0.050);
    drawSquare(oX, oY, 1);
 
 
    glutSwapBuffers();
    glClear(GL_COLOR_BUFFER_BIT);
}
 
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(256, 256); // 256x256 пикселей
    glutCreateWindow("Snake");
    glutDisplayFunc(draw);
    glutTimerFunc(500, update, 255);
    glutKeyboardFunc(keyboard);
    setNewCoordSystem(256, 256, 20, 20);
    glutMainLoop();
    return 0;
}
Инцилизируй этот код у себя.

Добавлено через 6 минут
SuperKir,
Цитата Сообщение от SuperKir Посмотреть сообщение
По-моему, даже я, не участвуя в этом, сходу могу сказать:
Почитал бы ниже, я же написал что разобрался.
Цитата Сообщение от SuperKir Посмотреть сообщение
Исходя из ответа, ты даже его не прочитал толком, минута-в-минуту проследовал твой комментарий.
Скажи на каком примере. Просто если это мне не понятная цель, т.е. что мне нужно сделать, я уточняю. А по счет названий функций и их аргументов я гуглю в доках.
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
18.11.2018, 11:06
Цитата Сообщение от CyberGame Посмотреть сообщение
А посчет вектора, мы еще не проходили. Помню друг говорил, это что то типо направления.
Вектор имеет направление, длину, начало и конец. Направление изображают стрелкой. Вектор можно перемещать параллельным переносом. При параллельном переносе вектор не меняет направление. Вектор всегда можно перенести так, чтобы его начало оказалось в начале координат, то есть в точке (0, 0). Объяснить, что такое сложение векторов? Просто через сложение векторов проще всего будет перемещать змейку. В принципе, ты можешь дополнительно погуглить, что такое сложение векторов, а я пока нарисую, как это можно применить для передвижение змейки.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
18.11.2018, 11:15
Цитата Сообщение от CyberGame Посмотреть сообщение
Почитал бы ниже, я же написал что разобрался.
Форум не обновляется в режиме реального времени - комментарии появляются после обновления страницы, что произошло после того, как я отправил свой.

Цитата Сообщение от CyberGame Посмотреть сообщение
Скажи на каком примере.
На том, где ты отписал Смысл переменных (комментарий "А всё понял" не было в тот момент )

Вот вам для затравки, может что подчерпнете, делал когда-то... Там в одном кажется кубик крутится а на пкм текстурки меняются, а во втором тупо текстурки.

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
#include "glew.h"
#include "glut.h"
#include "il.h"
#include <string>
#include <iostream>
 
using namespace std;
 
enum Image
{
    FIRE,
    SKY,
    METALL,
    CUBS,
    ICE
};
 
enum Color
{
    White,
    Yellow,
    Magenta,
    Cyan
};
 
float angle = 0.0f;
Image image = FIRE;
Color color = White;
 
struct Characteristc
{
    ILubyte* texture;
    ILuint width;
    ILuint height;
    ILuint type;
    ILuint format;
};
 
ILuint* images;
Characteristc** characteristics;
unsigned int* textures;
 
 
 
 
Characteristc* GetCharacteristics(wchar_t* str, Characteristc*c)
{
    ilLoadImage(str);
    c->texture = ilGetData();
    c->width = ilGetInteger(IL_IMAGE_WIDTH);
    c->height = ilGetInteger(IL_IMAGE_HEIGHT);
    c->type = ilGetInteger(IL_IMAGE_TYPE);
    c->format = ilGetInteger(IL_IMAGE_FORMAT);
    return c;
}
 
void setTexture()
{
    switch (image)
    {
    case FIRE:
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, characteristics[0]->width, characteristics[0]->height, 0, characteristics[0]->format, characteristics[0]->type, characteristics[0]->texture);
        break;
    case SKY:
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, characteristics[1]->width, characteristics[1]->height, 0, characteristics[1]->format, characteristics[1]->type, characteristics[1]->texture);
        break;
    case METALL:
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, characteristics[2]->width, characteristics[2]->height, 0, characteristics[2]->format, characteristics[2]->type, characteristics[2]->texture);
        break;  
    case CUBS:
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, characteristics[3]->width, characteristics[3]->height, 0, characteristics[3]->format, characteristics[3]->type, characteristics[3]->texture);
        break;
    case ICE:
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, characteristics[4]->width, characteristics[4]->height, 0, characteristics[4]->format, characteristics[4]->type, characteristics[4]->texture);
        break;
    }
}
 
void drawCube()
{
    float sizeX = 1.0f;
    float sizeY = 1.0f;
    float sizeZ = 1.0f;
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    /*float mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diffuse);*/
    glBegin(GL_TRIANGLE_FAN);
    /*glColor3ub(255, 0, 0);
    glNormal3f(0, 0, 1);*/
    glTexCoord2f(0, 0);
    glVertex3f(-sizeX, -sizeY, sizeZ);
    glTexCoord2f(1, 0);
    glVertex3f(sizeX, -sizeY, sizeZ);
    glTexCoord2f(1, 1);
    glVertex3f(sizeX, sizeY, sizeZ);
    glTexCoord2f(0, 1);
    glVertex3f(-sizeX, sizeY, sizeZ);
    glEnd();
    /*float mat_diffuse1[] = { 1.0, 0.0, 1.0, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diffuse);*/
    glBegin(GL_TRIANGLE_FAN);
    /*glColor3ub(255, 0, 255);
    glNormal3f(0, -1, 0);*/
    glTexCoord2f(1, 0);
    glVertex3f(-sizeX, -sizeY, -sizeZ);
    glTexCoord2f(1, 1);
    glVertex3f(sizeX, -sizeY, -sizeZ);
    glTexCoord2f(0, 1);
    glVertex3f(sizeX, -sizeY, sizeZ);
    glTexCoord2f(0, 0);
    glVertex3f(-sizeX, -sizeY, sizeZ);
    glEnd();
    /*float mat_diffuse2[] = { 0.0, 1.0, 0.0, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diffuse);*/
    glBegin(GL_TRIANGLE_FAN);
    //glColor3ub(0, 255, 0);
    //glNormal3f(0, 0, -1);
    glTexCoord2f(1, 0);
    glVertex3f(-sizeX, -sizeY, -sizeZ);
    glTexCoord2f(1, 1);
    glVertex3f(sizeX, -sizeY, -sizeZ);
    glTexCoord2f(0, 1);
    glVertex3f(sizeX, sizeY, -sizeZ);
    glTexCoord2f(0, 0);
    glVertex3f(-sizeX, sizeY, -sizeZ);
    glEnd();
    /*float mat_diffuse3[] = { 0.0, 1.0, 1.0, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diffuse);*/
    glBegin(GL_TRIANGLE_FAN);
    //glColor3ub(255, 255, 0);
    //glNormal3f(-1, 0, 0);
    glTexCoord2f(1, 0);
    glVertex3f(-sizeX, -sizeY, sizeZ);
    glTexCoord2f(1, 1);
    glVertex3f(-sizeX, -sizeY, -sizeZ);
    glTexCoord2f(0, 1);
    glVertex3f(-sizeX, sizeY, -sizeZ);
    glTexCoord2f(0, 0);
    glVertex3f(-sizeX, sizeY, sizeZ);
    glEnd();
    /*float mat_diffuse4[] = { 1.0, 0.0, 0.0, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diffuse);*/
    glBegin(GL_TRIANGLE_FAN);
    //glColor3ub(0, 0, 255);
    //glNormal3f(1, 0, 0);
    glTexCoord2f(1, 0);
    glVertex3f(sizeX, -sizeY, sizeZ);
    glTexCoord2f(1, 1);
    glVertex3f(sizeX, -sizeY, -sizeZ);
    glTexCoord2f(0, 1);
    glVertex3f(sizeX, sizeY, -sizeZ);
    glTexCoord2f(0, 0);
    glVertex3f(sizeX, sizeY, sizeZ);
    glEnd();
    /*float mat_diffuse5[] = { 1.0, 1.0, 0.0, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diffuse);*/
    glBegin(GL_TRIANGLE_FAN);
    //glColor3ub(0, 255, 255);
    //glNormal3f(0, 1, 0);
    glTexCoord2f(0, 1);
    glVertex3f(sizeX, sizeY, sizeZ);
    glTexCoord2f(1, 1);
    glVertex3f(sizeX, sizeY, -sizeZ);
    glTexCoord2f(1, 0);
    glVertex3f(-sizeX, sizeY, -sizeZ);
    glTexCoord2f(0, 0);
    glVertex3f(-sizeX, sizeY, sizeZ);
    glEnd();
}
 
 
void display()
{
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, textures[0]);
    glEnable(GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    setTexture();
    glClearColor(0, 0, 0, 0);
    glClearDepth(1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    int width = glutGet(GLUT_WINDOW_WIDTH);
    int height = glutGet(GLUT_WINDOW_HEIGHT);
    float min = (float)height < width ? height : width;
    glFrustum(-width / min, width / min, -height / min, height / min, 6.0, 10000.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
 
 
 
    glTranslatef(0, 0, -11);
    glRotatef(angle, 1, 0, 1);
    //glBegin(GL_TRIANGLE_FAN);
    ////glColor3d(1, 0, 0);
    //glTexCoord2f(1,0);
    //glVertex2f(1, -1);
    //glTexCoord2f(1, 1);
    //glVertex2f(1, 1);
    //glTexCoord2f(0, 1);
    //glVertex2f(-1, 1);
    //glTexCoord2f(0, 0);
    //glVertex2f(-1, -1);
    //glEnd();
    drawCube();
    glutSwapBuffers();
}
 
void processMenuEvents(int option)
{
    image = (Image)option;
    glutPostRedisplay();
}
 
void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glutPostRedisplay();
}
 
void idle()
{
    angle += 0.5f;
    glutPostRedisplay();
}
 
 
 
void txt()
{
    images = new ILuint[5];
    characteristics = new Characteristc*[5];
    textures = new unsigned int[5];
    ilGenImages(5, images);
 
    ilBindImage(images[0]);
    characteristics[0] = new Characteristc;
    characteristics[0] = GetCharacteristics(L"fire.jpg", characteristics[0]);
    ilBindImage(images[1]);
    characteristics[1] = new Characteristc;
    characteristics[1] = GetCharacteristics(L"sky.jpg", characteristics[1]);
    ilBindImage(images[2]);
    characteristics[2] = new Characteristc;
    characteristics[2] = GetCharacteristics(L"metall.jpg", characteristics[2]);
    ilBindImage(images[3]);
    characteristics[3] = new Characteristc;
    characteristics[3] = GetCharacteristics(L"kyb.jpg", characteristics[3]);
    ilBindImage(images[4]);
    characteristics[4] = new Characteristc;
    characteristics[4] = GetCharacteristics(L"ice.jpg", characteristics[4]);
 
    glGenTextures(5, textures);
 
 
    //display();
    /*glGenerateMipmap(GL_TEXTURE_2D);
    glDisable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);
    glDeleteTextures(1, textures);*/
 
}
 
void main(int count, char* args[])
{
 
    glutInit(&count, args);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(400, 400);
    int mainWindow = glutCreateWindow("Texture");
    ilInit();
    txt();
    glutSetWindow(mainWindow);
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutCreateMenu(processMenuEvents);
    glutAddMenuEntry("fire", FIRE);
    glutAddMenuEntry("sky", SKY);
    glutAddMenuEntry("metall", METALL);
    glutAddMenuEntry("cubs", CUBS);
    glutAddMenuEntry("ice", ICE);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    glutIdleFunc(idle);
    glewInit();
    glutMainLoop();
}
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
#include "glew.h"
#include "glut.h"
#include "il.h" //Подключение библиотеки
 
float coordinateX = 0;
float coordinateY = 0;
 
struct Characteristc
{
    ILubyte* texture;
    ILuint width;
    ILuint height;
    ILuint type;
    ILuint format;
};
 
ILuint images;
Characteristc characteristics;
unsigned int* textures;
 
void display()
{
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, textures[0]);
    glEnable(GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, characteristics.width, characteristics.height, 0, characteristics.format, characteristics.type, characteristics.texture);
    glBegin(GL_TRIANGLE_FAN);
    glTexCoord2f(coordinateX, coordinateY);
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glTexCoord2f(coordinateX + 0.5, coordinateY);
    glVertex3f(1.0f, 1.0f, 0.0f);
    glTexCoord2f(coordinateX + 0.5, coordinateY + 0.5);
    glVertex3f(1.0f, -1.0f, 0.0f);
    glTexCoord2f(coordinateX, coordinateY + 0.5);
    glVertex3f(-1.0f, -1.0f, 0.0f);
    glEnd();
    glutSwapBuffers();
}
 
void TextureInitialization()
{
    textures = new unsigned int;
    ilGenImages(1, &images);
 
    ilBindImage(images);
    ilLoadImage(L"texture.jpg");
    characteristics.texture = ilGetData();
    characteristics.width = ilGetInteger(IL_IMAGE_WIDTH);
    characteristics.height = ilGetInteger(IL_IMAGE_HEIGHT);
    characteristics.type = ilGetInteger(IL_IMAGE_TYPE);
    characteristics.format = ilGetInteger(IL_IMAGE_FORMAT);
    glGenTextures(1, textures);
}
 
void MenuTexture(int value)
{
    switch (value)
    {
    case 1:
        coordinateX = 0;
        coordinateY = 0;
        glutPostRedisplay();
        break;
    case 2:
        coordinateX = 0.5;
        coordinateY = 0;
        glutPostRedisplay();
        break;
    case 3:
        coordinateX = 0;
        coordinateY = 0.5;
        glutPostRedisplay();
        break;
    case 4:
        coordinateX = 0.5;
        coordinateY = 0.5;
        glutPostRedisplay();
        break;
    }
}
 
void main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(700, 700);
    ilInit(); //Инициализация библиотеки
    TextureInitialization();
    glutCreateWindow("Test Window");
    glutDisplayFunc(display);
    glutCreateMenu(MenuTexture);
    glutAddMenuEntry("Лео", 1);
    glutAddMenuEntry("Кирпич", 2);
    glutAddMenuEntry("Грунт", 3);
    glutAddMenuEntry("Бумага", 4);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    glewInit();
    glutMainLoop();
}
П.с. текстурки с инета можно надыбать) Если что, прилагаю свои: skins.rar
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
18.11.2018, 11:26
Название: Direction.png
Просмотров: 38

Размер: 3.1 Кб

При сложении двух векторов: положение квадрата (белый вектор) и направления (оранжевый вектор, (0, 1), W) получается новый вектор - новое положение змейки (зелёный вектор)
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
18.11.2018, 11:33  [ТС]
8Observer8, то есть формула такова
Так, вроде понял. Что нужно сделать? Мой вариант передвижения не подходит?

Я по моему понял, ты хочешь при нажатии клавиш ads, менялось направление, а при w, он ходил вперед, смотря в каком направлении стоит. Так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.11.2018, 11:33
Помогаю со студенческими работами здесь

Какой язык изучать или что изучать?
Здравствуйте форумчане. какой язык программирования изучать чтоб работать дома через интернет? может 1с? я сам живу в деревне работы нет,о...

Подскажите, как лучше всего изучать язык, ежели в академии не дают достаточный объем знаний
хожу на курсы в академию уже 3 месяца, изучаем С++ по либерти, практики нету вообще, просто примеры по книге набираем...в общем туго идет,...

Какие паттерны можно использовать для совершенствования приложения
Доброго времени суток! У меня есть приложение реализованное на Qt C++ - тестирование студентов. Суть приложения заключается в...

Что изучать для работы
Всем здравствуйте. Ребята, такой вопрос. Какие технологии сейчас лучше изучать, чтобы было проще и быстрее, и при этом чтобы можно было...

Что изучать для создания сайтов
Привет всем, всех с новым годом! кто занимается web - разработкой, создание сайтов , хотелось у вас узнать ко э что. В каком порядки...


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

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru