Форум программистов, компьютерный форум, киберфорум
Goongala
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Первая попытка написания более-менее сложной игры

Запись от Goongala размещена 28.09.2019 в 18:01
Показов 8262 Комментарии 1

Кароч, GitHub проводит ивент под названием Game Off 2019. Если вкратце, то будет дана какая-то тема и за месяц надо склепать игру на эту самую тему. Вроде всё легко и просто, но нет. Дело в том, что я начал изучать программирование не с целью создания игр. По правде говоря, цели у меня вообще не было, просто так случилось, что я начал и теперь не могу остановиться. Как можно догадаться, из-за того, что у меня не было цели, я особо не задумывался насчёт языка, который буду изучать, поэтому выбрал то, что первое пришло на ум — Java. Не скажу, что я об этом жалею, Java — отличный язык программирования и я получаю удовольствие от его изучения, но всё же я вынужден признать тот факт, что для разработки игр он не очень подходит. Вот тут и вырисовывается основная проблема: у меня достаточно маленький опыт программирования вообще, притом совершенно никакого опыта программирования игр, вдобавок я собираюсь писать игру на Java. Достаточно интересно получается. Разумеется, если бы я начал писать игру с нуля, то не закончил бы и за полгода, но ведь можно использовать готовый движок! Конечно, C# программистам тут повезло больше — у них есть Unity, но и разработчиков java судьба не обделила. На странице этого мероприятия предлагается использовать некий игровой движок libGDX. Понятия не имею, что это за движок такой. Документация у него бедненькая, официальных туториалов нет, да и каких-нибудь более-менее достойных игр я на нём не нашёл (впрочем, не скажу, что я очень старался искать). Но в принципе, всё это не важно. Главное, что этот движок есть и что на нём кто-то успешно смог написать хоть какие-то игры. Теперь самое классное. Я собираюсь весь октябрь пыхтеть над этим зверем, изучать гайды от комьюнити и молиться небесам, чтобы они даровали мне знание и удачу, и если я хоть немного в этом преуспею, то весь ноябрь я буду работать над игрой. Я осознаю, что из этого вряд ли что-то выйдет, ибо игра — это не только код. Нужны будут звуки, картинки, а у меня ни харизматичного голоса, ни таланта в рисовании. Зачем я за это берусь? Просто в качестве вызова. Если не получится, то я ничего особо не потеряю, разве что время. Но если я действительно смогу создать что-то хоть отдалённо напоминающее интересную игру, можно считать, что я победил. В смысле, победил судьбу, победил в жизни, вообще во всём победил. Конечно, может статься, что за октябрь я потеряю всякую мотивацию что-либо делать и просто забью на всё, тогда этот пост навсегда запечатлеет слабость моей воли и позор будет преследовать меня до конца жизни. Если же я проявлю стойкость и не сдамся, то, возможно, буду выкладывать какие-нибудь промежуточные результаты. Ну и тип пусть тут какой-нибудь код будет, а то чё я как не праграмест

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
package me.distcalc;
 
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class DistanceCalculator {
    private static final String REQUEST = "https://geocode-maps.yandex.ru/1.x/?geocode=%s&format=xml&lang=en_US";
    private static final int EARTH_RADIUS = 6371000;
 
    private static boolean talks;
 
    public static double between(String first, String second, boolean talk) throws IOException, XMLStreamException {
        talks = talk;
        double[] firstCoords = getData(first);
        double[] secondCoords = getData(second);
 
        say("Calculating distance...\n\n");
        double phi_1 = Math.toRadians(firstCoords[1]);
        double phi_2 = Math.toRadians(secondCoords[1]);
        double d_phi = Math.toRadians(secondCoords[1] - firstCoords[1]);
        double d_lam = Math.toRadians(secondCoords[0] - firstCoords[0]);
 
        double a = Math.pow(Math.sin(d_phi / 2.0), 2) + Math.cos(phi_1) * Math.cos(phi_2)
                * Math.pow(Math.sin(d_lam / 2.0), 2);                       // Haversine
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));          // formula
        double d = EARTH_RADIUS * c;                                        // distance
 
        return d;
    }
 
    public static double between(String first, String second) throws IOException, XMLStreamException {
        return between(first, second, false);
    }
 
    private static double[] getData(String input) throws IOException, XMLStreamException {
        HttpURLConnection connection = getConnection(validateParameters(input));
        connection.connect();
        say("Sending request (" + input + ")...\n");
 
        XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(connection.getInputStream());
 
        double[] coords = new double[2];
 
        say("Reading response...\n");
        boolean done = false;
        while (parser.hasNext() && !done) {
            int event = parser.next();
            if (event == XMLStreamConstants.START_ELEMENT) {
                String localName = parser.getLocalName();
                if (localName.equals("found")) {
                    parser.next();
                    int found = Integer.parseInt(parser.getText());
                    if (found <= 0) {
                        return null;
                    }
                } else if (localName.equals("Point")) {
                    do {
                        event = parser.next();
                        if (event == XMLStreamConstants.START_ELEMENT) {
                            localName = parser.getLocalName();
                        }
                    } while (parser.hasNext() && !localName.equals("pos"));
                    parser.next();
                    String[] coordsTmp = parser.getText().split("\\s+");
                    coords[0] = Double.parseDouble(coordsTmp[0]); // longitude
                    coords[1] = Double.parseDouble(coordsTmp[1]); // latitude
                    done = true;
                }
            }
        }
 
        return coords;
    }
 
    private static String validateParameters(String s) {
        if ((s.startsWith("\"") && s.endsWith("\"")) || (s.startsWith("'") && s.endsWith("'"))) {
            s = s.substring(1, s.length() - 1);
        }
        s = String.join("+", s.split("\\s+"));
        return s;
    }
 
    private static HttpURLConnection getConnection(String parameters) throws IOException {
        HttpURLConnection connection = (HttpURLConnection) new URL(String.format(REQUEST, parameters)).openConnection();
        connection.setInstanceFollowRedirects(true);
        return connection;
    }
 
    private static void say(String s) {
        if (talks) {
            System.out.print(s);
        }
    }
}
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для Goongala
    В общем, игру я так и не написал, но время потратил не зря. Месяц я таки изучал этот игровой движок и узнал очень много нового о способах загрузки данных, грамотного использования ресурсов, отрисовки графики, программировании физики и прочего. В целом, опыт очень полезный, да и я написал много промежуточного кода, но никакого конечного продукта так и не сделал, ибо как-то влом было
    Запись от Goongala размещена 19.11.2019 в 19:01 Goongala вне форума
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru