IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Недоделанная прога
1234
сообщение 22.12.2006 17:27
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


Пожалуйста, помогите доделать прогу. Некоторые очерки я уже имею. Проблема заключена в следующем: как заставить объект стрелять, при том, что подстреленные объекты исчезают (как я понимаю, окрашиваясь в цвет фона). Но вопрос в другом: если, уже невидимый, объект попадает на стреляющий объект игра заканчивается. Потому как они существуют.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 22.12.2006 20:52
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Приводи свои очерки, посмотрим..

Сообщение отредактировано: Malice - 22.12.2006 20:52
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
1234
сообщение 23.12.2006 16:08
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


Начнём с этого. Мне нужно чтобы шарики вылетали не одновременно и не больше 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.

М
1234, используй теги! Lapp



Сообщение отредактировано: Lapp - 26.12.2006 15:14
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Archon
сообщение 24.12.2006 2:19
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
1234
сообщение 24.12.2006 16:08
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


Спасибо тебе на добром слове/исходнике.
А вот новая бага. Тут какой-то глюк вверху. Как бы его исправить. И научить объект стрелять.

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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
1234
сообщение 26.12.2006 13:14
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


ypriamii.gif ypriamii.gif !help.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Archon
сообщение 26.12.2006 18:32
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


Поставь сперва нормальные отступы, мне надоело их исправлять.


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 26.12.2006 21:39
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


У тебя y1 не инициализирована, т.е. =0, по этому вот здесь:
putimage(x,y,p^,xorput);
putimage(x1 ,y1,p^,xorput);
будет рисовать не там, где надо, от того и глюки

Сообщение отредактировано: Malice - 26.12.2006 21:39
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
1234
сообщение 27.12.2006 14:42
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


Учитывая ваши советы, у меня в силе остаются те же вопросы, а именно: как заставить это стрелять по-человечески (нечто вроде пародии у меня уже есть (жми стрелку "вверх")) и как устранить глюк.

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.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 27.12.2006 15:00
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Вот здесь ты рисуешь 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;


Но нельзя будет двигаться, пока снаряд не долетит. Если надо по другому, то посмотри как я делал вот в этом ответе тебе:
Непонятная игра
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
1234
сообщение 27.12.2006 16:04
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


Как убрать глюк в левом верхнем углу? И, касательно первой программы(про летящие шарики), как сделать, чтоб они не моргали.
P.S. Сейчас пытаюсь соеденить две программы


Сообщение отредактировано: 1234 - 27.12.2006 16:24
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 27.12.2006 17:12
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Глюк в левом углу - результат 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

Т.е. сперва стирается, потом рисуется в новом месте. Пока ждем - шарик висит.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
1234
сообщение 27.12.2006 17:30
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


Всё работаёт. Путём. Спасибо :respect2
Теперь, если можно, подскажите как их соединить, чтоб они работали в комплекте. Думаю через процедуры, а то я запарился: то эдак, то так-пашет по отдельности.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 27.12.2006 17:34
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Эх ты, блин, без подумать никак нельзя. no1.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
1234
сообщение 28.12.2006 15:39
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


Цитата(Malice @ 27.12.2006 17:34) *

Эх ты, блин, без подумать никак нельзя. no1.gif

Прикинь да, мог бы это не писать. Тему только (как бы это мягче выразиться)... мусором заполняешь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 18.07.2025 19:29
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"