18.10.2015 / 11:47 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| DominaN, сделай JavaDocs, с примерами и детальное описание всего, тогда может кто-то и заинтересуется, а так код движка при написании игры интересует в последнюю очередь
|
18.10.2015 / 15:05 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Naik, сначала нужно сам движок допилить, потом SDK, а потом и доки можно пилить. Толку от доков, если у меня архитектура все время улучшается
|
16.12.2015 / 01:38 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Исправил кучу багов, которые выявил совершенно случайно - исправил работу кастомных пулов (а точнее метод pop и remove), исправил баги GUI и консоли (теперь консоль практически независима от остального GUI, что позволяет использовать ее для отладки практически везде). Сейчас активно прорабатываю GUI, чтобы им было комфортно пользоваться. Как только доделаю бэкенд, займусь загрузкой GUI из файлов.
|
18.12.2015 / 16:46 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Важный вопрос по поводу GUI - как бы вам было удобнее, чтобы все доступные GUI объекты имели дефолтное поведение, или же абстрактное ядро GUI + библиотека дефолтных элементов? Я склоняюсь ко второму варианту, ибо если в ядре прописывать еще и дефолтный функционал, то в использовании оно немного удобнее, но в коде получается помойка.
|
18.12.2015 / 16:54 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Для наглядного примера - так можно сделать простенькое меню на данный момент: Открыть спойлер Закрыть спойлер package aftergames.demo;
import aftergames.engine.EngineAPI;
import aftergames.engine.EngineRuntime;
import aftergames.engine.render.Color;
import aftergames.engine.ui.UI;
import aftergames.engine.ui.UIButton;
import aftergames.engine.ui.UIImage;
import aftergames.engine.utils.ResourceUtils;
/**
*
* @author KiQDominaN
*/
public class MainMenu extends UI {
private UIButton continue_game;
private UIButton new_game;
private UIButton settings;
private UIButton exit;
public void init() {
setBackground(new UIImage(ResourceUtils.load_image("launcher/cloth_background.png")));
fitBackground(false);
setSize(EngineRuntime.screen_width, EngineRuntime.screen_height);
init_buttons();
}
private void init_buttons() {
continue_game = new UIButton() {
public void init() {
super.init();
setLabel("CONTINUE");
setLabelColor(Color.black.mix(Color.white));
}
public void onFocus() {
setLabelColor(Color.white);
}
public void onFocusLost() {
setLabelColor(Color.black.mix(Color.white));
}
public void onClick() {
EngineAPI.hideGUI();
}
};
continue_game.init();
continue_game.setPosition(width / 2 - continue_game.getWidth() / 2, height / 2 - continue_game.getHeight() - 4);
new_game = new UIButton() {
public void init() {
super.init();
setLabel("NEW GAME");
setLabelColor(Color.black.mix(Color.white));
}
public void onFocus() {
setLabelColor(Color.white);
}
public void onFocusLost() {
setLabelColor(Color.black.mix(Color.white));
}
public void onClick() {
startGame();
}
};
new_game.init();
new_game.setPosition(width / 2 - new_game.getWidth() / 2, continue_game.getY() + continue_game.getHeight() + 4);
settings = new UIButton() {
public void init() {
super.init();
setLabel("CONFIGURATION");
setLabelColor(Color.black.mix(Color.white));
}
public void onFocus() {
setLabelColor(Color.white);
}
public void onFocusLost() {
setLabelColor(Color.black.mix(Color.white));
}
public void onClick() {
}
};
settings.init();
settings.setPosition(width / 2 - settings.getWidth() / 2, new_game.getY() + new_game.getHeight() + 4);
exit = new UIButton() {
public void init() {
super.init();
setLabel("EXIT");
setLabelColor(Color.black.mix(Color.white));
}
public void onFocus() {
setLabelColor(Color.white);
}
public void onFocusLost() {
setLabelColor(Color.black.mix(Color.white));
}
public void onClick() {
EngineAPI.stopEngine();
}
};
exit.init();
exit.setPosition(width / 2 - exit.getWidth() / 2, settings.getY() + settings.getHeight() + 4);
addElement(continue_game);
addElement(new_game);
addElement(settings);
addElement(exit);
}
public void startGame() {
//код запуска игры
}
}
и результат Изменено DominaN (18.12 / 20:22) (всего 1 раз) |
18.12.2015 / 16:58 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| я исхожу из того, что если ядро не абстрактно, а представляет собой определенный дефолтный функционал, то появляется обязательный вызов методов суперкласса, например тот же super.init(), что конечному пользователю совсем не очевидно и в итоге может сбить с толку, даже если про это будет в документации - ее все равно по началу никто не читает, именно поэтому я хочу сделать код максимально очевидным
|
18.12.2015 / 20:17 | |
Oak Пользователь Сейчас: Offline
Имя: Коля Откуда: Москва Регистрация: 02.06.2010
| DominaN, не понятна разница. Не понятно к какому поведению приведен пример — уточни пожалуйста.
__________________
Эль Презеденте |
18.12.2015 / 21:46 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Цитата DominaN: я исхожу из того, что если ядро не абстрактно, а представляет собой определенный дефолтный функционал, то появляется обязательный вызов методов суперкласса, например тот же super.init(), что конечномудля этого существует @CallSuper в родительском методе |
18.12.2015 / 22:17 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Naik, вот, типичный пример, когда аннотациями замазывают кривую архитектуру А вы удивляетесь, че это они мне не нравятся |
18.12.2015 / 22:20 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| DominaN, Почему кривую? Бывает нужно позволить переопределить метод, но «не потерять» функционал в нем, т.е. просто напоминалка что нужно вызвать super.
В андроиде это не юзается, а зря, все методы жизненного цикла Activity неявно требуют вызов super
Изменено Naik (18.12 / 22:22) (всего 1 раз) |