Skip to content
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

Merged
merged 21 commits into from
May 9, 2021
Merged

Add Items and Inventory system #28

merged 21 commits into from
May 9, 2021

Conversation

gosha-krovsh
Copy link
Owner

Fixes #25, Fixes #7

  • Добавлены инвентари специальным объектам и герою.
  • Добавлены ItemBar и возможность передачи вещей от героя к объектам и обратно.

Персонажи и специальные объекты теперь могут хранить в себе Item-ы
Добавлен ItemBar для отображения предметов и героя и возможность передачи вещами между объектами
Copy link
Owner Author

@gosha-krovsh gosha-krovsh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нашел баг анимации передачи элементов, в процессе фикса.

Copy link
Collaborator

@ArseniyTy ArseniyTy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я, честно говоря, сильно устал это ревьюить. Под конец вообще запутался из-за сложных связей. 500 строк это слишком много. Надо разбивать такие задачи на более мелкие PR.

Resources/resources.qrc Outdated Show resolved Hide resolved
Styles/styles.qss Outdated Show resolved Hide resolved
View/view.cpp Outdated Show resolved Hide resolved
View/view.cpp Outdated Show resolved Hide resolved
View/view.cpp Outdated Show resolved Hide resolved
GameObject/hero.h Outdated Show resolved Hide resolved
View/item_bar.cpp Outdated Show resolved Hide resolved
Controller/controller.cpp Outdated Show resolved Hide resolved
Controller/controller.cpp Outdated Show resolved Hide resolved
View/view.cpp Outdated
Comment on lines 202 to 205
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);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я думал id бывают не только двух типов. Но если так, то почему это не enum?

Copy link
Owner Author

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'.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Этот enum же по сути можно прописать в item_bar

Copy link
Owner Author

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, потому что будет циклическое включение.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тогда создай enum отдельным файлом и подключай и туда, и туда. Нынешняя система максимально запутывает

gosha-krovsh and others added 7 commits April 27, 2021 20:27
Добавлен класс 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
Copy link
Collaborator

@HydeHunter2 HydeHunter2 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

пока что ревью на саму механику, а не по коду:

есть бага, что не закрывается менюшка с предметами из сундука, когда ты от него отходишь

Copy link
Collaborator

@ArseniyTy ArseniyTy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Прошу также ответить на моё прошлое ревью. Некоторые важные комментарии там остались без внимания!

View/bar_pack.cpp Outdated Show resolved Hide resolved
Controller/abstract_controller.h Outdated Show resolved Hide resolved
View/view.cpp Show resolved Hide resolved
View/view.cpp Outdated Show resolved Hide resolved
View/item_bar.cpp Outdated Show resolved Hide resolved
GameObject/object.cpp Outdated Show resolved Hide resolved
GameObject/storage.h Show resolved Hide resolved
Controller/controller.h Outdated Show resolved Hide resolved

class Object {
public:
enum class Type {
kNone,
kFloor,
kWall
kWall,
kStorable
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Странно получается, что свойство "хранение вещей" обрабатывается как определённый тип объекта. Т.е. у нас получается, что сундук и герой это объекты одного типа. Мб лучше создать метод IsStorable, который возвращает тру, если хранилище не nullptr. Конечно тогда не получится заюзать метод для поиска объекта в том виде, что он есть сейчас. Но можно тогда его вообще обобщить: передавать предикат, по которому ищется объект

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ох, не хочется так этот метод пределывать. У нас нет 'типа' объекта, который может хранить вещи, это правда, но это так чтобы не было проблем с dynamic_cast и множественным наследование.

Но так оставлять нельзя, так как если мы захотим, чтобы что-то имело тип и при этом хранило вещи то придется хранить два type(??). Это странно, предлагаю ввести просто еще enum характеристик и передавать в поиск еще и его. Тогда можно искать либо по типо, либо по хар-кам, либо по всему сразу.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Обобщить метод на искание по предикату делается очень легко в любом случае. Что касается характеристик: мне не очень понятно, какие ещё характеристики могут быть? Если их 1-2 штуки, то мб нет смысла вводить дополнительные сложности в архитектуру

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделал метод с предикатом

View/view.cpp Outdated Show resolved Hide resolved
auto block = map.GetBlock(x, y, hero.GetRoundedZ());

if (block && predicate(block)) {
double distance_squared = (hero_coords.x - x) * (hero_coords.x - x) +
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это потом надо будет поправить. Уже добавили этот функционал

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Главное не забудьте. Оставьте TODO

Copy link
Owner Author

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
Comment on lines 14 to 20
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);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Предлагаю идею с вынесением хотя бы части рандомных констант в constants::

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мне эта идея кажется не всегда оправданной, но я вынес и оно впринципе нормально.

controller_(controller),
storage_(storage),
layout_(new QHBoxLayout()) {
for (int i = 0; i < constants::kMaxElementsInItemBar; i++) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

++i

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А зачем?)


int size = std::min(static_cast<int>(storage_->GetItems().size()),
constants::kMaxElementsInItemBar);
for (int i = 0; i < size; i++) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

++i

}

void ItemBar::ClearIconsFromIndex(int index) {
for (int i = index; i < constants::kMaxElementsInItemBar; i++) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

++i


void ItemBar::SetButtonsSize(int width, int max_height) {
int size = std::min(width / constants::kMaxElementsInItemBar, max_height);
int space_between_buttons = size / 25;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 про рандомные константы. Глянь сам какие там удобнее вынести будет

size -= space_between_buttons;
for (auto& button : buttons_) {
button->setFixedSize(size, size);
button->setIconSize(button->size() * 0.8);
Copy link
Collaborator

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;
}
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ещё бы кнопочку, чтобы быстро добавить на первую свободную позицию в инвентарь

Copy link
Owner Author

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);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не ну это жесть. Хоть пробел вставь, а лучше, имхо, {...}

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, тут не по кодстайлу, конечно

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделано

Copy link
Collaborator

@elizabethfeden elizabethfeden left a 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(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

нужно тогда вызывать FindWithType() через этот метод, чтобы не было дублирования кода

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделано

static void DeleteImage();

private:
static std::shared_ptr<QPixmap> chest_image_;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

что за статики -___-
мы разве не решили делать без них и во всех других местах должно быть без статиков?

Copy link
Owner Author

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 {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

хз зачем вообще этот класс, он по сути нужен только чтобы картинку показывать. можно же просто сделать Storage с картинкой, а не плодить лишние классы

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Просто объектами, которые могут что-то хранить бывают Hero и (возможно)Bot. Поэтому я сделал Storage чисто инвентарем, а в качесте блока, который может что-то хранить, выступает Chest

#include "item.h"

Item::Item(int id, const QString& name, const QPixmap& image) :
name_(std::move(name)),
Copy link
Collaborator

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);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, тут не по кодстайлу, конечно


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) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Напиши явное сравнение с nullptr, а то с булом можно попутать.

Copy link
Owner Author

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>();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А чего не списком инициализации?

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Потому что Storage есть в всех объектов, просто у каких-то он nullptr, а у каких-то существует. Тут получается он инициализируется при вызове конструктора Creature.

Comment on lines +10 to +11
hero_bar_(new ItemBar(0, controller, this, hero_storage)),
object_bar_(new ItemBar(1, controller, this, object_storage)) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Блин, ну вот это точно выглядит, что нужно перейти на умные указатели.

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Просто в Qt части мы привыкли использовать сырые указатели, поэтому так и написано. Может поэтому можно так оставить?

controller_(controller),
storage_(storage),
layout_(new QHBoxLayout()) {
for (int i = 0; i < constants::kMaxElementsInItemBar; i++) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А зачем?)

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();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QString не кинет исключение, если там выход за пределы?

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А к чему это?

}

void ItemBar::UseItem(int) {
// todo::make items usable
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO принято капсом писать, вроде бы. @elizabethfeden не помнишь?

}

void ItemBar::resizeEvent(QResizeEvent* event) {
layout_->setSpacing(static_cast<int>(0.01 * width()));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кажется, что тут можно сделать width() / 100 без каста, и получить ровно тот же результат. Раз эта константа никуда не вынесена, то это скорее всего постоянное изменение.

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделано

CMakeLists.txt Outdated
Comment on lines 23 to 24
View/item_bar.cpp
View/bar_pack.cpp
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Отсортите и тут по алфавиту)

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделано

Object* nearest_storage = FindIfNearestObject([](Object* block) {
return block->IsStorable();
});
if (view_->IsItemDialogOpen() && !nearest_storage) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Также сделайте явную проверку на nullptr

Copy link
Owner Author

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) +
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Главное не забудьте. Оставьте TODO

PGSStas
PGSStas previously approved these changes May 8, 2021
ArseniyTy
ArseniyTy previously approved these changes May 8, 2021
#	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
@gosha-krovsh gosha-krovsh dismissed stale reviews from ArseniyTy and PGSStas via 0c36663 May 9, 2021 19:12
@gosha-krovsh gosha-krovsh merged commit a924d24 into master May 9, 2021
@gosha-krovsh gosha-krovsh deleted the add-items branch May 9, 2021 21:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add blocks which can store items Inventory system
6 participants