Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
2 / 2 / 0
Регистрация: 27.06.2019
Сообщений: 1

Приложение, симулирующее дождевые капли

27.06.2019, 12:33. Показов 6335. Ответов 30

Студворк — интернет-сервис помощи студентам
Дело такое: я хочу написать программу, которая бы симулировала дождь. Равномерно по экрану я генерирую капли, которые затем должны падать вниз, но они не рисуются + они не падают. Я абсолютно без понятия, почему компьютер не рисует капли.
Java
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
package Pack;
 
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
 
public class Runner {
    
    public static void createGUI() {
        JFrame f = new JFrame("Rain");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setPreferredSize(new Dimension(500, 500));
        f.setLocation(800, 100);
        f.setBackground(Color.lightGray);
        BackGroundPanel bg = new BackGroundPanel();
        bg.setLayout(null);
        f.add(bg);
        Drop[] drop = new Drop[100];
        for (int i = 0; i < drop.length; i++) {
            drop[i] = new Drop();
            bg.add(drop[i]);
            drop[i].fall();
        }
        
        f.pack();
        f.setVisible(true);
        
    }
        
    
    
    
    
    public static void main(String[] args) {
        System.out.println("Start");
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createGUI();
            }
        });
            
        }
            
    
    
}
 
 
public class BackGroundPanel extends JPanel {
     public BackGroundPanel() {
         setBackground(Color.lightGray);
    }
 
}
 
 
public class Drop extends JComponent{
    private int x, y, ySpeed;
    
    Drop(){
        x = new Random().nextInt(500);
        y = new Random().nextInt(500);
        ySpeed = new Random().nextInt(5) + 1;
    }
    
    void fall() {
        while(true) {
                y = y + ySpeed;
                if (y == 500) {
                   y = 0;
                  }
                   repaint();
                   try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    
                }
        }
         
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
         g.setColor(Color.BLUE);
         g.fillRect(10, 10, 10, 30);
     }
      
}
2
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2019, 12:33
Ответы с готовыми решениями:

Заряд капли
К двум горизонтально размещенных плоских пластин, удаленных на расстояние 3 см друг от друга, приложено напряжение 300В. В электрическом...

Капли дождя
Здравствуйте!!! Помогите пожалуйста сделать на консольном окне капли дождя(то есть как льет дождь). Нужно чтобы они падали как на землю!!!...

Форма капли
помогите , дана программа написана в паскале нужно в турбо делфи переписать не получается..... вот код в паскале uses crt, ...

30
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
27.06.2019, 13:37
В общем-то, ваша программа у меня даже не запускается, но идея мне понравилась, поэтому я решил её реализовать. Ну и собсна, я это сделал. Правда, сам я ещё не очень прошаренный, поэтому по какой-то причине эта хрень жрёт катастрофически много ресурсов, но тем не менее, работает

Java
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
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
 
import javax.swing.JComponent;
import javax.swing.JFrame;
 
public class Rain {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame f = new JFrame();
            f.add(new RainComponent());
            f.pack();
            f.setResizable(false);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        });
    }
}
 
class RainComponent extends JComponent {
    private static final long serialVersionUID = -6828409152630535756L;
    private static final int COMP_WIDTH = 500;
    private static final int COMP_HEIGHT = 500;
    private static final int DROP_WIDTH = 2;
    private static final int DROP_HEIGHT = 5;
    
    private Rectangle2D[] drops;
    
    public RainComponent() {
        drops = new Rectangle2D[100];
        Random rand = new Random();
        for (int i = 0; i < drops.length; i++) {
            drops[i] = new Rectangle2D.Double(rand.nextInt(COMP_WIDTH), rand.nextInt(COMP_HEIGHT), DROP_WIDTH, DROP_HEIGHT);
            Rectangle2D r = drops[i];
            int speed = rand.nextInt(20);
            Thread t = new Thread(() -> {
                while (true) {
                    int newY = (int) (r.getY() + 1);
                    int newX;
                    if (newY >= COMP_HEIGHT) {
                        newY = 0;
                        newX = ThreadLocalRandom.current().nextInt(COMP_WIDTH);
                    } else
                        newX = (int) r.getX();
                    r.setRect(newX, newY, DROP_WIDTH, DROP_HEIGHT);
                    repaint();
                    try {
                        Thread.sleep(speed >= 10 ? speed : 10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t.setDaemon(true);
            t.start();
        }
    }
    
    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLUE);
        for (Rectangle2D r : drops) {
            g2.fill(r);
        }
    }
    
    public Dimension preferredSize() {
        return new Dimension(COMP_WIDTH, COMP_HEIGHT);
    }
}
Добавлено через 1 минуту
если кто-нибудь из знающих людей читает, то объясните, пожалуйста, почему компуктер начинает греться как чёрт во время выполнения программы? Я понимаю, что 100 потоков эт, наверное, много, но они почти ничего ж не делают
1
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
27.06.2019, 16:54
Лучший ответ Сообщение было отмечено Aviz__ как решение

Решение

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

а так если дождик по проще то как то так
Java
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
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
 
 
public class Rain
{
    public JFrame win;
    public JLayeredPane swap;
    public JLabel[] jl = new JLabel[100];
    public int[] yRain = new int[100];
    
    
    public Rain()
    {
        makeWindow();
        makeRainDrop();
        new WorkerThread();
    }
    
    
    private void makeWindow()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        win = new JFrame("Rain");
        swap = new JLayeredPane();
        swap = win.getLayeredPane();
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.getContentPane().setBackground(Color.WHITE);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void makeRainDrop()
    {
        int[] arrRainSize = {30, 30};
        int[] arrRainSpeed = {2, 3, 4, 5};
        //
        BufferedImage bf = new BufferedImage(arrRainSize[0], arrRainSize[1], BufferedImage.TYPE_INT_ARGB);
        Graphics g = bf.createGraphics();
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor(new Color(0,0,0));
        g2.drawLine(arrRainSize[1]/2, 0, arrRainSize[0]/2, arrRainSize[1]);
        g2.dispose();
        //
        for (int i = 0; i < jl.length; i++)
        {
            yRain[i] = new Random().nextInt(600);
            jl[i] = new JLabel();
            jl[i].setBounds(new Random().nextInt(800),
                    yRain[i], arrRainSize[0], arrRainSize[1]);
            jl[i].setName(arrRainSpeed[new Random().nextInt(arrRainSpeed.length)] + "");
            jl[i].setLayout(null);
            jl[i].setOpaque(false);
            jl[i].setIcon(new ImageIcon(bf));
            jl[i].setVisible(true);
            swap.add(jl[i], new Integer(0), i);
            System.out.println(jl[i].getName());
        }
        //
        bf.flush();
    }
    
    
    class WorkerThread extends Thread
    {
        int fps = 15;
 
        
        public WorkerThread()
        {
            setDaemon(true); 
            start();
        }
 
        public void run()
        {
            while (true)
            {
                for (int i = 0; i < jl.length; i++)
                {
                    if (yRain[i] < 600)
                    {
                        yRain[i] += Integer.parseInt(jl[i].getName());
                        jl[i].setLocation(jl[i].getX(), yRain[i]);
                    }
                    else
                    {
                        yRain[i] = 0;
                        jl[i].setLocation(ThreadLocalRandom.current().nextInt(800), yRain[i]);
                    }
                }
                
                try
                {
                    sleep(fps);
                }
                catch (InterruptedException e)
                {
                    //...
                }
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        new Rain();
    }
}
Помните скрины игры что я вам показывал ? Там 3 потока: 1й поток проверяет коллизию всех объектов на экране (в этой игре постоянно проверяется около 200 объектов), 2й поток создает динамическое освещение с пульсацией, для каждого источника света координаты и радиус создает конструктор (динамический свет очень хорошо давит поток, если что то добавить туда то все просто тормозит), 3й поток отвечает за диалоги, анимацию всех персонажей, движение всех персонаже, пошаговая боевка RPG, мини-игры.
3 потока это оптимально для проекта, выше если то по непонятным причинам все просто висеть будет хоть и загрузка ЦП будет на уровне 30%, как узнать загруженность потока, а она получается есть, информацию я не нашел.

Много потоков плохо, пихать все в один поток тоже плохо, хотя раньше с таймерами баловался так вроде 100 таймеров прекрасно звезды двигали (под каждую звездочку свой таймер) но не помню эту поделку уже.
0
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,497
Записей в блоге: 26
02.10.2019, 20:55
Цитата Сообщение от Gungala Посмотреть сообщение
Я понимаю, что 100 потоков эт, наверное, много, но они почти ничего ж не делают
Мне понравились ваши работы. Есть правда некоторое количество лишнего кода. Работа с многопоточностью довольно сложна.

Есть идея использовать несколько другой подход.
То есть использовать CachedThreadPool

Небольшой простой пример, как это работает:
Java
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
package threadPoolExecutorNumThreads;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
 
 
/**
 *
 * @author vvmu
 */
public class TCachedThreadPool {
     public static int gli = 0;
    public static void main(String[] args) {
        /*создает потоки по мере необходимости, но переиспользует неактивные потоки*/
        ExecutorService service = Executors.newCachedThreadPool();
        
        /*запихиваем наши новые потоки в  наш сервис service.submit десять раз*/
        for (int i = 0; i < 10; i++) {
            service.submit(
 
               new Runnable() {
                @Override
                public void run() {
                    
                    gli++;
                    System.out.println(" gli = " + gli);
                }
            });
        }
        
        // в завершении наших задач нам нужно сделать
        // запрещает добавление новых задач и подготавливает ThreadPoolExecutor к завершению
        service.shutdown();
         try {
            // ожидает завершение ThreadPoolExecutor'a через указанное время
            service.awaitTermination(1, TimeUnit.SECONDS);
        } catch (InterruptedException ex) {
           // Logger.getLogger(ThreadPoolExecutorNumThreads.class.getName()).log(Level.SEVERE, null, ex);
          // логи могут понадобиться для отладки в дальнейшем
        }
        
    }
}

То есть мы создаем некоторые задачи
Java
1
new Runnable() {
и заталкиваем их в кэширующий пул.

Добавлено через 16 минут
PS. Поставил плюс ТС за интересный вопрос и идею.
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
02.10.2019, 21:06
vvm28, да я когда писал эту программу ничего не знал про многопоточность. Просто один раз увидел, что тип надо запихнуть метод в Thread и запустить, ну и решил это применить. Сейчас я бы такого бреда не написал
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
03.10.2019, 08:10
vvm28, Следуя вашей логике на создание игры уровня марио надо защитить 3 докторские, а для ее воспроизведения не хватит компьютера пентагона (хотя открою вам секрет марио это 500 строчек кода 1 таймер или 1 поток).
Виртуальная джава машина и мощь под капотом вашего PC это 2 разных организма. Оптимально приемлемо юзать не более 5-10 потоков. CachedThreadPool - вы серьезно в это верите ? Уже не один блогер по филосовствованию джава признал что многопоточность нельзя уверенно контролировать с помощью волшебной кнопки или команды, нужно самому строить свою логику которая хрупка ака хрустальный шар.

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

математические визуальные эффекты: Звезды, дождики, ветер гоняющий листья, рябь на воде, снег и прочее обсосали-обглодали до самых белых костей еще 2000-2003 годах. Если вы проснулись только сейчас и с воодушевлением ринулись дать миру новый лисапед, то вы опоздали на полтора десятка лет.

Цитата Сообщение от Gungala Посмотреть сообщение
Сейчас я бы такого бреда не написал
я хочу это видеть, что же будет сейчас.
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
03.10.2019, 08:24
Nidl, уф, какие у вас проблемы? Отстаньте от меня
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
03.10.2019, 08:42
Цитата Сообщение от Gungala Посмотреть сообщение
да я когда писал эту программу ничего не знал про многопоточность. Просто один раз увидел, что тип надо запихнуть метод в Thread и запустить, ну и решил это применить. Сейчас я бы такого бреда не написал
Вас никто за язык не тянул, мне и стало интересно а как теперь вы бы решили эту задачу ? Насколько шире стал ваш кругозор, ведь казалось бы дождь но можно добавить ветер, скорость под размер капель и т.д.
И как ваше приложение по 3D демонстрации поживает или вы сдались ?
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
03.10.2019, 09:12
Цитата Сообщение от Nidl Посмотреть сообщение
И как ваше приложение по 3D демонстрации поживает или вы сдались ?
Я за него и не приступал, но это в планах. Нашёл способ (направление, по крайней мере), как прочитать нужный мне бинарник с моделькой, несколько статей по устройству 3D моделей и способах их воспроизведения. Но непосредственно реализацией я займусь как минимум через 2 месяца, ибо сейчас всё свободное время приходится посвящать другому "проекту", если так можно выразиться
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,966
Записей в блоге: 225
06.10.2019, 16:17
Makinwa, для графики лучше всего брать LWJGL3, JOGL и т.д. То что использует шейдеры. Шейдеры - это программы для отрисовки графики на стороне графической карты. В этом случае вы загрузите на отрисовку GPU, а не CPU. Если задействовать CPU для графики, то он будет сильно загружен, а GPU (Graphics Processor Unit) предназначен для графики. В случае небольшого разрешения картинки каждый фрагмент (грубо говоря, каждый пиксель) будет обрабатываться на GPU параллельно, потому что современные видео карты могут запускать шейдеры в параллельно в тысячах потоках.

Я написал программу на Java и LWJGL3 (OpenGL 3.1), которая рисует круг с помощью ломанных. Всё подключено. Вам нужно только скачать архив и запустить в Eclipse: Circle_GlfwLwjgl3OpenGL31Java.zip

Данные загружаются один раз в VBO (оперативную память графической карты), а далее GPU берёт эти данные из этой RAM и отрисовывает с помощью шейдеров. В интернете и на Youtube огромное количество уроков уроков для начинающих в шейдерном OpenGL на Java. Вбейте на Youtube: lwjgl3 for beginners. Лучше сразу искать на английском, потому что всегда более качественные уроки и без английского никуда, документация на нём.

0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
06.10.2019, 17:30
8Observer8, OpenGL скоро станет историей, ваш труд можно объяснить поговоркой как воду в ступе толочь.

Ну а по поводу круга с помощью ломаных, где то у меня есть этот кусок кода который сие рисует на основе одной математики и ЦУ это нисколько не напрягала. Круг можно нарисовать очень легко и векторами от центра если вы знаете что такое полярная математика.

Сейчас игры в 95% случаев пишут с помощью конструкторов и готовых движков, отсюда и загрузка ЦП где 30% ваша игра остальное библиотеки вашего конструктора, кодят на чистом языке уже единицы а коллизию математикой может уже объяснить лишь один из 10к программистов.
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,966
Записей в блоге: 225
06.10.2019, 20:10
Цитата Сообщение от Nidl Посмотреть сообщение
OpenGL скоро станет историей, ваш труд можно объяснить поговоркой как воду в ступе толочь.
Шейдерный OpenGL (а точнее, язык для написания шейдеров - GLSL) не уйдёт, потому что шейдеры на GLSL используются в Vulkan тоже. А пока что я не вижу никакого другого языка, кроме GLSL и HLSL (очень похож на GLSL, то используется только на Windows) для программирования графики на стороне видео карты. OpenGL и Vulkan оба используют GLSL и все математические знания остаются актуальными и в Vulkan (матрицы трансформаций, матрица модели, матрица вида, матрица проекции, тригонометрия и т.д.). Но дело в том, что Vulkan сейчас очень мало где поддерживается, только на самых современных картах, а на подавляющем большинстве компьютеров он не поддерживается. Я даже не говорю про мобильные устройства (платшеты, смартфоны), где только OpenGL ES. К тому же для браузеров активно развивается только WebGL (это OpenGL для браузеров). В WebGL тоже используется GLSL. Я использую версию OpenGL 3.1, потому что она наиболее распространена. Новая версия OpenGL 4.6, есть далеко не на всех компьютерах, а тем более мобильных устройствах.

Цитата Сообщение от Nidl Посмотреть сообщение
Ну а по поводу круга с помощью ломаных, где то у меня есть этот кусок кода который сие рисует на основе одной математики и ЦУ это нисколько не напрягала. Круг можно нарисовать очень легко и векторами от центра если вы знаете что такое полярная математика.
Круг я привёл просто, как элементарный пример программы с шейдерами из Java. Мой код использует CPU только один раз для загрузки математически сгенерированных координат ломанной (x = r * cos(alpha), y = r * sin(alpha)) в память видео карты (то есть в VBO), а далее GPU выполняет свою работу, не напрягая CPU. Этот элементарный пример - это просто начальный пример, который можно развить в анимацию с дождиком и который позволит убрать нагрузку с CPU.

Цитата Сообщение от Nidl Посмотреть сообщение
Сейчас игры в 95% случаев пишут с помощью конструкторов и готовых движков, отсюда и загрузка ЦП где 30% ваша игра остальное библиотеки вашего конструктора, кодят на чистом языке уже единицы а коллизию математикой может уже объяснить лишь один из 10к программистов.
А при чём здесь игры? В теме речь идёт о простейшей задаче - вывод на экран анимации состоящей из каких-то объектов, который представляют дождь. Элементарную графику на OpenGL можно использовать далеко не только в играх, но и просто для каких-то полезных неигровых приложений. Это универсальный инструмент для рисования графики: математических 2D/3D графиков, инженерных приложений (CAD-систем), медицинских приложений, научных демонстраций, демонстраций процессов, демонстраций работы механизмов, интерактивных 3D приложений и т.д.

Цитата Сообщение от Nidl Посмотреть сообщение
Сейчас игры в 95% случаев пишут с помощью конструкторов и готовых движков, отсюда и загрузка ЦП где 30% ваша игра остальное библиотеки вашего конструктора, кодят на чистом языке уже единицы а коллизию математикой может уже объяснить лишь один из 10к программистов.
Раз про игры, то я работал в нескольких игровых конторах на движке Unity (C#), которые делают мобильные игры и игры для Steam. Для игр обязательно нужно знать линейную алгебру, даже если она на движке. А ещё нужно знать работу шейдеров и уметь самому писать шейдеры, потому что стандарный набор шейдеров очень скуден, а в играх очень много задач нужно решать с помощью самописных шейдеров. В Unity шейдеры пишутся на HLSL, но он очень похож на GLSL, практически эти языки - это одно и тоже. В новых версиях Unity появился встроенный визуальный редактор шейдеров, но, как программисту удобнее и приятнее работать с кодом, а дизайнерам удобнее, через визуальный редактор.

Цитата Сообщение от Nidl Посмотреть сообщение
Сейчас игры в 95% случаев пишут с помощью конструкторов и готовых движков, отсюда и загрузка ЦП где 30% ваша игра остальное библиотеки вашего конструктора, кодят на чистом языке уже единицы а коллизию математикой может уже объяснить лишь один из 10к программистов.
Ну раз про игры заговорили, то откуда у вас настолько точные научные знания, что именно 95%, а не 93, или 96? Вы можете поискать статистику Steam, где 47% игр пишутся на своих собственных движках:



Никто не должен запрещать другим людям писать свои движки, заточенные под их игры, под их стиль. Мне, например, очень нравится в свободное время изучать, как писать свой движок и я пишу свой маленький игровой движок на шейдерном OpenGL. Мне это помогает не забывать, изучать и развиваться дальше в линейную алгебру, геометрию, немного математического анализа для простой физики (интегрирование, дифференцирование и т.д.), игровые паттерны по GoF, алгоритмы специфичные для графики и игр, мультиплеер, базы данных для игр и т.д. Но при этом я изучаю некоторые популярные игровые и графические движки, фреймворки и библиотеки.
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
06.10.2019, 21:52
я не буду с вами спорить, мы с вами на разных берегах. Писать дождик на OpenGL это как забивать гвозди микроскопом.
Изучать как устроены игры я начал еще со школы, да верно игровые движки создавали всегда, этот продукт мог обеспечить успех компании, первые игры делали на псевдо символах 8х8 и существовала только 2 флагманских языка которые были основными это бейсик и ассемблер. Марио самый первый создан на изменно модифицированном бейсике который был перелопачен для удобство вывода данной графики под данную игру. И с той поры пошла гонка движков которые были хорошим коммерческим продуктом. И эта гонка загнала в уже тупиковую нишу развития программирования. Последний алгоритм вывода графики был разработан более 10 лет назад. И все, те кто мог разрабатывать уже старики а новое поколение знает только готовые движки и их модификации. 3й дум был в демо версии представлен в 2003 году и у меня и сейчас демка в архивах эта есть, прошло 16 лет а скачка соразмерности длинны прыжка между квейком 3 до 3 дума нет. Сейчас разработчики просто стали режиссерами и оперируют контрастностью с блюром переключая планы обзора. Рынок давно вытер ноги о развитии индустрии.

Мне было интересно взглянуть на то что может ваш "маленький движек, просто чтобы за чашкой чая задуматься и спросить в пустоту а зачем ?
Вы знаете игровые движки для 2D игр RPG Maker вы знаете что кодом такие игры занимают всего 3к кода, и вопрос а зачем тогда вообще эта суета если эти 3к кода можно написать с нуля за 1-2 недели ( и я знаю о чем говорю, у меня есть код конструктор на котором можно собрать любую 2д аркаду).

Добавлено через 11 минут
Tomb Raider 1 для работы не нужна была даже виндовс и гра летала на P133 а если вы сейчас нечто аналогичное соберете на Unity3d то для комфортной игры вам потребоваться компьютер не ниже Pentium Duo который превосходит P133 в не одну сотню раз.
первая плойка имела на борту 33 мГЦ частоты без ваших OpenJL но если вы создадите эти игры но новых движках то вам надо будет комп не ниже i3. Ваш путь ведет в никуда, но я понимаю что рынок заставил так идти.

Добавлено через 4 минуты
я до сих пор мило офигиваю как игры в аналоги которых я играл 20 лет назад на дровах сейчас в новой интерпретации лагают на планшете с 4 ядрами 4 гигами оперативки и прочими бла бла бла
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,966
Записей в блоге: 225
06.10.2019, 23:42
Цитата Сообщение от Nidl Посмотреть сообщение
Писать дождик на OpenGL это как забивать гвозди микроскопом.
Я всегда использую OpenGL для подобных задач. Делал на разных языках программирования: Java, C++, Python, JavaScript. Сейчас на C# и TypeScript. Могу рисовать в 2D и 3D. Очень универсальная и быстрая вещь, а главное - перспективная и наукоёмкая. Наукоёмкая, потому что стимулирует изучать математику: геометрию, тригонометрию, линейную алгебру.

Цитата Сообщение от Nidl Посмотреть сообщение
Мне было интересно взглянуть на то что может ваш "маленький движек,
Текст умеет выводить текст на спрайтах, текстуры, Specular Map, Normal Map и т.д. В данный момент работаю над реализаций скелетной анимацией, интерполяцией кватернионов и загрузкой анимаций из Blender из Collada формата. Пишу мультиплеер и кооператив. В основном, то что в книге написано: Build your own 2D Game Engine. Я только половины книги изучил. Свой движок пишу в двух версиях: TypeScript (WebGL 1.0) и C#/OpenTK (OpenGL 3.1). Ещё очень хорошая книга, где описан процесс написание движка на OpenGL через TDD (unit-тестирование): C# Game Programming: For Serious Game Creation. Можем кому-то из читающих сообщение пригодится. Книги супер! Показывает архитектуру любых 2D/3D приложений на OpenGL, не только игр. Хоть польза будет.

Игра в 3D: клик. Змейка: клик.
Понг: клик
Голова обезьяны (мышкой: поворот и zoom): клик



Цитата Сообщение от Nidl Посмотреть сообщение
просто чтобы за чашкой чая задуматься и спросить в пустоту а зачем ?
Это невероятно интересно. Я обожаю геометрию и линейную алгебру. Сейчас добавляю в свой движок мультиплеер. Это очень интересно для меня. Это позволило мне объединить мою школьную любовь к геометрии и университетскую любовь к линейной алгебре. Люблю изучать математику на английском. Нравится общаться с людьми, которые разделяют мои интересы к программированию интерактивной 3D графики и 2D/3D играм.

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

Цитата Сообщение от Nidl Посмотреть сообщение
я до сих пор мило офигиваю как игры в аналоги которых я играл 20 лет назад на дровах сейчас в новой интерпретации лагают на планшете с 4 ядрами 4 гигами оперативки и прочими бла бла бла
Выход из этого есть. Не тратьте деньги на чужие игры. Сами пишите свои аналоги на чистом OpenGL ES. Будете получать невероятный кайф и деньги. Старайтесь меньше нервничать, меньше тратьте время на споры, занимайтесь любимым делом, мотивируйте себя, будьте на позитиве. Жизнь - это очень короткая штука. Лучше тратить её на то, что приносит радость и деньги.
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
07.10.2019, 00:20
8Observer8, В архиве немного видео, предпочитаю только математику, все что в ролике создано исключительно математикой и хитростью ума.

Цитата Сообщение от 8Observer8 Посмотреть сообщение
пишите свои аналоги на чистом OpenGL ES
нет уж лучше вы на нем пишите а я останусь на своем

Мы на разных островах...

Помню игру StarFox Nintendo64, ваш пример вылитый финальный босс из этой игры
Вложения
Тип файла: zip 2019-10-06 23-55-36-145.zip (22.04 Мб, 0 просмотров)
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
07.10.2019, 00:36
Как то так
Никогда не хотелось написать игру "змейка" всегда считал это скучной затеей
Миниатюры
Приложение, симулирующее дождевые капли   Приложение, симулирующее дождевые капли   Приложение, симулирующее дождевые капли  

Изображения
 
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
07.10.2019, 00:44
Имитация вольфенштайн, берем картинку режем ее на полоски которые масштабируем создавая иллюзию перспективы в коридоре, 2д арка все просто лвл это огромный массив и один таймер который печатает объекты по карте массива в заданное время, о здесь много вкуснятины, свободный 2д мир с простым на уровне муравья ИИ у врагов, динамическим светом, режимом боевки РПГ, просто псевдо 3д, на деле это куча треугольников которые масштабируем и вращаем меняя уровень, теорема пифагора во всей красе. Так что вы там про математику на английском говорили ?)
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,966
Записей в блоге: 225
07.10.2019, 15:59
Цитата Сообщение от Nidl Посмотреть сообщение
Так что вы там про математику на английском говорили ?
Дело в том, что на русском нет книг для начинающих в компьютерной графике по математики, чтобы там так максимально просто объяснялось, как в книгах на английском. Без знаний базовых вещей из линейной алгебры в компьютерной графике делать нечего. А вот на английском отличных книг по математике в компьютерной графике для начинающих достаточно много:
  • 2004 - 04 - Math and Physics for Game Programmers - Wendy Stahler - 504 pages: Amazon
  • 2011 - 06 - Mathematics for 3D Game Programming and Computer Graphics - 3rd Edition - Eric Lengyel - 624 pages: Amazon Code: http://mathfor3dgameprogramming.com/
  • 2011 - 11 - 3D Math Primer for Graphics and Game Development - F. Dunn, I. Parberry - 846 pages: Amazon
  • 2015 - 08 - Essential Mathematics for Games and Interactive Applications - 3rd Edition - James M. Van Verth, Lars M. Bishop - 624 pages: Amazon Code: https://github.com/jvanverth/essentialmath
  • 2013 - 12 - Mathematics for Computer Graphics - 4th Edition - John Vince - 412 pages: Amazon

Возможно появится что-то ещё в этом списке. Я выложил список на GitHub Pages здесь: Настоятельно рекомендую приобрести все эти книги на Amazon в электронном виде для читалки. Бывает часто такое, что в одной книге какой-то момент объясняется лучше, чем в другой, а другой момент объясняется в другой лучше, чем в этой. Но это только в том случае, если вы хотите связать свою жизнь с компьютерной графикой и линейной алгеброй. Если сомневаетесь, то лучше и не начинать, не трать время, тем более, что мне не нужны конкуренты Я сам хочу зарабатывать на создании интерактивных 3D приложений, а вы будете моих заказчиков переманивать - не надо так делать! Математика в компьютерной графике очень сложная (нет!), даже не пробуйте

Добавлено через 18 минут
Забыл добавить ссылку на GitHub Pages с книгами: https://8observer8.github.io/books/

Кстати, рекомендую этот ресурс (GitHub Pages). Создаёте репозитарий с вашим именем и .github.io на конце. Получаете себе статический веб сайт. Можно выкладывать свои примеры, ссылки на книги, и делиться ими с друзьями. Всё под рукой. Хранить архивы с примерами можно на DropBox по прямой ссылке. Получить прямую ссылку на файл в DropBox очень просто.

Допустим, есть обычная расшаренная ссылка:
https://www.dropbox.com/s/uhfx... n.png?dl=0
Редактируем её, делая прямой (то есть скачивание начнётся после клика по ней, её можно расположить на GitHub Pages)
https://dl.dropboxusercontent.... gatron.png
1
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
07.10.2019, 16:28
Вы даже не смотрели видео мои работ, если учесть что вы шагнули только на уровень создания игры "змейка" то до моего уровня вам еще лет 15 надо, я занимаюсь изучением и разработкой игр на 2д графики больше 15 лет с полной самоотдачей, начинал на ассемлере потом на бейсике потом на laser бейсике потом 10 лет на AS2 потом перешел на java.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Дело в том, что на русском нет книг для начинающих в компьютерной графике по математики
а что простых справочников по геометрии уже не достаточно ? У меня их 5 на полке стоит и как то хватает.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Если сомневаетесь, то лучше и не начинать, не трать время
я уже давно в теме еще когда мне купили Spectrum погуглите если не знаете этого слова
Цитата Сообщение от 8Observer8 Посмотреть сообщение
что мне не нужны конкуренты
мне не интересна 3Д графика, я люблю 2Д красивые рисунки ( не говно аля масяня векторный арт), яркие 2Д игры с хорошей анимацией.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Математика в компьютерной графике очень сложная (нет!), даже не пробуйте
математиках в игра не сложна, не усложняйте, просто смотреть на многие вещи надо не под прямым углом.

Очень надеюсь что всетаки я смогу увидеть "Марио" из под вашего пера ну скажем хотя бы лет через 5, немного грусно что это не так видя что ваш уровень топчется на игре "змейка" и жалкой примитивной стрелялки своять которую можно за 2 часа, причем 1,5 часа уйдет на рисование арта
а еще я на машинке шить умею
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
07.10.2019, 16:28
Nidl, знаете, вам бы самому легче стало, если бы не вели себя со всеми так высокомерно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.10.2019, 16:28
Помогаю со студенческими работами здесь

Падение капли
Народ можете помочь с решением графической задачи в С++, нужно написать программу, моделирующую падение капли. Буду очень благодарен.

Потенциал капли
Потенциал капли (шара) ртути равняется 200В. Эта капля распадается на 1000 одинаковых маленьких капелек. Найти потенциал одной маленькой...

Замерзание капли воды
Здравствуйте! Есть следующие формулы: $$\frac{\partial T}{\partial t} = a \frac{\partial T}{\partial p} + a \frac{\partial ^2T}{\partial...

Найи объем капли
На двух одинаковых капельках масла находится по 100 лишних электронов. Сила электростатического отталкивания уравновешивается силой их...

Испарение капли воды в газе
Добрый день Тут попалась статья одна Козырев А.В., Ситников А.Г. &quot;Испарение сферической капли в газе среднего давления&quot;, хотел...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка 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 - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru