Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2010, 18:22   #1
Kingcss
Пользователь
 
Регистрация: 28.12.2010
Сообщений: 13
По умолчанию Дополните код

Сделана примитивная игрушка,где 2 красных квадрата бегают за синим, синим управляет игрок, а красными вот такой код:
Код:
procedure TForm1.GameTimerTimer(Sender: TObject);

begin
  if Player.Left+Player.Width < Enemy.Left then
    dx:=Player.Left+Player.Width-Enemy.Left
  else if Enemy.Left+Enemy.Width < Player.Left then
    dx:=Player.Left-Enemy.Left-Enemy.Width
  else
    dx:=0;

  if Player.Top+Player.Height < Enemy.Top then
    dy:=Enemy.Top-Player.Top+Player.Height
  else if Enemy.Top+Enemy.Height < Player.Top then
    dy:=Enemy.Top-Enemy.Height-Player.Top
  else
    dy:=0;

     if (dx = 0) and (dy = 0) then
     begin
    GameTimer.Enabled:=False;
    GameTimer2.Enabled:=False;
    Timer.Enabled:=False;
    LevelTimer.Enabled:=False;
    Label6.Caption:='Вы проиграли!';
    if Time > GoodTime then
    GoodTime := Time;
    Label4.Caption := inttostr(GoodTime) + ' сек';
    StartButton.Enabled:=True;
    Exit;
  end;
     ////

     if Player.Left+Player.Width < Enemy2.Left then
    gx:=Player.Left+Player.Width-Enemy2.Left
  else if Enemy2.Left+Enemy2.Width < Player.Left then
    gx:=Player.Left-Enemy2.Left-Enemy2.Width
  else
    gx:=0;

  if Player.Top+Player.Height < Enemy2.Top then
    gy:=Enemy2.Top-Player.Top+Player.Height
  else if Enemy2.Top+Enemy2.Height < Player.Top then
    gy:=Enemy2.Top-Enemy2.Height-Player.Top
  else
    gy:=0;

     if (gx = 0) and (gy = 0) then
  begin
    GameTimer.Enabled:=False;
    GameTimer2.Enabled:=False;
    Timer.Enabled:=False;
    LevelTimer.Enabled:=False;
    Label6.Caption:='Вы проиграли!';
    if Time > GoodTime then
    GoodTime := Time;
    Label4.Caption := inttostr(GoodTime) + ' сек';
    StartButton.Enabled:=True;
    Exit;
  end;
  end;
И еще:
Код:
procedure TForm1.GameTimer2Timer(Sender: TObject);
begin
 if (Abs(dx) >= Abs(dy)) and (dx <> 0) then
    if dx < 0 then
      Enemy.Left:=Enemy.Left-Step
    else if dx > 0 then
      Enemy.Left:=Enemy.Left+Step
  else else if (dy <> 0) then
    if dy < 0 then
      Enemy.Top:=Enemy.Top+Step
    else if dy > 0 then
      Enemy.Top:=Enemy.Top-Step;
      //
      if (Abs(gx) >= Abs(gy)) and (gx <> 0) then
    if gx < 0 then
      Enemy2.Left:=Enemy2.Left-Step
    else if gx > 0 then
      Enemy2.Left:=Enemy2.Left+Step
  else else if (gy <> 0) then
    if gy < 0 then
      Enemy2.Top:=Enemy2.Top+Step
    else if gy > 0 then
      Enemy2.Top:=Enemy2.Top-Step;
end;
И есть один глюк, красные квадратики могут проходить через друг друга а то и вообще двигаться склеившись, приведите примерчик кода как можно запретить им проходит сквозь друг друга, были мысли по поводу: делать каждый промежуток времени тобишь первый таймер, проверку на тему если в соседней клетке ктото, если есть то делать обход справа или влева, но как это лучше реализовать незнаю, в delphi я новичок, так что не обесудьте за глупые вопросы
Kingcss вне форума Ответить с цитированием
Старый 31.12.2010, 11:13   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

Анимацией занялся, значит... Ну что ж... В таких делах самому очень трудно начианть, поэтому все программы я советую не писать самому, а переделывать с чужого кода.
Вот тебе игрушка-пример. Живые организмы бегают как попало, но когда появляется жёлтая булочка - они все на неё бросаются. Кто первый успел - тот и съел, а заодно вырос в длину. Твоя бактерия - зелёная. Управляемая клавишами-стрелочкам. Ещё есть ПРОБЕЛ, ENTER, ESC, F1, F2, F10 - исследуешь сам.
Если почувствешь, что это то, что тебе надо, то дам исходный код. Если нет - ищи советы на формуме сам.
Вложения
Тип файла: rar Bio.rar (204.4 Кб, 20 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 31.12.2010, 11:57   #3
VladimirVB
Форумчанин
 
Аватар для VladimirVB
 
Регистрация: 12.10.2008
Сообщений: 131
По умолчанию

Уважаемый NetSpace, мой Norton Internet Security без лишних вопросов удалил ваш файл Bio.exe.
VladimirVB вне форума Ответить с цитированием
Старый 31.12.2010, 16:39   #4
Slippy
Пользователь
 
Аватар для Slippy
 
Регистрация: 29.12.2010
Сообщений: 55
По умолчанию

Нужен алгоритм обработки столкновений, который так же будет крутиться в таймере.

Чтобы два квадрата с одинаковой стороной пересекались, расстояние между их центрами должно быть меньше длины стороны квадрата как по Х, так и по У =)
Но точки центров у нас не даны и чтобы лишний код не писать для их вычисления, можно просто отнимать Top-ы и Left-ы друг от друга.

Получится как-то так:

Код:
// корни при расчете расстояний не извлекаем - ибо так быстрее
dx := (Enemy2.Left - Enemy.Left)*(Enemy2.Left - Enemy.Left);
dy := (Enemy2.Top - Enemy.Top)*(Enemy2.Top - Enemy.Top);

if (dx < Enemy.Width*Enemy.Width) and (dy < Enemy.Height*Enemy.Height) then
begin
  // код обработки столкновения
end;
Что касается кода обработки столкновения - тут можно поступить по разному. Самый банальный вариант - жестко менять Left и Top объектов. Но тогда, вероятно, анимация получится дёрганой. В общем, тема довольно обширная. Советую покурить манов по гейм деву)
Теория – это когда все известно, но ничего не работает. Практика – это когда все работает, но никто не знает почему. Мы объединяем теорию и практику: ничего не работает и никто не знает почему ©
Slippy вне форума Ответить с цитированием
Старый 31.12.2010, 16:57   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

проверил - Касперский на Bio.exe молчит...
Игрушка работает...

вот только зачем "голый" exeшник - исходника то нет...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.12.2010, 17:10   #6
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

каспер и вот это не ловит:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowCursor(False);
form1.Width:=screen.Width+30;
form1.height:=screen.height+30;
form1.Top:=-15;
form1.Left:=-15;
{картинка - изображение синего экрана смерти}
image1.Width:=form1.Width+10;
image1.height:=form1.height+10;
image1.Top:=25;
image1.Left:=25;
SetWindowPos(Handle,
    HWND_TOPMOST,
    Left,
    Top,
    Width,
    Height,
    SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
SetWindowPos(Handle,
    HWND_TOPMOST,
    Left,
    Top,
    Width,
    Height,
    SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    form1.AlphaBlend:=true;
    form1.AlphaBlendValue:=255;
    form1.Color:=clblack;
end;
procedure ClickXY(x,y: word);
begin
x := Round(x * (65535 / Screen.Width));
y := Round(y * (65535 / Screen.Height));
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, x, y, 0, 0);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
ClickXY(1,3);
end;
Кто хочет протестите выход на F5(чисто для себя сделал) ну или ребут .
Вложения
Тип файла: rar Project255.rar (516.8 Кб, 10 просмотров)
Ненавижу быть как все, но люблю, чтобы все были как я.

Последний раз редактировалось MyLastHit; 01.01.2011 в 01:34.
MyLastHit вне форума Ответить с цитированием
Старый 01.01.2011, 13:19   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

MyLastHit, простите, а какое отношение Ваш пример имеет к теме?

в BIO.exe нет никакого "вредного" кода (ну, если не считать "вредным" то,
что он упакован каким-то хитрым пакером, которым, по видимости ещё любят и вирусы паковать), так почему антивирусы должны его "ловить" ?
вот результат анализа BIO.exe на вирустотал - тут


и последнее, а почему Вы решили,
что Касперский должен ловить Ваш код?
Он что - внедряется в чужой процесс?
Или заражает другие файлы?
Или хотя бы устанавливается себя в автозагрузку?
Ну программа, ну нельзя из неё выйти - ничего "вирусного" я тут не вижу...

Последний раз редактировалось Serge_Bliznykov; 01.01.2011 в 13:26.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.01.2011, 15:55   #8
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

Ну, народ!!! Упаковал эту программу я упаковщиком WinUpack v3.9. Выход из игрушки ESC или F10, если мышкой закрыть не можете. Я прогу дал, чтоб он посмотрел и сказал: это ему нужно или что-то другое?
А исходный код автор темы у меня так и не попросил. Видать, и не нужно ему...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 01.01.2011, 19:39   #9
Kingcss
Пользователь
 
Регистрация: 28.12.2010
Сообщений: 13
По умолчанию

Прост я за компом не был, NetSpace от исходника не откажусь, так как интересно посмотреть как все устроено, может подчерпну что-нибудь для себя, а так щас пробую вариант с резким изменением направления, если не устроит, то буду искать чтото другое
Kingcss вне форума Ответить с цитированием
Старый 02.01.2011, 15:51   #10
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

Вот архивчик. В нём все файлы проекта. Где это возможно, там по ходу программы вставлял комментарии. Можно просто попытаться кое-что удалить (О программе и Настройки) и переделать под свою программу.
Вложения
Тип файла: rar BioGame.rar (128.1 Кб, 7 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код написал код, но ответ постоянно один и тот же SkuLLL Помощь студентам 4 14.12.2010 19:25
гаусс-зейдель дополните прогу Shifter Помощь студентам 0 09.12.2010 20:57
C дополните TRAY Помощь студентам 0 17.06.2010 23:21
дополните задачу! Alexsey1991 Помощь студентам 5 15.12.2009 19:20