Конференция "Игры" » Инвентарь для игры [Delphi, Windows]
 
  • Сергей (23.07.15 23:39) [0]
    Здравствуйте уважаемые программисты. У меня вот такой вопрос:
    Как можно сделать инвентарь как в RPG играх, чтобы предметы при покупке в торговца, добавлялись в определенные клеточки инвентаря-рюкзака персонажа. И если одинаковые предметы допустим золото, то в один и тот же слот додавались. Подскажите пожалуйста, заранее спасибо!
    Если не трудно приведите хоть какой-то пример) Очень буду благодарен!
  • brother © (24.07.15 09:48) [1]
    а караваны там грабить можно будет?
  • Сергей (24.07.15 10:25) [2]
    Здорова, тёзка! Код-то показывать будешь?
  • Сергей (24.07.15 18:19) [3]
    Сделал такой вот инвентарь, но можно только по одному предмету хранить в рюкзаке. А как сделать по несколько:
    Вот исходник
  • Сергей (24.07.15 18:21) [4]
    var
     Form1: TForm1;
     predmets: array [0..6] of TBitmap;
     rukzak: array [1..6] of integer;
     shlem: integer;
     yach: integer;

     // Добавляем слоты
     slots: array [1..2] of integer; // 1 слот - головной убор

    implementation

    uses Unit2;

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    var
    i: integer;
    begin

    for i:=0 to 6 do
    begin
    predmets[i]:=tbitmap.Create;
    predmets[i].LoadFromFile('pic/'+inttostr(i)+'.bmp');
    end;

    for i:=1 to 6 do
    begin
    rukzak[i]:=0;

    image1.Canvas.Draw(0,0,predmets[0]);
    image2.Canvas.Draw(0,0,predmets[0]);
    image3.Canvas.Draw(0,0,predmets[0]);
    image4.Canvas.Draw(0,0,predmets[0]);
    image5.Canvas.Draw(0,0,predmets[0]);
    image6.Canvas.Draw(0,0,predmets[0]);
    end;

    for i:=1 to 2 do
    begin
    slots[i]:=0;
    image8.Canvas.Draw(0,0,predmets[0]);
    end;

    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    i: integer;
    begin

    if (rukzak[1]=0) then
    begin
    rukzak[1]:=shlem;
    image1.Canvas.Draw(0,0,predmets[shlem]);
    end
    else

    if (rukzak[2]=0) then
    begin
    rukzak[2]:=shlem;
    image2.Canvas.Draw(0,0,predmets[shlem]);
    end
    else

    if (rukzak[3]=0) then
    begin
    rukzak[3]:=shlem;
    image3.Canvas.Draw(0,0,predmets[shlem]);
    end
    else

    if (rukzak[4]=0) then
    begin
    rukzak[4]:=shlem;
    image4.Canvas.Draw(0,0,predmets[shlem]);
    end
    else

    if (rukzak[5]=0) then
    begin
    rukzak[5]:=shlem;
    image5.Canvas.Draw(0,0,predmets[shlem]);
    end
    else

    if (rukzak[6]=0) then
    begin
    rukzak[6]:=shlem;
    image6.Canvas.Draw(0,0,predmets[shlem]);
    end
    else

    for i:=1 to 1 do
    if rukzak[i]>0 then
    showmessage ('Рюкзак заполнен!');

    if combobox1.ItemIndex=-1 then
    showmessage ('Нечего покупать!');

    end;

    procedure TForm1.Image2Click(Sender: TObject);
    begin

    if rukzak[2]>0 then
    begin
    yach:=2;
    form2.ShowModal;
    end
    else
    begin
    yach:=0;
    showmessage ('Слот 2 пуст!');
    end;

    end;

    procedure TForm1.Image3Click(Sender: TObject);
    begin

    if rukzak[3]>0 then
    begin
    yach:=3;
    form2.ShowModal;
    end
    else
    begin
    yach:=0;
    showmessage ('Слот 3 пуст!');
    end;

    end;

    procedure TForm1.Image4Click(Sender: TObject);
    begin

    if rukzak[4]>0 then
    begin
    yach:=4;
    form2.ShowModal;
    end
    else
    begin
    yach:=0;
    showmessage ('Слот 4 пуст!');
    end;

    end;

    procedure TForm1.Image5Click(Sender: TObject);
    begin

    if rukzak[5]>0 then
    begin
    yach:=5;
    form2.ShowModal;
    end
    else
    begin
    yach:=0;
    showmessage ('Слот 5 пуст!');
    end;

    end;

    procedure TForm1.Image6Click(Sender: TObject);
    begin

    if rukzak[6]>0 then
    begin
    yach:=6;
    form2.ShowModal;
    end
    else
    begin
    yach:=0;
    showmessage ('Слот 6 пуст!');
    end;

    end;

    procedure TForm1.ComboBox1Change(Sender: TObject);
    var
    i: integer;
    begin
    i:=combobox1.itemIndex;

    if i=0 then
    begin
    shlem:=1;
    image7.Canvas.Draw(0,0,predmets[shlem]);
    end;

    if i=1 then
    begin
    shlem:=2;
    image7.Canvas.Draw(0,0,predmets[shlem]);
    end;

    if i=2 then
    begin
    shlem:=3;
    image7.Canvas.Draw(0,0,predmets[shlem]);
    end;

    if i=3 then
    begin
    shlem:=4;
    image7.Canvas.Draw(0,0,predmets[shlem]);
    end;

    if i=4 then
    begin
    shlem:=5;
    image7.Canvas.Draw(0,0,predmets[shlem]);
    end;

    if i=5 then
    begin
    shlem:=6;
    image7.Canvas.Draw(0,0,predmets[shlem]);
    end;

    end;

    procedure TForm1.Image1Click(Sender: TObject);
    begin

    if rukzak[1]>0 then
    begin
    yach:=1;
    form2.showmodal;
    end
    else
    begin
    yach:=0;
    showmessage ('Слот 1 пуст!');
    end;

    end;

    procedure TForm1.Image8Click(Sender: TObject);
    var
    i: integer;
    begin

    if (slots[1]>0) and (rukzak[1]=0) then
    begin
    rukzak[1]:=slots[1];
    image1.Canvas.Draw(0,0,predmets[slots[1]]);

    slots[1]:=0;
    image8.Canvas.Draw(0,0,predmets[0]);
    image8.Hint:='';
    end
    else

    if (slots[1]>0) and (rukzak[2]=0) then
    begin
    rukzak[2]:=slots[1];
    image2.Canvas.Draw(0,0,predmets[slots[1]]);

    slots[1]:=0;
    image8.Canvas.Draw(0,0,predmets[0]);
    image8.Hint:='';
    end
    else

    if (slots[1]>0) and (rukzak[3]=0) then
    begin
    rukzak[3]:=slots[1];
    image3.Canvas.Draw(0,0,predmets[slots[1]]);

    slots[1]:=0;
    image8.Canvas.Draw(0,0,predmets[0]);
    image8.Hint:='';
    end
    else

    if (slots[1]>0) and (rukzak[4]=0) then
    begin
    rukzak[4]:=slots[1];
    image4.Canvas.Draw(0,0,predmets[slots[1]]);

    slots[1]:=0;
    image8.Canvas.Draw(0,0,predmets[0]);
    image8.Hint:='';
    end
    else

    if (slots[1]>0) and (rukzak[5]=0) then
    begin
    rukzak[5]:=slots[1];
    image5.Canvas.Draw(0,0,predmets[slots[1]]);

    slots[1]:=0;
    image8.Canvas.Draw(0,0,predmets[0]);
    image8.Hint:='';
    end
    else

    if (slots[1]>0) and (rukzak[6]=0) then
    begin
    rukzak[6]:=slots[1];
    image6.Canvas.Draw(0,0,predmets[slots[1]]);

    slots[1]:=0;
    image8.Canvas.Draw(0,0,predmets[0]);
    image8.Hint:='';
    end
    else

    for i:=1 to 1 do
    begin
    if (slots[1]>0) and (rukzak[i]>0) then
    showmessage ('В рюкзаке нет места, выбросите вещь!');
    end;

    end;
  • Сергей (24.07.15 18:38) [5]
    Инвентарь расчитан на 6 слотов в каждый из них можно добавить по 1 предмету, но как сделать если предмет такой уже есть в инвентаре, то добавить к нему же а не в новый слот?
  • Rouse_ © (24.07.15 19:44) [6]
    Суровый подход:

    > for i:=1 to 1 do


    Но вообще нужно подумать вот тут:

    > if (rukzak[1]=0) then
    > begin
    > rukzak[1]:=shlem;

    На втором этапе именно тут и инкрементировать количество shlem в ячейке рюкзака за индексом [1]

    ЗЫ: удачи с темных делах :)
  • Сергей (24.07.15 19:47) [7]
    Ну а как бы вы написали инвентарь на массивах?
  • Rouse_ © (24.07.15 20:13) [8]

    > Сергей   (24.07.15 19:47) [7]
    > Ну а как бы вы написали инвентарь на массивах?

    На объектах.
    Ты сколько программируешь, что уже за игру взялся? Я так думаю лет восемь?
  • Сергей (24.07.15 20:24) [9]
    Та дело даже не в игре, а принцип создания хотел узнать инвентаря
  • Pavia © (26.07.15 12:34) [10]
    Принципы просты:
    - сокрытие информации;
    - разделляй и властвуй;
    - структурируй свой код.

    Судя по примеру выше вам надо научится разбивать код на функции. Чем их больше тем лучше. Код становится самодоккументированным. При этом не только упрощается чтение и понимание кода. Но и управлять им становится проще.

    Разделяем код на 3 составляющих:
    -  управление;
    - модель;
    - отображение.
    Это стандартный шаблон используемый в сложных программах. Называется MCV и предпологается что реализуется все эти части отдельными объектами.

    Модель рюкзака проще описать объектом. Но можно и без объекта. А сразу дать доступ к внутреннему представленмю.
    Следующим шагом
    Выпишем структуры данных и их свойства.
    TPredmetId=Integer; // Номер предмета в классификаторе предметов, т.е. в перечень всех предметов мира.

    TElementRykzak=record
     count:integer;
     premet:TPredmetId;
     end

    TRukzak=array of TElementRykzak;

    Теперь свойства.
    RukzakAdd(Rykzak:TRukzak; predmet:TPremetId; count:Integer):boolean
    RykzakSize(Rykzak:TRykzak):Integer;
    RykzakIsFull(Rykzak:TRykzak):boolean; // Рюкзак полон?
    RykzakHavePredmet(Rykzak:TRykzak; Predmet:Tpredmetid):Boolean;  // Проверяет есть предмет или нет.

    При добавлении пользуешься функциями.
    Реализация функций простая увеличиваешь и уменьшаешь счетчик в массиве нужного предмета.

    ----------------
    Отрисовка. При отрисовке проходишься по массиву рюкзака получаешь номер предмета. По номеру предмета находишь в перечне картинку. И её выводишь.

    TImage лучше не использоват. А заменить на TPaintBox.
    И сделать его одним на всю форму.

    -----------------
    Что касается управления. То управления сводится к вызову функций модели.
    Тут нужно описать события которые надо обработать. нажати, Отпускание Мыши над рюкзаком. Перемещение.

    ------------------
    Управление кодом или то как создавать функции. Советов тут много. Но пожалуй дам те что не встречал.
    Если подряд идут 2 цикла то их надо разбить на 2 функции.
    В функции должно быть не более 3-х условий.
    Код который повторяется более 3-х раз должен быть сгруппирован в цикл.
  • Сергей (26.07.15 21:07) [11]
    Pavia, спасибо вам большое) Внятно написали!
  • Игорь Шевченко © (27.07.15 12:56) [12]

    > Pavia, спасибо вам большое) Внятно написали!


    Не надо следовать этим советам
  • Pavia © (27.07.15 14:27) [13]
    Я вообще думал из-за русского языка вы всё сотрёте.

    > Не надо следовать этим советам

    Кроме русского языка. Что вам не понравилось???
  • Игорь Шевченко © (27.07.15 22:39) [14]
    Pavia ©   (27.07.15 14:27) [13]

    Я боюсь, что если я начну отвечать развернуто, это будет бесполезно. Жизнь слишком коротка, чтобы тратить время на перебуждение людей, которые не хотят, чтобы их переубеждали. Потому напишу кратко - почитай книжки по программированию, МакКоннелла, например.
  • Pavia © (28.07.15 01:54) [15]

    > Игорь Шевченко ©   (27.07.15 22:39) [14]

    Описание специально было упрощенно до уровня Сергея.  При обучении нельзя всё и сразу рассказывать надо постепенно вводить в курс дела. Поэтому многое ещё и осталось не досказано. Но с другой стороны я и не вижу причины усложнять разработку программы. Код не будет повторно использоваться. Поэтому и решил, что надо показать наиболее простой, но действенный метод разработки.

    Конечно это не отменяет рефакторинг кода. Да и в самом тексте наверно стоило бы переписать предложения.
    Но тут уж прошу простить это моя первая проба писать просто о сложном.

    На перспективу Сергею советую начать изучать следующую литературу :
    1) Вирт Н.-Алгоритмы + структуры данных - программы-Мир (1985)
    2) Стивен МакКонналл Совершенный код (2005)
    3) Кент Бек-Экстремальное программирование. Разработка через тестирование (2003)
    4) Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес-Приемы объектно-ориентированного проектирования. Паттерны проектирования-ДМК Пресс (2010)
    5) Буч Г., Максимчук Р., и др.-Объектно-ориентированный анализ и проектирование с примерами приложений-Вильямс (2008)

    Эти книги я уже сам прочитал.
 
Конференция "Игры" » Инвентарь для игры [Delphi, Windows]
Есть новые Нет новых   [134427   +37][b:0][p:0.001]