Конференция "Игры" » Создание и управление игровыми обьектами [Delphi, Windows]
 
  • lordgabriel (15.08.08 22:22) [0]
    Нужна помощь.  
    Как создать несколько обьектов. ?
    1. Мне надо создать  несколько яблок.
    2. При нажатии на любое яблоко оно исчезает.
    3. Через некоторое время появляются опять яблоки.

    Исходник и модули  здесь (архив 1.5 mb)

    http://depositfiles.com/files/7248343


    program Garden;
    uses
     windows,
     OpenGL,
     fge_core in 'engine\fge_core.pas',
     fge_sys in 'engine\fge_sys.pas',
     fge_scn in 'engine\fge_scn.pas',
     fge_log in 'engine\fge_log.pas',
     fge_cfg in 'engine\fge_cfg.pas',
     fge_inp in 'engine\fge_inp.pas',
     fge_tex in 'engine\fge_tex.pas',
     fge_spt in 'engine\fge_spt.pas',
     fge_prt in 'engine\fge_prt.pas',
     DEMusicFiles in 'DEMusicFiles.pas',
     fge_colis in 'engine\fge_colis.pas';
    const
     ProductName = 'Garden';
     ProductVersion = '0.1';
     // Состояния приложения
     AppInit = 0;
     AppMenu = 1;
     AppGame = 2;
    type
     TApple = record
       x,y: integer;
       colis: Boolean;
     end;
    var
     AppState : integer;
     MouseImage,TestObj: uint;
     oy: integer;
    Procedure CreateApples;
    var
    i : integer;
    begin
     for i := 0 to 10 do
     begin
       fge.spt.Draw(random(500),Random(500),30,30,0,TestObj);
     end;
    end;
    ////////////////////////////////////////////////////////////////////////////////
    /// Главная процедура инициализации приложения
    ////////////////////////////////////////////////////////////////////////////////
    procedure Init;
    begin
     FGE.BuildFont('Courier New', 0, 32, FW_BOLD, FGE.h_DC); // Создать шрифт
     fge.tex.LoadTexture('Apple.tga', TestObj, false,2);
     fge.tex.LoadTexture('mouse.tga', MouseImage, false,2);
    end;
    procedure Mouse;
    begin
     glcolor3ub(255,255,255);
     // расчитываем координаты по Y
     oY := fge.inp.Y;
     oY := 1024-oY-65;   // Формула:  oY = ширина екрана - oY - высота спрайта
     fge.spt.DrawMouse(fge.inp.x,oY,25,25,-25,MouseImage);
    end;
    ////////////////////////////////////////////////////////////////////////////////
    /// Главная процедура рендеринга приложения
    ////////////////////////////////////////////////////////////////////////////////
    procedure Render;
    begin
     fge.scn.SceneColor(1,1,1);      // заливка фона
     fge.scn.NewScene;               // создать сцену
     CreateApples;
     mouse;
    end;
    ////////////////////////////////////////////////////////////////////////////////
    /// Главная процедура обновлений приложения
    ////////////////////////////////////////////////////////////////////////////////
    procedure Update;
    begin
     // если нажата клавиша escape тогда завершается работа приложения
     if fge.inp.Keys[key_escape] then  begin
       fge.Quit;
     end;
    end;
    begin
     InitEngine;                                                    // Инициализировать движок FANSORO
     FGE.SetProc(PROC_INIT, @INIT);                                 // Установить процесс инициализации
     FGE.CreateAPP(ProductName + ' ' + ProductVersion,1024,768);    // Создать приложение с задаными параметрами
     FGE.SetProc(PROC_RENDER, @RENDER);                             // Установить процесс рендеринга
     FGE.SetProc(PROC_UPDATE, @UPDATE);                             // Установить процесс обновлений
     FGE.Loop(1000);                                                // Запустить таймер движка FANSORO
    end.

  • AlexanderMS © (16.08.08 08:17) [1]
    Я бы в процедуре
    CreateApples

    заполнял динамический массив типа
    array of TApple

    , присваивая каждому "яблоку" координаты. (не совсем понятно, почему объявление типа TApple есть, но в приведённом коде не задействовано)
    И вызывал бы
    CreateApples

    не в
    Render

    , а в
    Update

    . А в процедуре
    Render

    добавил бы код отрисовки "яблок" (наподобие того, что сейчас в
    CreateApples

    ).

    Не знаю, как в движке реализуется обработка нажатия на кнопку мыши, но в этом случае нужно будет просто получить координаты курсора мыши и проверить, "входят" ли они "в яблоко". И если это условие выполняется, то это яблоко или удалять из массива, или не отрисовывать...

    Насчёт появления новых яблок. Можно завести глобальную переменную-счётчик и менять её в процедуре Update в большую или меньшую сторону. При достижения какого-то значения создавать "яблоки"...
  • lordgabriel (16.08.08 15:14) [2]
    AlexanderMS ©  
    вот я сделал рисование сначала так

     for i := 0 to 10 do
     begin
       fge.spt.Draw(random(500),Random(500),30,30,0,TestObj);
     end;


    так оно постояно перерисовуется на новом месте каждую секунду.
  • lordgabriel (16.08.08 15:18) [3]
    Написал код .
    Неработает

    Выскакивает такая ошибка .

    Excaption EAccessViolation in  module Garden.exe

    -----------------------------------------------


    program Garden;
    uses
     windows,
     OpenGL,
     fge_core in 'engine\fge_core.pas',
     fge_sys in 'engine\fge_sys.pas',
     fge_scn in 'engine\fge_scn.pas',
     fge_log in 'engine\fge_log.pas',
     fge_cfg in 'engine\fge_cfg.pas',
     fge_inp in 'engine\fge_inp.pas',
     fge_tex in 'engine\fge_tex.pas',
     fge_spt in 'engine\fge_spt.pas',
     fge_prt in 'engine\fge_prt.pas',
     DEMusicFiles in 'DEMusicFiles.pas',
     fge_colis in 'engine\fge_colis.pas';
    const
     ProductName = 'Garden';
     ProductVersion = '0.1';
     // Состояния приложения
     AppInit = 0;
     AppMenu = 1;
     AppGame = 2;
    type
     TApple = packed record
       x,y: integer;
       active: Boolean;
     end;
    var
     AppState : integer;
     MouseImage,TestObj: uint;
     oy: integer;
     apple:array of TApple;
    ////////////////////////////////////////////////////////////////////////////////
    /// Главная процедура инициализации приложения
    ////////////////////////////////////////////////////////////////////////////////
    procedure Init;
    begin
     FGE.BuildFont('Courier New', 0, 32, FW_BOLD, FGE.h_DC); // Создать шрифт
     fge.tex.LoadTexture('Apple.tga', TestObj, false,2);
     fge.tex.LoadTexture('mouse.tga', MouseImage, false,2);
    end;
    Procedure CreateApples(x,y:integer);
    var
    i : integer;
    begin
    for i:=0 to 100 do
    begin
       apple[i].Active:=true;
       apple[i].X:=X;
       apple[i].Y:=Y;
    end;
    for i:=0 to 100 do
     if apple[i].Active then
     begin
        apple[i].x:=0;
        apple[i].y:=0;
        apple[i].active:=false;
        fge.spt.Draw(apple[i].x,apple[i].y,25,25,-25,MouseImage);
     end;
    end;
    procedure Mouse;
    begin
     glcolor3ub(255,255,255);
     // расчитываем координаты по Y
     oY := fge.inp.Y;
     oY := 1024-oY-65;   // Формула:  oY = ширина екрана - oY - высота спрайта
     fge.spt.DrawMouse(fge.inp.x,oY,25,25,-25,MouseImage);
    end;
    ////////////////////////////////////////////////////////////////////////////////
    /// Главная процедура рендеринга приложения
    ////////////////////////////////////////////////////////////////////////////////
    procedure Render;
    begin
     fge.scn.SceneColor(1,1,1);      // заливка фона
     fge.scn.NewScene;               // создать сцену
     CreateApples(random(500),random(500));
     mouse;
    end;
    ////////////////////////////////////////////////////////////////////////////////
    /// Главная процедура обновлений приложения
    ////////////////////////////////////////////////////////////////////////////////
    procedure Update;
    begin
     // если нажата клавиша escape тогда завершается работа приложения
     if fge.inp.Keys[key_escape] then  begin
       fge.Quit;
     end;
    end;
    begin
     InitEngine;                                                    // Инициализировать движок FANSORO
     FGE.SetProc(PROC_INIT, @INIT);                                 // Установить процесс инициализации
     FGE.CreateAPP(ProductName + ' ' + ProductVersion,1024,768);    // Создать приложение с задаными параметрами
     FGE.SetProc(PROC_RENDER, @RENDER);                             // Установить процесс рендеринга
     FGE.SetProc(PROC_UPDATE, @UPDATE);                             // Установить процесс обновлений
     FGE.Loop(1000);                                                // Запустить таймер движка FANSORO
    end.

  • AlexanderMS © (16.08.08 17:17) [4]
    Поскольку массив динамический, нужна строка, где-нибудь в начале, 1 раз:
    SetLength(Apple, 101);


    Без неё будет Access Violation.
    При выходе из программы желательно:
    SetLength(Apple, 0);



    Если яблок всегда будет ровно 101, то лучше просто объявить
    array[0..100] of TApple

    , и всё, что я написал выше, не нужно.


    > вот я сделал рисование сначала так
    >
    > так оно постояно перерисовуется на новом месте каждую секунду.
    >

    Так ты каждую секунду случайным образом меняешь положение. Поэтому и на новом месте рисуется.
    Теперь о коде в [3] :

    Процедуру
    CreateApples

    вызывай только в самом начале программы, а не каждую секунду.
    А вот эту строки:
    for i:=0 to 100 do
    if apple[i].Active then
    begin
       apple[i].x:=0;
       apple[i].y:=0;
       apple[i].active:=false;
       fge.spt.Draw(apple[i].x,apple[i].y,25,25,-25,MouseImage);
    end;
    end;



    перенеси из неё в процедуру
    Render

    , например. То есть создавай яблоки в начале программы, один раз. А отрисовывай каждую секунду. ))
  • Servy © (16.08.08 23:01) [5]
    > При выходе из программы желательно: SetLength(Apple, 0);

    Зачем? Дин. массивы в Делфи очень похожи на строки. Строковые переменные вы тоже таким образом финализировать предлагаете? Бред же.


    > [3] lordgabriel  

    Купи вначале хоть какую-нибудь захудалую книжку по Делфи, прочитай и пойми. А потом уже начинай писать программы. Тогда глупых вопросов станет на порядок меньше.
 
Конференция "Игры" » Создание и управление игровыми обьектами [Delphi, Windows]
Есть новые Нет новых   [134431   +5][b:0][p:0.006]