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

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

Запись от Goongala размещена 28.09.2019 в 18:01
Обновил(-а) Goongala 19.11.2019 в 19:01

Кароч, 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);
        }
    }
}
Размещено в Без категории
Показов 7804 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для Goongala
    В общем, игру я так и не написал, но время потратил не зря. Месяц я таки изучал этот игровой движок и узнал очень много нового о способах загрузки данных, грамотного использования ресурсов, отрисовки графики, программировании физики и прочего. В целом, опыт очень полезный, да и я написал много промежуточного кода, но никакого конечного продукта так и не сделал, ибо как-то влом было
    Запись от Goongala размещена 19.11.2019 в 19:01 Goongala вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru