Пятница, 29 Августа 2025, 05:48

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Результаты поиска
SaiteiДата: Понедельник, 03 Ноября 2014, 11:30 | Сообщение # 481 | Тема: Ищу движок для 2.5D онлайн игры с исп. С\С++
старожил
Сейчас нет на сайте
-l33t-h4xx-, изометрию же?
SaiteiДата: Воскресенье, 02 Ноября 2014, 13:40 | Сообщение # 482 | Тема: "Пишу свой игровой движок" - обсуждение
старожил
Сейчас нет на сайте
Цитата CaptanVova ()
А продолжение будет?

неа
SaiteiДата: Воскресенье, 02 Ноября 2014, 13:35 | Сообщение # 483 | Тема: Раскрашивание в фотошопе.
старожил
Сейчас нет на сайте
Цитата _ToBe_ ()
Картинка№1
Картинка№2

Классно получились. Особенно вторая :3
SaiteiДата: Воскресенье, 02 Ноября 2014, 13:31 | Сообщение # 484 | Тема: Космические рейнджеры 3
старожил
Сейчас нет на сайте
Ordan, AndrewVersus, честно говоря, разработчики КР меня сильно вдохновляют)
SaiteiДата: Суббота, 01 Ноября 2014, 21:22 | Сообщение # 485 | Тема: Помогите найти изображения
старожил
Сейчас нет на сайте
Цитата Angry ()
Ну наверное я попробовал это в первую очередь

