-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Items and Inventory system #28
Conversation
Персонажи и специальные объекты теперь могут хранить в себе Item-ы Добавлен ItemBar для отображения предметов и героя и возможность передачи вещами между объектами
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Нашел баг анимации передачи элементов, в процессе фикса.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я, честно говоря, сильно устал это ревьюить. Под конец вообще запутался из-за сложных связей. 500 строк это слишком много. Надо разбивать такие задачи на более мелкие PR.
View/view.cpp
Outdated
case 0: return std::make_pair(hero_item_bar_, object_item_bar_); | ||
case 1: return std::make_pair(object_item_bar_, hero_item_bar_); | ||
default: | ||
return std::make_pair(nullptr, nullptr); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я думал id
бывают не только двух типов. Но если так, то почему это не enum
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Цилическое включение вырисовывается, пока оставил int.
Нужно прописать тип 'enum' в 'AbstractController' а в него нельзя include-ать ничего из 'View'.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Этот enum
же по сути можно прописать в item_bar
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Так я так и прописывал. ItemBar
incudes AbstractController
, а AbstractController
теперь нужно тоже знать этот enum
, но нельзя include-уть 'ItemBar' в AbstractController
, потому что будет циклическое включение.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тогда создай enum отдельным файлом и подключай и туда, и туда. Нынешняя система максимально запутывает
Добавлен класс BarPack, который позволяет сделать правильное поведение при изменении размеров окна.
# CMakeLists.txt # Controller/controller.cpp # Controller/controller.h # GameObject/hero.h # Model/constants.h # Model/model.cpp # Model/model.h # Resources/resources.qrc # View/view.cpp # View/view.h
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
пока что ревью на саму механику, а не по коду:
есть бага, что не закрывается менюшка с предметами из сундука, когда ты от него отходишь
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Прошу также ответить на моё прошлое ревью. Некоторые важные комментарии там остались без внимания!
GameObject/object.h
Outdated
|
||
class Object { | ||
public: | ||
enum class Type { | ||
kNone, | ||
kFloor, | ||
kWall | ||
kWall, | ||
kStorable |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Странно получается, что свойство "хранение вещей" обрабатывается как определённый тип объекта. Т.е. у нас получается, что сундук и герой это объекты одного типа. Мб лучше создать метод IsStorable
, который возвращает тру, если хранилище не nullptr. Конечно тогда не получится заюзать метод для поиска объекта в том виде, что он есть сейчас. Но можно тогда его вообще обобщить: передавать предикат, по которому ищется объект
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ох, не хочется так этот метод пределывать. У нас нет 'типа' объекта, который может хранить вещи, это правда, но это так чтобы не было проблем с dynamic_cast и множественным наследование.
Но так оставлять нельзя, так как если мы захотим, чтобы что-то имело тип и при этом хранило вещи то придется хранить два type(??). Это странно, предлагаю ввести просто еще enum характеристик и передавать в поиск еще и его. Тогда можно искать либо по типо, либо по хар-кам, либо по всему сразу.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Обобщить метод на искание по предикату делается очень легко в любом случае. Что касается характеристик: мне не очень понятно, какие ещё характеристики могут быть? Если их 1-2 штуки, то мб нет смысла вводить дополнительные сложности в архитектуру
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Сделал метод с предикатом
auto block = map.GetBlock(x, y, hero.GetRoundedZ()); | ||
|
||
if (block && predicate(block)) { | ||
double distance_squared = (hero_coords.x - x) * (hero_coords.x - x) + |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Это потом надо будет поправить. Уже добавили этот функционал
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Главное не забудьте. Оставьте TODO
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Оставил todo
View/bar_pack.h
Outdated
QWidget* parent = nullptr, | ||
const std::shared_ptr<Storage>& hero_storage = nullptr, | ||
const std::shared_ptr<Storage>& object_storage = nullptr, | ||
int center_x = constants::kWindowWidth / 2, | ||
int y = 3 * constants::kWindowHeight / 5, | ||
int width = constants::kWindowWidth / 2, | ||
int height = 2 * constants::kWindowHeight / 5); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предлагаю идею с вынесением хотя бы части рандомных констант в constants::
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Мне эта идея кажется не всегда оправданной, но я вынес и оно впринципе нормально.
View/item_bar.cpp
Outdated
controller_(controller), | ||
storage_(storage), | ||
layout_(new QHBoxLayout()) { | ||
for (int i = 0; i < constants::kMaxElementsInItemBar; i++) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
++i
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А зачем?)
View/item_bar.cpp
Outdated
|
||
int size = std::min(static_cast<int>(storage_->GetItems().size()), | ||
constants::kMaxElementsInItemBar); | ||
for (int i = 0; i < size; i++) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
++i
View/item_bar.cpp
Outdated
} | ||
|
||
void ItemBar::ClearIconsFromIndex(int index) { | ||
for (int i = index; i < constants::kMaxElementsInItemBar; i++) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
++i
View/item_bar.cpp
Outdated
|
||
void ItemBar::SetButtonsSize(int width, int max_height) { | ||
int size = std::min(width / constants::kMaxElementsInItemBar, max_height); | ||
int space_between_buttons = size / 25; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1 про рандомные константы. Глянь сам какие там удобнее вынести будет
View/item_bar.cpp
Outdated
size -= space_between_buttons; | ||
for (auto& button : buttons_) { | ||
button->setFixedSize(size, size); | ||
button->setIconSize(button->size() * 0.8); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+2 random constants
case Qt::Key_7 : { | ||
item_bar_pack_->GetHeroBar()->UseItem(event->key() - Qt::Key_1); | ||
break; | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ещё бы кнопочку, чтобы быстро добавить на первую свободную позицию в инвентарь
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я не очень понял о чем ты
View/view.cpp
Outdated
item_bar_pack_->GetObjectBar()); | ||
case 1: return std::make_pair(item_bar_pack_->GetObjectBar(), | ||
item_bar_pack_->GetHeroBar()); | ||
default:return std::make_pair(nullptr, nullptr); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
не ну это жесть. Хоть пробел вставь, а лучше, имхо, {...}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
да, тут не по кодстайлу, конечно
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Сделано
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
статики плохо, класс сундука плохо, все остальное ок
опять-таки только комментирую, чтобы сами разбирались и процесс шел быстрее
@@ -133,6 +140,38 @@ Object* Controller::FindNearestObjectWithType(Object::Type type) { | |||
return nearest_block; | |||
} | |||
|
|||
Object* Controller::FindIfNearestObject( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
нужно тогда вызывать FindWithType() через этот метод, чтобы не было дублирования кода
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Сделано
GameObject/chest.h
Outdated
static void DeleteImage(); | ||
|
||
private: | ||
static std::shared_ptr<QPixmap> chest_image_; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
что за статики -___-
мы разве не решили делать без них и во всех других местах должно быть без статиков?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да да, этот PR просто настолько стар, что та система без static была не слита и я сделал временно так. Забыл пометить что это временный код
#include "object.h" | ||
#include "storage.h" | ||
|
||
class Chest : public Object { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
хз зачем вообще этот класс, он по сути нужен только чтобы картинку показывать. можно же просто сделать Storage с картинкой, а не плодить лишние классы
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Просто объектами, которые могут что-то хранить бывают Hero
и (возможно)Bot
. Поэтому я сделал Storage чисто инвентарем, а в качесте блока, который может что-то хранить, выступает Chest
GameObject/item.cpp
Outdated
#include "item.h" | ||
|
||
Item::Item(int id, const QString& name, const QPixmap& image) : | ||
name_(std::move(name)), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
можно не мувать
View/view.cpp
Outdated
item_bar_pack_->GetObjectBar()); | ||
case 1: return std::make_pair(item_bar_pack_->GetObjectBar(), | ||
item_bar_pack_->GetHeroBar()); | ||
default:return std::make_pair(nullptr, nullptr); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
да, тут не по кодстайлу, конечно
Controller/controller.cpp
Outdated
|
||
void Controller::OnItemPress(int bar_id, int index) { | ||
std::pair<ItemBar*, ItemBar*> source_dest = view_->GetSrcDestBars(bar_id); | ||
if (source_dest.first && source_dest.second) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Напиши явное сравнение с nullptr, а то с булом можно попутать.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Сделано
@@ -1,7 +1,9 @@ | |||
#include "hero.h" | |||
|
|||
Hero::Hero(const Point& coords) | |||
: Creature(coords, "Hero", constants::kHP) {} | |||
: Creature(coords, "Hero", constants::kHP) { | |||
storage_ = std::make_shared<Storage>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А чего не списком инициализации?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Потому что Storage
есть в всех объектов, просто у каких-то он nullptr
, а у каких-то существует. Тут получается он инициализируется при вызове конструктора Creature.
hero_bar_(new ItemBar(0, controller, this, hero_storage)), | ||
object_bar_(new ItemBar(1, controller, this, object_storage)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Блин, ну вот это точно выглядит, что нужно перейти на умные указатели.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Просто в Qt части мы привыкли использовать сырые указатели, поэтому так и написано. Может поэтому можно так оставить?
View/item_bar.cpp
Outdated
controller_(controller), | ||
storage_(storage), | ||
layout_(new QHBoxLayout()) { | ||
for (int i = 0; i < constants::kMaxElementsInItemBar; i++) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А зачем?)
View/item_bar.cpp
Outdated
int size = std::min(static_cast<int>(storage_->GetItems().size()), | ||
constants::kMaxElementsInItemBar); | ||
for (int i = 0; i < size; i++) { | ||
QPixmap image = storage_->GetItems().at(i).GetImage(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
QString не кинет исключение, если там выход за пределы?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А к чему это?
View/item_bar.cpp
Outdated
} | ||
|
||
void ItemBar::UseItem(int) { | ||
// todo::make items usable |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TODO принято капсом писать, вроде бы. @elizabethfeden не помнишь?
View/item_bar.cpp
Outdated
} | ||
|
||
void ItemBar::resizeEvent(QResizeEvent* event) { | ||
layout_->setSpacing(static_cast<int>(0.01 * width())); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Кажется, что тут можно сделать width() / 100 без каста, и получить ровно тот же результат. Раз эта константа никуда не вынесена, то это скорее всего постоянное изменение.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Сделано
CMakeLists.txt
Outdated
View/item_bar.cpp | ||
View/bar_pack.cpp |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отсортите и тут по алфавиту)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Сделано
Controller/controller.cpp
Outdated
Object* nearest_storage = FindIfNearestObject([](Object* block) { | ||
return block->IsStorable(); | ||
}); | ||
if (view_->IsItemDialogOpen() && !nearest_storage) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Также сделайте явную проверку на nullptr
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Сделано
auto block = map.GetBlock(x, y, hero.GetRoundedZ()); | ||
|
||
if (block && predicate(block)) { | ||
double distance_squared = (hero_coords.x - x) * (hero_coords.x - x) + |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Главное не забудьте. Оставьте TODO
# Controller/abstract_controller.h # Controller/controller.cpp # Controller/controller.h # Controller/data_controller.cpp # GameObject/hero.h # Model/constants.h # Resources/resources.qrc # View/view.cpp # View/view.h
Fixes #25, Fixes #7