Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/55: Рейтинг темы: голосов - 55, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 13

Создание 2D-игры для C++ "Волк-яйцелов"

31.05.2015, 19:00. Показов 11946. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько сложно на самом деле создать игру на C++. Скоро курсовая.... Тема курсовой "Волк-яйцелов". Возможно ли в короткие сроки на слабом уровне сделать эту игру? Дайте советы и помогите, чем можете.. Огромное спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2015, 19:00
Ответы с готовыми решениями:

Игра Волк ловит яйца (Яйцелов, Ну погоди)
Нужно создать игру на пободии Волк ловит яйца. Яйцелов. Ну погоди. Может у кого-нибудь есть какие-нибудь исходники?

Графическая часть игры "Волк и Овцы"
Игра состоит из доски и 4 шашек одного(овцы) типа и 1 шашки второго типа(волк). Для шахматной доски нужно создать двух вымеренный массив...

Яйцелов на MIDletPascal
Тупит волк,плохо реагирует на команды. Как использовать парралельные потоки или сделать яйцам тамер? program NuPogodi; var...

13
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
31.05.2015, 19:09
http://www.sfml-dev.org/
Это для графики.

Игру сделать не сложно, а вот время затраченное на нее зависит от знания с++ и графических библиотек.

Цитата Сообщение от Zak_Zelman Посмотреть сообщение
Тема курсовой "Волк-яйцелов".
Эту сделать легко и быстро.
0
0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 13
31.05.2015, 19:16  [ТС]
Познания почти никакие.... А если быть честным с собой, то они отсутствуют. Но вот хочется, все равно что-то начать делать. Если вам не трудно, напишите с чего начать и вообще, т.н. порядок действий. Я в этом полный 0, а работу предоставить необходимо уже в скором времени.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
31.05.2015, 19:23
Как написать книгу на английском без знания английского? Вам в рифму ответить?)
0
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
31.05.2015, 19:25
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Как написать книгу на английском без знания английского?
Верно!

Цитата Сообщение от Zak_Zelman Посмотреть сообщение
а работу предоставить необходимо уже в скором времени.
Ну в Вашем случае похоже копипаст.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
31.05.2015, 19:53
Цитата Сообщение от Zak_Zelman Посмотреть сообщение
Познания почти никакие.... А если быть честным с собой, то они отсутствуют. Но вот хочется, все равно что-то начать делать. Если вам не трудно, напишите с чего начать и вообще, т.н. порядок действий. Я в этом полный 0, а работу предоставить необходимо уже в скором времени.
Купить С.Прата "Язык программирования С++" , читать и делать примеры - желательно всё свободное время(если уж вы хотите сами её сделать). Скажем где-то на наследовании можно остановиться и начать делать курсовую.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
31.05.2015, 19:58
Цитата Сообщение от Zak_Zelman Посмотреть сообщение
Насколько сложно на самом деле создать игру на C++
При наличии библиотеки способной подгружать BMP и блитить их одна в другую с прозрачностью фона - мелочи. Если под винду то такая либа есть в любой среде разработки, так же как и под большинство остальных ОС. Основная сложность в самих спрайтах (покадровых картинках движений волка и всего остального).
0
3 / 3 / 1
Регистрация: 24.05.2015
Сообщений: 67
31.05.2015, 22:47
Если время ОЧЕНЬ поджимает, единственный выход скачать готовые исходники и ХОТЯ БЫ разобраться в них.
0
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 40
01.06.2015, 08:39
https://www.youtube.com/channe... FP0NlRHqBA За неделю научишься xD

Добавлено через 1 минуту
А сколько у тебя времени осталось?
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,750
01.06.2015, 10:59
http://gameshaker.ucoz.ru/publ... 49-1-0-206 И кучу ссылок по SFML
0
 Аватар для idm
120 / 34 / 19
Регистрация: 19.03.2015
Сообщений: 90
01.06.2015, 18:24
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Zak_Zelman,
В общем, в графических редакторах работать не умею, максимум кота в paint'е могу нарисовать(правда, кроме paint ничего и нет на тачках). Если нужна анимация покрасивее то это уже не ко мне, а что касается кода вот:
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
#include <SFML/Graphics.hpp> // Подключение графики SFML
#include <time.h> // Время для rand
#include <sstream> // Поток для отображения очков
using namespace sf; // sf пространство для удобства
unsigned int EggRand(unsigned int &EggDir) // Принимаем адрес переменной сценария
    {
        EggDir = rand()%4; // Присваиваем рандом от 0 до 3
        return EggDir; // Возвращаем значение
    }
int main()
{
//-------------------Привязка ко времени -------------------------
    Clock clock; // Переменная времени
//----------------------Создание окна ----------------------------
    RenderWindow window(VideoMode(800, 600), "***Game For Zak Zelman***"); 
//----------------------Создание персонажа -----------------------
    Image stay2; // Создаем объект изображения
    stay2.loadFromFile("stay2.png"); // Подгружаем картинку
    stay2.createMaskFromColor(Color(255,255,255)); // Используем загрузку через Image только ради маски(убираем белый фон программно)
 
    Texture stay2t; // Создаем текстуру для персонажа
    stay2t.loadFromImage(stay2); // Подгружаем картинку в текстуру
 
    Sprite stay2s; // Создаем спрайт для персонажа
    stay2s.setTexture(stay2t); // Текстуру заливаем в спрайт
    stay2s.setTextureRect(IntRect(0,0,315,281)); // Вырезаем кадр из спрайта
    stay2s.setPosition(242.5,300); // Координаты куда рисуем
//----------------------Контроль состояния -----------------------
    int direction(0); // Будет принимать от 0 до 3 в зависимости от состояния
//------------------------Создание фона --------------------------
    Texture Background; // Создаем текстуру для фона
    Background.loadFromFile("Background2.png"); // Заливаем картинку сразу в текстуру
 
    Sprite Back; // Создаем спрайт для фона
    Back.setTexture(Background); // Заливаем текстуру в спрайт
//-------------------------Создание яйца -------------------------
    Image eggI; // Создаем объект изображения
    eggI.loadFromFile("Egg.png"); // Подгружаем картинку
    eggI.createMaskFromColor(Color(255,255,255)); // Используем загрузку через Image только ради маски(убираем белый фон программно)
 
    Texture eggT; // Создаем текстуру для яйца
    eggT.loadFromImage(eggI); // Подгружаем картинку в текстуру
 
    Sprite egg; // Создаем спрайт для яйца
    egg.setTexture(eggT); // Текстуру заливаем в спрайт
    egg.setTextureRect(IntRect(0,0,46,62)); // Вырезаем кадр из спрайта
    egg.setPosition(100,100); // Координаты куда рисуем
    egg.setOrigin(23,31); // Отсчет координа из центра для вращения
    double speed(0.1); // Скорость вращения яйца
//-------------------------Движение яйца -------------------------
        // Рассмотрим четыре сценария появления и движения яйца
    srand(time(NULL)); // Генерация псевдослучайных чисел
    unsigned int EggDir; // Переменная сценария (принимает значение от 0 до 3)
    EggDir = EggRand(EggDir); // Выбирается позиция яйца рандомно через функцию EggRand
    bool force = true; // Состояние яйца
    int tmp(0); // Храним итерацию для setPosition
    int count(0); // Считаем очки
    int lose(3); // Считаем жизни
//---------------------Вывод очков и жизни -----------------------
    Font font; // Создаем шрифт
    font.loadFromFile("CyrilicOld.ttf"); // Подгружаем наш шрифт
    Text CountText("", font, 20); // Создаем текст с путой строкой
    CountText.setColor(Color::Blue);// Задаем цвет
    CountText.setPosition(10,10);//задаем позицию текста, центр камеры
 
    Text life("", font, 20); // Создаем текст с путой строкой
    life.setColor(Color::Black);// Задаем цвет
    life.setPosition(700,10);//задаем позицию текста, центр камеры
//--------------------Основной цикл программы --------------------
    while (window.isOpen()) // Пока окно открыто
    {
        float time = clock.getElapsedTime().asMicroseconds(); // Ласт тайм в микросекундах
        clock.restart(); // Перезагружаем тайм
        time = time/800;
        Event event;
        while (window.pollEvent(event)) // Обработка события "закрытие окна"
        {
            if ((event.type == Event::Closed)||(Keyboard::isKeyPressed(Keyboard::Q)))
                window.close(); //  Закрываем окно если нажат крестик или Q
        }
//--Подблок в основном цикле программы - "Обработка объектов egg" --
        // В нашей игре яйца будут появляться последовательно,что разрешает отказаться от динамической памяти
        egg.rotate(speed*time); // Постоянно вращаем яйцо со скорость speed
        if(lose==0){window.close();} // Если жизни закончились выходим из игры
        if(force) // Если яйцо еще не разбилось или не было поймано
        {
            if(EggDir==0) // Яйцо катится слева сверху
            {
                    if(!tmp)egg.setPosition(0,153); // Если первая итерация то перемещаем яйцо в нужную позицию
                    egg.move(0.15*time,0); // Двигаем яйцо
                    tmp++; // Итерация уже не первая
                    if(egg.getPosition() .x >= 230) // Если палка по которой катиться яйцо закончилась
                        {
                        egg.move(0,0.15*time); // Двигаем яйцо вниз
                        if(egg.getPosition() .x >= 275)egg.move(-0.15*time,0); // Если выровнялись то балансируем наклонное движение
                        //Если яйцо в диапазоне корзины и волк стоит правильно яйцо поймали,яйцо переместили(false),итерацию обнулили,очки зачли
                        if((egg.getPosition() .y > 300)&&(direction==1)&&(egg.getPosition() .y < 320)){force = false;tmp=0;count++;} 
                        // Если яйцо упало,яйцо переместили,итерацию обнулили,жизнь вычли
                        if(egg.getPosition() .y >= 500){force = false;tmp=0;lose--;}
                        }
            }
            if(EggDir==1) // Яйцо катится справа сверху
            {
                    if(!tmp)egg.setPosition(800,153); // Если первая итерация то перемещаем яйцо в нужную позицию
                    egg.move(-0.15*time,0); // Двигаем яйцо
                    tmp++; // Итерация уже не первая
                    if(egg.getPosition() .x <= 530) // Если палка по которой катиться яйцо закончилась
                        { 
                        egg.move(0,0.15*time);  // Двигаем яйцо вниз
                        if(egg.getPosition() .x <= 520)egg.move(0.15*time,0); // Если выровнялись то балансируем наклонное движение
                        //Если яйцо в диапазоне корзины и волк стоит правильно яйцо поймали,яйцо переместили(false),итерацию обнулили,очки зачли
                        if(((egg.getPosition() .y > 300)&&(direction==0))&&(egg.getPosition() .y < 320)){force = false;tmp=0;count++;}
                        // Если яйцо упало,яйцо переместили,итерацию обнулили,жизнь вычли
                        if(egg.getPosition() .y >= 500){force = false;tmp=0;lose--;}
                        }
            }
            if(EggDir==2) // Яйцо катится слева снизу
            {
                    if(!tmp)egg.setPosition(0,353); // Если первая итерация то перемещаем яйцо в нужную позицию
                    egg.move(0.15*time,0); // Двигаем яйцо
                    tmp++; // Итерация уже не первая
                    if(egg.getPosition() .x >= 230) // Если палка по которой катиться яйцо закончилась
                        {
                        egg.move(0,0.15*time); // Двигаем яйцо вниз
                        if(egg.getPosition() .x >= 275)egg.move(-0.15*time,0); // Если выровнялись то балансируем наклонное движение
                        //Если яйцо в диапазоне корзины и волк стоит правильно яйцо поймали,яйцо переместили(false),итерацию обнулили,очки зачли
                        if((egg.getPosition() .y > 400)&&(direction==3)&&(egg.getPosition() .y < 420)){force = false;tmp=0;count++;}
                        // Если яйцо упало,яйцо переместили,итерацию обнулили,жизнь вычли
                        if(egg.getPosition() .y >= 500){force = false;tmp=0;lose--;}
                        }
            }
            if(EggDir==3) // Яйцо катится справа снизу
            {
                    if(!tmp)egg.setPosition(800,353); // Если первая итерация то перемещаем яйцо в нужную позицию
                    egg.move(-0.15*time,0); // Двигаем яйцо
                    tmp++; // Итерация уже не первая
                    if(egg.getPosition() .x <= 530) // Если палка по которой катиться яйцо закончилась
                        {
                        egg.move(0,0.15*time); // Двигаем яйцо вниз
                        if(egg.getPosition() .x <= 520)egg.move(0.15*time,0); // Если выровнялись то балансируем наклонное движение
                        //Если яйцо в диапазоне корзины и волк стоит правильно яйцо поймали,яйцо переместили(false),итерацию обнулили,очки зачли
                        if(((egg.getPosition() .y > 400)&&(direction==2))&&(egg.getPosition() .y < 420)){force = false;tmp=0;count++;}
                        // Если яйцо упало,яйцо переместили,итерацию обнулили,жизнь вычли
                        if(egg.getPosition() .y >= 500){force = false;tmp=0;lose--;}
                        }
            }
        }
        else // Если force=false, значит яйцо или поймано или разбилось, делаем снова true и перемещаем на новое направление
        {
            EggDir = EggRand(EggDir);// Вызываем функцию генерации случайного события для появления яйца
            force = true; // Яйцо "живое"
        }
//--------Подблок в основном цикле программы - "Управление" -------
        if (Keyboard::isKeyPressed(Keyboard::Right)) // Если жмем направо
        {
            if(direction==1){stay2s.setTextureRect(IntRect(0,0,315,281));direction=0;} // Если стояли и смотрели налево, меняем флаг состояния
            if(direction==3){stay2s.setTextureRect(IntRect(338,0,360,281));direction=2;} // Если сидели и смотрели налево, меняем флаг состояния
        }
        if (Keyboard::isKeyPressed(Keyboard::Left)) // Если жмем налево
        {
            if(direction==0){stay2s.setTextureRect(IntRect(0+315,0,-315,281));direction=1;} // Если стояли и смотрели направо, меняем флаг состояния
            if(direction==2){stay2s.setTextureRect(IntRect(338+360,0,-360,281));direction=3;} // Если сидели и смотрели направо, меняем флаг состояния
        }
        if (Keyboard::isKeyPressed(Keyboard::Up)) // Если жмем вверх
        {
            if(direction==2){stay2s.setTextureRect(IntRect(0,0,315,281));direction=0;} // Если сидели и смотрели направо, меняем флаг состояния
            if(direction==3){stay2s.setTextureRect(IntRect(0+315,0,-315,281));direction=1;} // Если сидели и смотрели налево, меняем флаг состояния
        }
        if (Keyboard::isKeyPressed(Keyboard::Down)) // Если жмем вниз
        {
            if(direction==0){stay2s.setTextureRect(IntRect(338,0,360,281));direction=2;} // Если стояли и смотрели направо, меняем флаг состояния 
            if(direction==1){stay2s.setTextureRect(IntRect(338+360,0,-360,281));direction=3;} // Если стояли и смотрели налево, меняем флаг состояния
        }
//--------Подблок в основном цикле программы - "Обновление" -------
        window.clear(); // Очищаем экран
        window.draw(Back); // Рисуем фон
        window.draw(stay2s); // Рисуем персонажа
        window.draw(egg); // Рисуем яйцо
//--------------------------Выводим текст--------------------------
        // Яйца
        std::ostringstream CountEgg;
        CountEgg << count; // В поток кидаем количество пойманых яиц
        CountText.setString("Собрано яиц: "+ CountEgg.str());// В потоке инт преобразуем в строку
        window.draw(CountText);// Рисуем текст
        // Жизни
        std::ostringstream CountLife;
        CountLife << lose; // В поток кидаем количество жизни
        life.setString("Жизни: "+ CountLife.str());// В потоке инт преобразуем в строку
        window.draw(life);// Рисуем текст
 
        window.display(); // Выводим на экран
    }
    return 0;
}
Не использовал ООП, динамическую память, функция и то одна, так что с понимание проблем быть не может. Материала по SFML сейчас достаточно много, освоите при желании, скрины и source прикрепляю.
Кликните здесь для просмотра всего текста

