-
Нужна помощь. Как создать несколько обьектов. ? 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);
oY := fge.inp.Y;
oY := 1024-oY-65; 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
if fge.inp.Keys[key_escape] then begin
fge.Quit;
end;
end;
begin
InitEngine; FGE.SetProc(PROC_INIT, @INIT); FGE.CreateAPP(ProductName + ' ' + ProductVersion,1024,768); FGE.SetProc(PROC_RENDER, @RENDER); FGE.SetProc(PROC_UPDATE, @UPDATE); FGE.Loop(1000); end.
-
Я бы в процедуре CreateApples заполнял динамический массив типа array of TApple , присваивая каждому "яблоку" координаты. (не совсем понятно, почему объявление типа TApple есть, но в приведённом коде не задействовано) И вызывал бы CreateApples не в Render , а в Update . А в процедуре Render добавил бы код отрисовки "яблок" (наподобие того, что сейчас в CreateApples ). Не знаю, как в движке реализуется обработка нажатия на кнопку мыши, но в этом случае нужно будет просто получить координаты курсора мыши и проверить, "входят" ли они "в яблоко". И если это условие выполняется, то это яблоко или удалять из массива, или не отрисовывать... Насчёт появления новых яблок. Можно завести глобальную переменную-счётчик и менять её в процедуре Update в большую или меньшую сторону. При достижения какого-то значения создавать "яблоки"...
-
AlexanderMS © вот я сделал рисование сначала так for i := 0 to 10 do
begin
fge.spt.Draw(random(500),Random(500),30,30,0,TestObj);
end;
так оно постояно перерисовуется на новом месте каждую секунду.
-
Написал код . Неработает Выскакивает такая ошибка . 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);
oY := fge.inp.Y;
oY := 1024-oY-65; 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
if fge.inp.Keys[key_escape] then begin
fge.Quit;
end;
end;
begin
InitEngine; FGE.SetProc(PROC_INIT, @INIT); FGE.CreateAPP(ProductName + ' ' + ProductVersion,1024,768); FGE.SetProc(PROC_RENDER, @RENDER); FGE.SetProc(PROC_UPDATE, @UPDATE); FGE.Loop(1000); end.
-
Поскольку массив динамический, нужна строка, где-нибудь в начале, 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 , например. То есть создавай яблоки в начале программы, один раз. А отрисовывай каждую секунду. ))
-
> При выходе из программы желательно: SetLength(Apple, 0);
Зачем? Дин. массивы в Делфи очень похожи на строки. Строковые переменные вы тоже таким образом финализировать предлагаете? Бред же.
> [3] lordgabriel
Купи вначале хоть какую-нибудь захудалую книжку по Делфи, прочитай и пойми. А потом уже начинай писать программы. Тогда глупых вопросов станет на порядок меньше.
|