Конференция "Игры" » Гексагональная настольная игра
 
  • volkafff © (31.03.11 17:55) [0]
    Здравствуйте все программисты игр! У меня к вам несколько вопросов, касаемых программирования настольных игр в среде Delphi.
    Сразу оговорюсь-хотел бы сделать игру без использования DirectX,OpenGL и прочего,т.е.с помощью стандартных компонентов.(Если не получится-посоветуйте, какую библиотеку лучше использовать/какую книгу по этой библиотеке почитать).
    Итак,непосредственно вопросы:
    1)Как сделать гексагональное поле?(то есть каждый гексагон(шестиугольник)-отдельный компонент).
    2)Скажем,один из игроков поставил фишки на один из гексов. Мне нужно сделать так,чтобы игрок выделял не фишку,а сначала гексагон,на котором она стоит,а потом уже и фишку. То есть как-то нужно "сказать" компьютеру,что "эта фишка стоит на этом гексагоне,а вторая-на втором гексе,и т.п.)
    3)Допустим,стоит фишка.Она может сходить только на один(то есть соседний) гекс. Как мне сделать так,чтобы игрок после выбора фишки мог переставить её только на один из соседних гексов,а остальные должны быть недоступны?Я думал как-нибудь начертить круг,радиус которого равен дальности хода фишки,и все гексы,которые попали в него, становятся доступными. Но это теория-а как сделать подобное на практике?
    4)Как сделать перемещение фишки(то есть при клике на фишку в переменную записывается её идентификатор,а при клике на доступном для хода гексе осуществляется её перемещение)?
    5)Как сделать так,чтобы пока ходит первый игрок, фишки второго были видны,но не могли перемещаться?(Есь вариант:если в переменной "а" одно значение,то фишки доступны,а если другое-недоступны,но этот вариант мне не подходит,так как иногда нужно дать доступ только к определённым фишкам, а писать каждой фишке свою определяющую переменную затратно-всего более 400 фишек)

    Прошу не писать ответов типа:"Дурак,ничего не знаешь" и т.п. Просьба писать только ответы,пожелания,рекоммендации и конструктивную критику.Заранее спасибо!
  • MBo © (31.03.11 22:43) [1]
    1. Компонентов не нужно - просто рисовать шестиугольники
    Нужно выбрать удобную нумерацию, систему координат, подходящую для гексагонов
    2. Каждой фишке соответствуют координаты
    3. перерисовать поле с подсветкой соседних ячеек
    4. именно то, что в скобках
    5. Фишки - массив записей с нужными полями.
  • volkafff © (31.03.11 22:49) [2]
    1)Мне надо,чтобы при клике на гекс на спец экране отображались находящиеся фишки.
    3)И что,что я перерисую?Если игрок кликнет по неподсвеченному гексу-что будет?

    Главное:Не поможете-как это всё осуществитьт?Т.е. как нарисовать шестиугольники,как перерисовать их с подсветкой соседних ячеек и как лучше сделать фишку,чтобы она была в виде компонента Image,но имела дополнительные свойства(пытался зменить класс на свой,родственный TImage,но ничего не получилось=((
    Не поможете?
  • volkafff © (31.03.11 22:58) [3]
    Забыл главное-на счёт первого пункта:
    Для создания гексагонального поля я хотел использовать компонент Image шестиугольной формы,который был бы объектом моего класса,родственного TImage,у которого добавилась бы только одна переменная-"Тип". У меня уже есть изображения кусков поля.Если на гексе нарисована дорога-это тип "1".Если лес-"2".Если на ещё какой-то картинке нарисована дорога-её тип тоже "1". Это потому,что для каждого вида элемента поля свои правила,которые я буду писать(пример:
    If pole1.tip=1 then
    fishka.height:=fishka.height+100
    if pole1.tip=2 then
    fishka.height:=fishka.height+1000
    Ну и так далее.А если я просто расчерчу гексагональную сетку-как я буду писать?И как я поставлю нужную готовую картинку под сетку?Заранее спасибо!
  • MBo © (01.04.11 09:44) [4]
    Забудь про компоненты. TImage (один) можно использовать только как подложку для рисования поля и фишек.

    Для начала научись рисовать на Canvas шестиугольную сетку.
    Затем выбери способ нумерации ячеек и найди способ определения, в какую ячейку попадает определенные координаты (от клика, например)
  • volkafff © (02.04.11 22:36) [5]
    Уважаемый MBo! Спасибо вам за помощь!
    Может я совсем тупой,но у меня не выходит построить шестиугольник(Canvas/Polygon). Я взял центр гексагона как точку отсчёта,по читал по формуле(нашёл в учебнике геометрии) все точки. Но  poligon требует координаты в integer, а у меня корень не целый. Не могли бы вы подсказать,в чём проблема?
  • volkafff © (03.04.11 00:24) [6]
    А-а-а! Вроде бы разобрался! Только вот в чём вопрос:как использовать не целые числа в  poligon,который требует координаты в integer?
  • MBo © (03.04.11 08:22) [7]
    >как использовать не целые числа в  poligon,который требует координаты в integer?
    Округлять - функции Round, Trunc
  • volkafff © (03.04.11 12:14) [8]
    Нарисовал один шестиугольник-вроде бы всё нормально. Хотел зациклить рисование-ничего не рисуется.Почему?
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    R:=50;
    rm:=43;
    z:=25;
    x:=50;
    y:=50;
    while x>= 950 do
    begin
    Image1.Canvas.Polygon([point(x+z,y-rm),point(x+R,y),point(x+z,y+rm),point(x-z,y+rm),point(x-R,y),point(x-z,y-rm)]);
    x:=x+100;
    end;
    end;

  • MBo © (03.04.11 15:28) [9]
    неправильное условие в while
  • volkafff © (06.04.11 22:06) [10]
    Нашёл ошибку.Стыдно признаться,но с таким циклом впервые встречаюсь.
    Вот как я создал сетку:
    procedure TForm1.FormCreate(Sender: TObject);
    var
    q,i:integer;
    begin
    R:=20;
    rm:=17;
    z:=10;
    x:=50;
    y:=50;
    for q:=1 to 6 do
    begin
    for i:=1 to 6 do
    begin
    Image1.Canvas.Polygon([point(x+z,y-rm),point(x+R,y),point(x+z,y+rm),point(x-z,y+rm),point(x-R,y),point(x-z,y-rm)]);
    x:=x+3*r;
    end;
    y:=y+2*rm;
    x:=50;
    end;
    x:=80;
    y:=67;
    for q:=1 to 6 do
    begin
    for i:=1 to 6 do
    begin
    Image1.Canvas.Polygon([point(x+z,y-rm),point(x+R,y),point(x+z,y+rm),point(x-z,y+rm),point(x-R,y),point(x-z,y-rm)]);
    x:=x+3*r;
    end;
    y:=y+2*rm;
    x:=80;
    end;
    end;
    end.


    Что вы о таком построении скажете?
    Что мне делать дальше?
    Заранее спассибо за помощь!
  • MBo © (07.04.11 05:33) [11]
    >Что вы о таком построении скажете?
    Работает.
    Можно выделить процедуру рисования одного шестиугольника по заданным координатам

     procedure DrawHex(xx, yy: Integer);
     begin
       (можно Polygon, не суть важно)
       Canvas.MoveTo(xx - Edge, yy);
       Canvas.LineTo(xx - HalfEdge, yy - HalfHgt);
       Canvas.LineTo(xx + HalfEdge, yy - HalfHgt);
       Canvas.LineTo(xx + Edge, yy);
       Canvas.LineTo(xx + HalfEdge, yy + HalfHgt);
       Canvas.LineTo(xx - HalfEdge, yy + HalfHgt);
       Canvas.LineTo(xx - Edge, yy);
     end;

     for iy := 0 to 3 do
       for ix := 0 to 3 do begin
         yy := Shift + iy * Hgt;
         if Odd(ix) then
           yy := yy + HalfHgt;
         xx := Shift + CellWdt * ix;
         DrawHex(xx, yy);
       end;

    const
     Edge = 30;
     HalfEdge = Edge div 2;
     HalfHgt = Edge * 1732 div 2000; //Sqrt(3)/2
     Hgt = HalfHgt * 2;
     Wdt = 2 * Edge;
     CellWdt = 3 * HalfEdge;
     Shift = Edge;




    Дальше - в [4]
  • volkafff © (07.04.11 15:34) [12]

    > Дальше - в [4]

    Всмысле четвёртый пункт?
  • MBo © (07.04.11 15:58) [13]
    четвертый пост в теме
  • volkafff © (08.04.11 17:56) [14]

    > выбери способ нумерации ячеек и найди способ определения,
    >  в какую ячейку попадает определенные координаты (от клика,
    >  например)

    Вот что я сделал:

    procedure TForm1.FormCreate(Sender: TObject);
    var
    q,i,k:integer;
    begin
    R:=32;
    rm:=28;
    z:=16;
    x:=50;
    y:=50;
    for q:=1 to 3 do
    begin
    for i:=1 to 3 do
    begin
    Image1.Canvas.Polygon([point(x+z,y-rm),point(x+R,y),point(x+z,y+rm),point(x-z,y+rm),point(x-R,y),point(x-z,y-rm)]);
    x:=x+3*r;
    end;
    y:=y+2*rm;
    x:=50;
    end;
    x:=50+r+z;
    y:=50+rm;
    for q:=1 to 2 do
    begin
    for i:=1 to 2 do
    begin
    Image1.Canvas.Polygon([point(x+z,y-rm),point(x+R,y),point(x+z,y+rm),point(x-z,y+rm),point(x-R,y),point(x-z,y-rm)]);
    x:=x+3*r;
    end;
    y:=y+2*rm;
    x:=50+r+z;
    end;
    k:=1;
    x:=50;
    y:=50;
    for i:=1 to 36 do
    begin
    Pole[i,1]:=k;
    pole[i,2]:=x;
    pole[i,3]:=y;
    k:=k+1;
    x:=x+100;
    y:=y+56;
    end;
    end;
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
     var
     i:integer;
    begin
    for i:=1 to 36 do
    begin
    if x>pole[i,2]-50 and x<pole[i,2]+50 and  y>pole[i,3]-28 and y<pole[i,3]+28   then
    begin
    n:=i;
    end;
    end;
    end;
    end.


    Но компилятору что-то не понравилось.
  • MBo © (08.04.11 18:17) [15]
    >Но компилятору что-то не понравилось.
    компилятор обычно об этом сообщает.

    В общем, похоже, нужна книжка по языку, где про приоритет операторов написано, и про другое полезное.
  • volkafff © (08.04.11 18:32) [16]

    > В общем, похоже, нужна книжка по языку, где про приоритет
    > операторов написано, и про другое полезное.

    Есть книжка,только там такого не наблюдалось(((
  • volkafff © (08.04.11 18:35) [17]
    [Error] Unit1.pas(81): Incompatible types


    Вот какая ошибка.
  • volkafff © (08.04.11 18:39) [18]

    > В общем, похоже, нужна книжка по языку, где про приоритет
    > операторов написано, и про другое полезное.

    А какую посоветуете?
  • MBo © (08.04.11 18:39) [19]
    приоритет операторов
 
Конференция "Игры" » Гексагональная настольная игра
Есть новые Нет новых   [106965   +40][b:0.001][p:0.006]