Кароч, 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);
}
}
} |
|
|