Если возникнет "Такс, мне дали рабочий код, как же скомпилировать эту фигню..." то:
Среда: Microsoft Visual Studio Ultimate 2012 (11.0) у меня лично x86 (винда х64 не смущает) стянул на {ссылка вырезана}
SFML для этой студии: тут
Подключать: так
Весь source положить в папку с проектом где main.cpp как на скрине №3
Во втором архиве полностью весь debug проект и двухсекундный ролик если найдутся любопытные и ленивые(хотя все это полная , так что качать не стоит).
Миниатюры
Создание 2D-игры для C++ "Волк-яйцелов"   Создание 2D-игры для C++ "Волк-яйцелов"   Создание 2D-игры для C++ "Волк-яйцелов"  

Вложения
Тип файла: rar source.rar (882.4 Кб, 207 просмотров)
Тип файла: rar Full Debug Project+Video.rar (9.05 Мб, 239 просмотров)
4
 Аватар для idm
120 / 34 / 19
Регистрация: 19.03.2015
Сообщений: 90
03.06.2015, 12:54
Цитата Сообщение от Zak_Zelman Посмотреть сообщение
работу предоставить необходимо уже в скором времени
Zak_Zelman, Последняя активность: 31.05.2015 22:19
Сказали бы что не срочно, я бы и не торопился.
1
0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 13
15.02.2016, 08:52  [ТС]
Большое спасибо, что сделали это. Мне очень пригодится в дальнейшем.
0
0 / 0 / 0
Регистрация: 05.12.2021
Сообщений: 2
12.12.2021, 15:43
а как сделать так чтобы яица и бомбы падали с задержкой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2021, 15:43
Помогаю со студенческими работами здесь

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

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

Создание логотипа для игры
Здравствуйте все, с прошедшими! Подскажите в каком формате и каких размеров должен создаватса логотип для игры? В данном случае фотошоп5

Создание мультиплеера для игры
Привет, программисты! :) Хотел бы узнать, что нужно изучать, чтобы написать мультиплеер к игре GTA San Andreas? Боюсь, что пойду не по...

Создание лаунчера для игры
В общем от нечего делать решил я сделать (попытаться) лаунчер для любимой игры. Пытаюсь сделать это чудо я через VS2010E. (не бейте...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru