![]() |
![]() ![]() |
![]() |
1234 |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Реальное имя: 1234 Репутация: ![]() ![]() ![]() |
Пожалуйста, помогите доделать прогу. Некоторые очерки я уже имею. Проблема заключена в следующем: как заставить объект стрелять, при том, что подстреленные объекты исчезают (как я понимаю, окрашиваясь в цвет фона). Но вопрос в другом: если, уже невидимый, объект попадает на стреляющий объект игра заканчивается. Потому как они существуют.
|
Malice |
![]()
Сообщение
#2
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Приводи свои очерки, посмотрим..
Сообщение отредактировано: Malice - 22.12.2006 20:52 |
1234 |
![]()
Сообщение
#3
|
|||
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Реальное имя: 1234 Репутация: ![]() ![]() ![]() |
Начнём с этого. Мне нужно чтобы шарики вылетали не одновременно и не больше 5. И очередная порция шариков не должна вылетать как у меня после исчезновения предыдущей.
Uses Graph,crt;
var
gD,gM: Integer;
p: pointer;
a,x,y,size,I,x1,y1: integer;
begin
gD := Detect;
InitGraph(gD,gM,'');
randomize;
setbkcolor(yellow);
setfillstyle(1,4);
setcolor(4);
circle(20,20,10);
floodfill(20,20,4);
size:=imagesize(10,10,30,30);
getmem(p,size);
getimage(10,10,30,30,p^);
putimage(10,10,p^,xorput);
for a:=0 to 50 do
begin
x1:=random(getmaxx);
x:=random(getmaxx);
for i:=1 to 50 do
begin
y:=10*i;
putimage(x,y,p^,xorput);
delay(50);
putimage(x,y,p^,xorput);
y1:=11*i;
putimage(x1,y1,p^,xorput);
delay(50);
putimage(x1,y1,p^,xorput);
end;
end;
putimage(x,y,p,xorput);
putimage(x1,y1,p^,xorput);
OuttextXY(10,10,'Press Enter to exit');
ReadLn;
CloseGraph;
end.
Сообщение отредактировано: Lapp - 26.12.2006 15:14 |
|||
Archon |
![]()
Сообщение
#4
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 618 Пол: Мужской Репутация: ![]() ![]() ![]() |
1. Ставь теги, не гневи модератора!
2. В идеале, стоит переписать это дело под ООП, но можно и посредством обычных массивов. Подозреваю, что ООП ты делать не захочешь (если я ошибаюсь - пиши, поможем!), но и просто через массивы - муторно... Поэтому я выбераю третий выход: один массив + запись. Uses Graph,crt;
const
Speed = 10;
MaxTiming = 50;
type
Ball = record
X, Y, Timing : integer;
{Timing - задержка падения шарика, чтоб не одновременно
}
end;
var
gD,gM: Integer;
p: pointer;
Balls : array [1..5] of Ball;
a, size, i : integer;
begin
gD := Detect;
InitGraph(gD,gM,'');
randomize;
setbkcolor(yellow);
setfillstyle(1,4);
setcolor(4);
circle(20,20,10);
floodfill(20,20,4);
size:=imagesize(10,10,30,30);
getmem(p,size);
getimage(10,10,30,30,p^);
putimage(10,10,p^,xorput);
for i := 1 to 5 do
begin
{начальные параметры}
Balls[i].Timing := Random(MaxTiming);
Balls[i].X := Random(GetMaxX);
Balls[i].Y := 0;
end;
while not KeyPressed do {До нажатия клавиши. Если нужно заданное число падений}
begin {проверяй значение счётчика здесь, а увеличивай его... (читай ниже)}
for i := 1 to 5 do
if Balls[i].Y > GetMaxY then
begin
{...здесь}
{Этот блок вызывается, если шарик ушёл ниже экрана}
Balls[i].Timing := Random(MaxTiming);
Balls[i].X := Random(GetMaxX);
Balls[i].Y := 0;
end
else
if Balls[i].Timing = 0 then
begin
Inc(Balls[i].Y, Speed);
PutImage(Balls[i].X, Balls[i].Y, p^, xorput);
delay(200);
PutImage(Balls[i].X, Balls[i].Y, p^, xorput);
end
else
Dec(Balls[i].Timing); {Пока таймер не обнулится мячик не рисуется}
end;
OuttextXY(10,10,'Press Enter to exit');
ReadLn;
CloseGraph;
end.
-------------------- Close the World...txeN eht nepO
|
1234 |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Реальное имя: 1234 Репутация: ![]() ![]() ![]() |
Спасибо тебе на добром слове/исходнике.
А вот новая бага. Тут какой-то глюк вверху. Как бы его исправить. И научить объект стрелять.
Uses Graph,crt;
const
Left =#75;
Right = #77;
Esc = #27;
var
gd : Integer;
gm : Integer;
ErrCode : Integer;
P : pointer;
S, x, y, size :integer;
Ch: char;
x1, y1: integer;
begin
gdr := Detect ;
InitGraph(gd, gm,'');
setfillstyle(1,4);
setcolor(4);
line(40,50,170,50);
line(110,50,110,60);
line(110,70,110,73);
setfillstyle(1,1);
setcolor(1);
fillellipse(110,65,20,5);
floodfill(110,65,1);
line(130,73,90,73);
size:=imagesize(30,50,180,50);
getmem(p,size);
getimage(30,56,180,90,p^);
putimage(30,50,p^, xorput);
x:=225; y:=450; x1:=x;
putimage(x,y,p^, xorput);
repeat
ch:=readkey;
if ch=#0 then ch:=readkey;
case ch of
left : x1:=x-10;
right: x1:=x+10;
end;
if (x1 < 0) or (x1 > GetmaxX-150) then x1:=x;
putimage(x,y,p^,xorput);
putimage(x1 ,y1,p^,xorput);
x:=x1;
until ch=Esc;
CloseGraph;
end.
Сообщение отредактировано: 1234 - 25.12.2006 14:15 |
1234 |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Реальное имя: 1234 Репутация: ![]() ![]() ![]() |
![]() ![]() ![]() |
Archon |
![]()
Сообщение
#7
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 618 Пол: Мужской Репутация: ![]() ![]() ![]() |
Поставь сперва нормальные отступы, мне надоело их исправлять.
-------------------- Close the World...txeN eht nepO
|
Malice |
![]()
Сообщение
#8
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
У тебя y1 не инициализирована, т.е. =0, по этому вот здесь:
putimage(x,y,p^,xorput);
putimage(x1 ,y1,p^,xorput);
будет рисовать не там, где надо, от того и глюкиСообщение отредактировано: Malice - 26.12.2006 21:39 |
1234 |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Реальное имя: 1234 Репутация: ![]() ![]() ![]() |
Учитывая ваши советы, у меня в силе остаются те же вопросы, а именно: как заставить это стрелять по-человечески (нечто вроде пародии у меня уже есть (жми стрелку "вверх")) и как устранить глюк.
Uses Graph,crt;
const
Left =#75;
Right = #77;
strelba= #72;
Esc = #27;
var
grDriver : Integer;
grMode : Integer;
ErrCode : Integer;
P : pointer;
S, x, y, size,i,j :integer;
Ch : char;
x1 : integer;
begin
grDriver := Detect ;
InitGraph(grDriver, grMode,'');
setfillstyle(1,4);
setcolor(4);
line(110,50,110,60);
line(110,70,110,73);
setfillstyle(1,1);
setcolor(1);
fillellipse(110,65,20,5);
floodfill(110,65,1);
line(130,73,90,73);
size:=imagesize(30,50,180,50);
getmem(p,size);
getimage(30,56,180,90,p^);
putimage(30,50,p^, xorput);
x:=225; y:=450; x1:=x;
putimage(x,y,p^, xorput);
repeat
ch:=readkey;
if ch=#0 then ch:=readkey;
case ch of
left : x1:=x-10;
right: x1:=x+10;
end;
if ch=strelba then
begin
for i:=1 to 30 do
putpixel(x1+80,15*i,white);
putpixel(x1+80,15*i,black);
end;
if (x1 < 0) or (x1 > GetmaxX-150) then x1:=x;
putimage(x,y,p^,xorput);
putimage(x1,y, p^,xorput);
x:=x1;
until ch=Esc;
CloseGraph;
end.
|
Malice |
![]()
Сообщение
#10
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот здесь ты рисуешь 30 точек, а стираешь одну
for i:=1 to 30 do
putpixel(x1+80,15*i,white);
putpixel(x1+80,15*i,black);
Поменяй это на что-то типа этого: for i:=1 to 450 do begin
if i<440 then putpixel(x1+80,440-i,white); delay (1);
putpixel(x1+80,440-i+10,black);
end;
Но нельзя будет двигаться, пока снаряд не долетит. Если надо по другому, то посмотри как я делал вот в этом ответе тебе: Непонятная игра |
1234 |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Реальное имя: 1234 Репутация: ![]() ![]() ![]() |
Как убрать глюк в левом верхнем углу? И, касательно первой программы(про летящие шарики), как сделать, чтоб они не моргали.
P.S. Сейчас пытаюсь соеденить две программы Сообщение отредактировано: 1234 - 27.12.2006 16:24 |
Malice |
![]()
Сообщение
#12
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Глюк в левом углу - результат 2-х строк:
getimage(30,56,180,90,p^);
putimage(30,50,p^, xorput);
берешь с одного места, ставишь в другое. Сделай лучше так: getimage(30,56,180,90,p^);
cleardevice;
Моргание в коде Archon ? вот в этом месте иногода (когда Timing=0) шарик рисуется и почти сразу стирается, потом ждем опять Timing=0: if Balls[i].Timing = 0 then
begin
Inc(Balls[i].Y, Speed);
PutImage(Balls[i].X, Balls[i].Y, p^, xorput);
delay(200);
PutImage(Balls[i].X, Balls[i].Y, p^, xorput);
end
лучше так: if Balls[i].Timing = 0 then
begin
if Balls[i].Y>0 then PutImage(Balls[i].X, Balls[i].Y, p^, xorput);
Inc(Balls[i].Y, Speed);
PutImage(Balls[i].X, Balls[i].Y, p^, xorput);
delay(200);
end
Т.е. сперва стирается, потом рисуется в новом месте. Пока ждем - шарик висит. |
1234 |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Реальное имя: 1234 Репутация: ![]() ![]() ![]() |
Всё работаёт. Путём. Спасибо :respect2
Теперь, если можно, подскажите как их соединить, чтоб они работали в комплекте. Думаю через процедуры, а то я запарился: то эдак, то так-пашет по отдельности. |
Malice |
![]()
Сообщение
#14
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Эх ты, блин, без подумать никак нельзя.
![]() |
1234 |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Реальное имя: 1234 Репутация: ![]() ![]() ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 19:29 |