мы не экстрасенсы.
SaiteiДата: Пятница, 31 Октября 2014, 18:12 | Сообщение # 486 | Тема: Космические рейнджеры 3
старожил
Сейчас нет на сайте
AndrewVersus, та не, первая часть КР делалась практически без бюджета двумя людьми
SaiteiДата: Воскресенье, 26 Октября 2014, 18:18 | Сообщение # 487 | Тема: Привет всем
старожил
Сейчас нет на сайте
Цитата griga555 ()
Помогите создать игру про симпсонов типа гта не такую лажевую как The Simpsons - Hit & Run или Game . Хочется что бы в игре все было как в гта только это были любимые Симпсоны я уверен очем много кто хотел бы в нее поиграть , а ждать когда какие ни будь компании ее создадут это на мой взгляд пустая трата времени , на мой взгляд вся надежда именно на фанатов данного сериала !!! Потому что именно фанаты способна все прочувствовать как надо а не как издатель велит . Если бы я понимал в программирование я бы может что и смог сделать а так я в нем ноль пока учусь и пенсия придет ))) Могу помочь с написанием сюжета или рисованием объектов , так как иногда рисую . Думаю если найдутся люди то каждый сможет вложить частичку в проект и мы сделаем его !
О да, идея супер!1! Мы же там прибыль разделим 50 на 50, да????? Ну, йа в деле.. Вообще круто! Эта пять!
SaiteiДата: Суббота, 25 Октября 2014, 22:13 | Сообщение # 488 | Тема: Ищу идею для игры
старожил
Сейчас нет на сайте
kotofey, то, что я хочу сделать игру чисто своими силами
SaiteiДата: Суббота, 25 Октября 2014, 21:19 | Сообщение # 489 | Тема: Модуль игры на PascalABC.NET
старожил
Сейчас нет на сайте
Цитата KRONMAG ()
fon(

и т.п. убрать. Плохой стиль это...
А ещё нужно придумать архитектуру игры... Всё в одном модуле хранить как-то...
SaiteiДата: Суббота, 25 Октября 2014, 20:41 | Сообщение # 490 | Тема: [Урок]Игра "Жизнь"
старожил
Сейчас нет на сайте
Сегодня я покажу как написать игру "Жизнь".
Сразу хочу обратить внимание на то, что я не буду использовать ООП. Так же по совету опытных программистов я решил, что не стоит игру нагружать потоками, синглтонами и прочей ерундой. Если будет большое желание - я сделаю отдельный урок по разработке маленького параллельного игрового движка.

Игра "Жизнь"
Суть игры элементарна! Есть массив клеток. Каждая клетка может находиться в состоянии "1" или "0".
  • Если возле пустой клетки находится три живых клетки - зарождается жизнь.
  • Если же у живой клетки есть 2-3 соседа, то она продолжает жить (в противном случае погибает либо от одиночества, либо от "тесноты").
    Вот и всё.

    Код
    Игру можно было легко сделать и в консоли, но мне показалось, что получится "круче" если будет графика.
    Я использовал SFML, дабы не зацикливать ваше внимание на нюансах OpenGL/DirectX. Всё, что нас сейчас интересует, - это игра.
    Перед тем, как взглянуть на мой код, попробуйте самостоятельно написать такую игру. Если у вас получится, то можете гордиться собой.

    На этапе настройки SFML я не буду останавливаться, ведь всё написано здесь.
    Итак. Имеем следующее:

    Код
    #include <SFML/Graphics.hpp>
    #include <time.h>
    #define WINDOW_WIDTH 640
    #define WINDOW_HEIGHT 480
    #define WINDOW_TITLE "Life Game"
    #define CELL_SIZE 5
    #define MAP_WIDTH WINDOW_WIDTH/CELL_SIZE
    #define MAP_HEIGHT WINDOW_HEIGHT/CELL_SIZE
    #define FPS 22

    int main()
    {
             srand(time(NULL)); //Для рандома
             sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), WINDOW_TITLE); //Создаём окно
             window.setFramerateLimit(FPS);
             while (window.isOpen())
             {
                 sf::Event event;
                 while (window.pollEvent(event))
                 {
                     if (event.type == sf::Event::Closed)
                         window.close();
                 }
                 window.clear();
    ...
                 window.display();
             }
          return 0;
    }


    По условию игры есть массив клеток, где каждая клетка может становится либо "0", либо "1". Ничего не напоминает? Да-да! Это тоже самое, что true или false. Следовательно у нас есть массив булевых значений:
    Код
    bool Generation[MAP_WIDTH][MAP_HEIGHT];

    Но нам одного массива недостаточно, потому что мы каким-то образом должны "запоминать" это поколение клеток, чтобы его нормально обновлять:
    Код
    bool OldGeneration[MAP_WIDTH][MAP_HEIGHT];

    Что-то в этом есть... Не так ли?
    Но наши поколения пусты! Что же нам делать?
    Верно! Нам нужно его создать. Следовательно создадим функцию Generate:
    Код
    void Generate()
    {
          for(int y = 0; y < MAP_HEIGHT; y++)
          {
           for(int x = 0; x < MAP_WIDTH; x++)
           {
            if(rand()%10 == 1)
            {
             Generation[x][y] = OldGeneration[x][y] = true;
            }
            else
            {
             Generation[x][y] = OldGeneration[x][y] = false;
            }
           }
          }
    }

    Может быть кто-то из вас испугался циклов for... Но ничего здесь страшного нет! Мы всего лишь "пообщаемся" с каждой ячейкой массива =)
    Что касаемо rand()%10 - здесь мы генерируем число в диапазоне от 0 до 9. Следовательно rand()%N вернет число в диапазоне от 0 до (N-1).
    Если сгенерирована единица, то мы ставим в ячейку клетку. В противном случае в ячейке никого нет.
    В OldGeneration мы зафиксировали поколение, чтобы нормально обновлять Generation.
    Теперь нужно написать функцию обновления поколения:
    Код
    void Update()
    {
          UpdateOldGeneration();
          for(int y = 0; y < MAP_HEIGHT; y++)
          {
           for(int x = 0; x < MAP_WIDTH; x++)
           {
            char cellsCount = GetCellsCount(x,y);
            if(OldGeneration[x][y] == false)
            {
             if(cellsCount == 3)
             {
              Generation[x][y] = true;
             }
            }
            else
            {
             if((cellsCount < 2)||(cellsCount > 3))
             {
              Generation[x][y] = false;
             }
            }
           }
          }
    }

    Описание функций UpdateOldGeneration и GetCellsCount(x,y) я приведу ниже. Могу лишь сказать, что UpdateOldGeneration копирует Generation в OldGeneration, а GetCellsCount возвращает количество живых клеток возле OldGeneration[x][y] (с проверками на выход из массива).
    В функции Update мы всего лишь закодировали правила игры:
    Цитата
    Если возле пустой клетки находится три живых клетки - зарождается жизнь.
    Если же у живой клетки есть 2-3 соседа она продолжает жить (в противном случае погибает либо от одиночества, либо от "тесноты").

    Вот описание UpdateOldGeneration:
    Цитата
    void UpdateOldGeneration()
    {
    for(int y = 0; y < MAP_HEIGHT; y++)
    {
    for(int x = 0; x < MAP_WIDTH; x++)
    {
    OldGeneration[x][y] = Generation[x][y];
    }
    }
    }

    А вот и GetCellsCount:
    Код
    char GetCellsCount(char x, char y)
    {
          return GetCell(x-1,y)+GetCell(x-1,y-1)+GetCell(x,y-1)+GetCell(x+1,y-1)+
           GetCell(x+1,y)+GetCell(x+1,y+1)+GetCell(x,y+1)+GetCell(x-1,y+1);
    }

    "Ну вот! Опять какая-то функция!" - скажите вы. Но не беспокойтесь, мы скоро закончим : )
    GetCell всего лишь возвращает значение определенной клетки, если её координаты находятся в диапазоне массива:
    Код
    char GetCell(char x, char y)
    {
          if((x < 0)||(x > MAP_WIDTH - 1)||(y < 0)||(y > MAP_HEIGHT - 1))
          {
           return 0;
          }
          return (char)OldGeneration[x][y];
    }  


    Что ж! Логика написана. Теперь попытайтесь всё вывести на консоль.
    А вот мой код с выводом и прочей чепухой:
    Код
    #include <SFML/Graphics.hpp>
    #include <time.h>
    #define WINDOW_WIDTH 640
    #define WINDOW_HEIGHT 480
    #define WINDOW_TITLE "Life Game"
    #define CELL_SIZE 5
    #define MAP_WIDTH WINDOW_WIDTH/CELL_SIZE
    #define MAP_HEIGHT WINDOW_HEIGHT/CELL_SIZE
    #define FPS 22

    bool Generation[MAP_WIDTH][MAP_HEIGHT];
    bool OldGeneration[MAP_WIDTH][MAP_HEIGHT];

    void Generate()
    {
          for(int y = 0; y < MAP_HEIGHT; y++)
          {
           for(int x = 0; x < MAP_WIDTH; x++)
           {
            if(rand()%10 == 1)
            {
             Generation[x][y] = OldGeneration[x][y] = true;
            }
            else
            {
             Generation[x][y] = OldGeneration[x][y] = false;
            }
           }
          }
    }

    void UpdateOldGeneration()
    {
          for(int y = 0; y < MAP_HEIGHT; y++)
          {
           for(int x = 0; x < MAP_WIDTH; x++)
           {
            OldGeneration[x][y] = Generation[x][y];
           }
          }
    }

    char GetCell(char x, char y)
    {
          if((x < 0)||(x > MAP_WIDTH - 1)||(y < 0)||(y > MAP_HEIGHT - 1))
          {
           return 0;
          }
          return (char)OldGeneration[x][y];
    }

    char GetCellsCount(char x, char y)
    {
          return GetCell(x-1,y)+GetCell(x-1,y-1)+GetCell(x,y-1)+GetCell(x+1,y-1)+
           GetCell(x+1,y)+GetCell(x+1,y+1)+GetCell(x,y+1)+GetCell(x-1,y+1);
    }

    void Update()
    {
          UpdateOldGeneration();
          for(int y = 0; y < MAP_HEIGHT; y++)
          {
           for(int x = 0; x < MAP_WIDTH; x++)
           {
            char cellsCount = GetCellsCount(x,y);
            if(OldGeneration[x][y] == false)
            {
             if(cellsCount == 3)
             {
              Generation[x][y] = true;
             }
            }
            else
            {
             if((cellsCount < 2)||(cellsCount > 3))
             {
              Generation[x][y] = false;
             }
            }
           }
          }
    }

    void Draw(sf::RenderWindow* window, sf::RectangleShape* rectangle)
    {
          for(int y = 0; y < MAP_HEIGHT; y++)
          {
           for(int x = 0; x < MAP_WIDTH; x++)
           {
            if(Generation[x][y])
            {
             rectangle->setPosition(x*CELL_SIZE, y*CELL_SIZE);
             window->draw(*rectangle);
            }
           }
          }
    }

    int main()
    {
          srand(time(NULL));
          sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), WINDOW_TITLE);
          window.setFramerateLimit(FPS);
          sf::RectangleShape rectangle;
          rectangle.setFillColor(sf::Color(250,50,50));
          rectangle.setSize(sf::Vector2f(CELL_SIZE,CELL_SIZE));
          Generate();
             while (window.isOpen())
             {
                 sf::Event event;
                 while (window.pollEvent(event))
                 {
                     if (event.type == sf::Event::Closed)
                         window.close();
                 }
           if(sf::Keyboard::isKeyPressed(sf::Keyboard::R))
           {
            Generate();
           }
           Update();
                 window.clear();
           Draw(&window,&rectangle);
                 window.display();
             }
          return 0;
    }


    That's all.

    Вот скриншот:

    Добавлено (25.10.2014, 20:41)
    ---------------------------------------------
    *facepalm* что-то мне стыдно стало за этот код...

    Сообщение отредактировал Saitei - Пятница, 15 Августа 2014, 18:17
  • SaiteiДата: Суббота, 25 Октября 2014, 20:27 | Сообщение # 491 | Тема: Ищу идею для игры
    старожил
    Сейчас нет на сайте
    Всем здрям. Я программист С++, таланта в рисовании нет. С художниками, как известно, беда большая и, видимо, я не умею работать в команде.
    Посему ищу идею для двухмерной RTS, где не нужна графика в принципе (т.е. игру можно написать даже используя обыкновенные примитивы вроде треугольник\квадрат\круг и т.п.). Ставку хочу сделать на динамичный геймплей и идею. Есть идеи?


    Сообщение отредактировал Saitei - Суббота, 25 Октября 2014, 20:27
    SaiteiДата: Понедельник, 13 Октября 2014, 17:44 | Сообщение # 492 | Тема: Школьные будни хикки
    старожил
    Сейчас нет на сайте
    Цитата nikanator ()
    3. Программист(ы). Новелла хочет чтобы ее делали на Renpy, т.к. last2424 не проявляет особой активности

    На чистом С++ нельзя?
    SaiteiДата: Суббота, 11 Октября 2014, 19:20 | Сообщение # 493 | Тема: Помогите развить архитектурное решение игрового движка
    старожил
    Сейчас нет на сайте
    Archido, БД - это лишь один вариант. Вся соль в том, что центр всех систем - это данные
    SaiteiДата: Понедельник, 06 Октября 2014, 23:46 | Сообщение # 494 | Тема: Паскаль мертв?
    старожил
    Сейчас нет на сайте
    Меня сейчас паскалем насилуют... Язык-то хороший, но с С++ резко на паскаль... Ужасные ощущения, правда sad
    SaiteiДата: Понедельник, 06 Октября 2014, 12:42 | Сообщение # 495 | Тема: Помогите развить архитектурное решение игрового движка
    старожил
    Сейчас нет на сайте
    Цитата HPlusDiese ()
    Это просто модульная структура. Так обычно всегда делают - абстрактный интерфейс каждой подсистемы, независимый от реализации.

    Можете на примере показать модульную структуру?
    SaiteiДата: Понедельник, 06 Октября 2014, 12:22 | Сообщение # 496 | Тема: Задачи по Borland C++
    старожил
    Сейчас нет на сайте
    Ramilyanamana, эм... Тебе дали готовую функцию. Просто вставь её описание и реализацию и тупо юзай
    SaiteiДата: Понедельник, 06 Октября 2014, 11:22 | Сообщение # 497 | Тема: Помогите развить архитектурное решение игрового движка
    старожил
    Сейчас нет на сайте
    Ordan, встраиваемая СУБД: sqlite.
    SaiteiДата: Воскресенье, 05 Октября 2014, 22:39 | Сообщение # 498 | Тема: [2D] HeliFight Online
    старожил
    Сейчас нет на сайте
    NovaSurfer, что такое верт?
    SaiteiДата: Воскресенье, 05 Октября 2014, 19:47 | Сообщение # 499 | Тема: Помогите развить архитектурное решение игрового движка
    старожил
    Сейчас нет на сайте
    Vinchensoo, в зависимости от того, что вы называете разделяемой памятью : )
    OpenGOO, можно ужать в 1 запрос) Ну а вообще зависит от игры, так-то
    SaiteiДата: Воскресенье, 05 Октября 2014, 17:50 | Сообщение # 500 | Тема: Помогите развить архитектурное решение игрового движка
    старожил
    Сейчас нет на сайте
    Цитата vanvanich ()
    Но платишь скоростью взаимодействия .

    Думаете, скорости не хватит?
    Поиск:

    Все права сохранены. GcUp.ru © 2008-2025 Рейтинг