Бара Магна

Объявление

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Бара Магна » Творчество » Lego Mad Head (исходный код открыт!)


Lego Mad Head (исходный код открыт!)

Сообщений 51 страница 60 из 77

1

Lego Mad Head

Это моя первая игра! Прошу не судить строго, ибо это чисто ради эксперимента и изучения языка программирования Delphi. Признаю, она - УГ, и ничего я с этим сделать не могу.

Краткое описание:
Данная игра является аналогом древней аркадной игры "Pong", о которой можно почитать на Википедии. Единственное, пожалуй изменение: вместо мяча на экране отображается "бешеная" Лего голова (которую можно выбрать при старте; 4 на выбор), а вместо платформ - кирпичики Лего! =) В остальном всё так же. Игра будет интуитивно понятна любому игроку, любого возраста и с любым опытом в видеоиграх.

Скриншоты (v1.1):
http://s2.ipicture.ru/uploads/20120426/thumbs/5xcRDxKh.bmp
http://s2.ipicture.ru/uploads/20120424/thumbs/fzrXDL0Z.jpg

Управление:
Enter - старт/пауза
N - начать новую игру
В режиме "Человек против ПК":
Arrow Up/Down - управление платформой игрока
В режиме "Человек против Человека":
W/S - управление платформой игрока 1
Arrow Up/Down - управление платформой игрока 2

Системные требования:
Windows XP или выше (32-bit), к остальным параметрам игра не требовательна.

Изменения в версии 1.0:
- Добавлен локальный мультиплеер (2 игрока)!
- Добавлена возможность создания новой игры без перезагрузки приложения
- Добавлена функция паузы

Изменения в версии 1.1:
- Исправлены некоторые ошибки физики и оформления
- Добавлена новая "голова"

Скачать [v1.1] (файл .exe 2,1 Мбайт)
Скачать [v1.0] (файл .exe 2 Мбайт)
Скачать [v0.1b] (RAR-архив 235 Кб, после вскрытия 2 Мбайт)

Исходный код можно почитать здесь.

Отредактировано fred-sable (03.06.2012 16:39:00)

0

51

Эгнос, к сожалению, Федя больше не будет работать над этой игрой.

0

52

Эгнос
Малум правильно сказал. Над этой игрой я больше не работаю. Сейчас я потихоньку создаю экшн-эдвенчуру про Великие Архивы (спойлер ^^).
Но на замечания отвечу:
1.Баг с Хау я не замечал в сингле, а вот мультиплеер лагает, это так.
2.Как? 1:9999? Вообще не понимаю, что произошло.
3.Ракетка должна идти медленее головы, иначе проиграть будет невозможно. Скорость головы в ~1,5 раза больше скорости ракетки.
http://99px.ru/sstorage/1/2010/11/image_11111101708266329029.jpg

0

53

Внимание! Для всех ругающихся, я решил открыть исходный код! Захотите оптимизировать - флаг вам в руки!

Код окна сингл плеера:

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls, Spin;

type
  TForm2 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Label1: TLabel;
    Timer1: TTimer;
    Label2: TLabel;
    Timer2: TTimer;
    Image4: TImage;
    procedure Timer1Timer(Sender: TObject);
    procedure Vector();
    procedure Timer2Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  Image1: TImage;
  Image2: TImage;
  Image3: TImage;
  P: Integer;
  C: Integer;
  X: Integer;
  Y: Integer;
  Pause: Boolean;
implementation

{$R *.dfm}


procedure TForm2.Timer1Timer(Sender: TObject);
begin
   Vector();
   if C > 9 then
     Label2.Caption:= 'Компьютер выиграл!';
   if P > 9 then
     Label2.Caption:= 'Игрок выиграл!';
   if Label2.Caption <> '' then
     Timer1.Enabled:= False;
   if (Image4.Left <= 22) or (Image4.Left >= Image3.Left - 34) then
     Image1.Top:= 400;
   if (Image1.Left < 15) or (Image1.Left > 425) then
   begin
     Image4.Left:= 224;
     Image4.Top:= 168;
   end;
end;


procedure TForm2.Vector();
begin
   if Image1.Left < 16 then
   begin
     C:= C + 1;
     Timer2.Enabled:= True;
     Timer1.Enabled:= False;
   end;
   if Image1.Left > 424 then
   begin
     P:= P + 1;
     Timer2.Enabled:= True;
     Timer1.Enabled:= False;
   end;
   Label1.Caption:= IntToStr(P) + ' : ' + IntToStr(C);

   Image4.Left:= Image4.Left - X;
   Image4.Top:= Image4.Top - Y;

   Image1.Left:= Image4.Left;
   Image1.Top:= Image4.Top;

   if (Image4.Left <= Image2.Left + 21) and (Image4.Top >= Image2.Top - 31)
   and (Image4.Top <= Image2.Top + 111) then
   begin
     X:= (-4);
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image4.Left >= Image3.Left - 33) and (Image4.Top >= Image3.Top - 31)
   and (Image4.Top <= Image3.Top + 111) then
   begin
     X:= 4;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;

   if (Image4.Top >= Image2.Top - 31) and (Image4.Top <= Image2.Top + 20) and (Image4.Left = Image2.Left + 21) then
   begin
     Y:= 4;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image4.Top <= Image2.Top + 79) and (Image4.Top >= Image2.Top + 60) and (Image4.Left = Image2.Left + 21) then
   begin
     Y:= (-4);
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image4.Top <= Image3.Top -31) and (Image4.Top >= Image3.Top + 20) and (Image4.Left = Image3.Left - 33) then
   begin
     Y:= 4;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image4.Top <= Image3.Top + 79) and (Image4.Top >= Image3.Top + 60) and (Image4.Left = Image3.Left - 33) then
   begin
     Y:= (-4);
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;

   if (Image1.Top > Image2.Top + 20) and (Image1.Top < Image2.Top + 60) and (Image1.Left = Image2.Left + 21) then
   begin
     Y:= 0;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image1.Top > Image3.Top + 20) and (Image1.Top < Image2.Top + 60) and (Image1.Left = Image2.Left - 33) then
   begin
     Y:= 0;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;

   if (Image4.Top >= 334) or (Image4.Top <= 0) then
    Y:= -Y;

   if Image4.Top + 17 > Image3.Top + 40 then
    Image3.Top:= Image3.Top + 2;
   if Image4.Top + 17 < Image3.Top + 40 then
    Image3.Top:= Image3.Top - 2;
end;

procedure TForm2.Timer2Timer(Sender: TObject);
begin
  Vector();
  Timer2.Enabled:= False;
  Timer1.Enabled:= True;
end;

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_UP then
    Image2.Top:= Image2.Top - 10;
  if Key = VK_DOWN then
    Image2.Top:= Image2.Top + 10;
  if (Key = 13) and (Pause = true) then
  begin
    Label2.Caption:= '';
    Timer1.Enabled:= true;
    Pause:= false;
  end else if (Key = 13) and (Pause = false) then
  begin
    Label2.Caption:='Пауза';
    Timer1.Enabled:= false;
    Pause:= true;
  end;
  if Key = 78 then
  begin;
    Label1.Caption:= '0 : 0';
    Label2.Caption:= 'Нажмите ENTER для старта';
    C:= 0;
    P:= 0;
    Pause:= true;
    Image4.Left:= 224;
    Image4.Top:= 168;
    Timer1.Enabled:= false;
    Vector();
  end;
  if Image2.Top <= 0 then
    Image2.Top:= 0;
  if Image2.Top + Image2.Height >= 366 then
    Image2.Top:= 366 - Image2.Height;
  if Image3.Top <= 0 then
    Image3.Top:= 0;
  if Image3.Top + Image3.Height >= 366 then
    Image3.Top:= 366 - Image3.Height;
end;

begin
C:= 0;
P:= 0;
X:= 3;
Y:= 0;
Pause:= true;
end.

У всех окон в сингл плеере такой код, меняем только номер юнита и формы.

Код окна мультиплеера:

Код:
unit Unit9;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls, Spin;

type
  TForm9 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Image4: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure Vector();
    procedure Timer2Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form9: TForm;
  Image1: TImage;
  Image2: TImage;
  Image3: TImage;
  P: Integer;
  C: Integer;
  X: Integer;
  Y: Integer;
  Pause: Boolean;
implementation

{$R *.dfm}


procedure TForm9.Timer1Timer(Sender: TObject);
begin
   Vector();
   if C > 9 then
     Label2.Caption:= 'Игрок 2 выиграл!';
   if P > 9 then
     Label2.Caption:= 'Игрок 1 выиграл!';
   if Label2.Caption <> '' then
     Timer1.Enabled:= False;
   if (Image4.Left <= 22) or (Image4.Left >= Image3.Left - 34) then
     Image1.Top:= 400;
   if (Image1.Left < 15) or (Image1.Left > 425) then
   begin
     Image4.Left:= 224;
     Image4.Top:= 168;
   end;
end;


procedure TForm9.Vector();
begin
   if Image1.Left < 16 then
   begin
     C:= C + 1;
     Timer2.Enabled:= True;
     Timer1.Enabled:= False;
   end;
   if Image1.Left > 424 then
   begin
     P:= P + 1;
     Timer2.Enabled:= True;
     Timer1.Enabled:= False;
   end;
   Label1.Caption:= IntToStr(P) + ' : ' + IntToStr(C);

   Image4.Left:= Image4.Left - X;
   Image4.Top:= Image4.Top - Y;

   Image1.Left:= Image4.Left;
   Image1.Top:= Image4.Top;

   if (Image4.Left <= Image2.Left + 21) and (Image4.Top >= Image2.Top - 31)
   and (Image4.Top <= Image2.Top + 111) then
   begin
     X:= (-4);
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image4.Left >= Image3.Left - 33) and (Image4.Top >= Image3.Top - 31)
   and (Image4.Top <= Image3.Top + 111) then
   begin
     X:= 4;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;

   if (Image4.Top >= Image2.Top - 31) and (Image4.Top <= Image2.Top + 20) and (Image4.Left = Image2.Left + 21) then
   begin
     Y:= 4;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image4.Top <= Image2.Top + 79) and (Image4.Top >= Image2.Top + 60) and (Image4.Left = Image2.Left + 21) then
   begin
     Y:= (-4);
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image4.Top <= Image3.Top -31) and (Image4.Top >= Image3.Top + 20) and (Image4.Left = Image3.Left - 33) then
   begin
     Y:= 4;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image4.Top <= Image3.Top + 79) and (Image4.Top >= Image3.Top + 60) and (Image4.Left = Image3.Left - 33) then
   begin
     Y:= (-4);
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;

   if (Image1.Top > Image2.Top + 20) and (Image1.Top < Image2.Top + 60) and (Image1.Left = Image2.Left + 21) then
   begin
     Y:= 0;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;
   if (Image1.Top > Image3.Top + 20) and (Image1.Top < Image2.Top + 60) and (Image1.Left = Image2.Left - 33) then
   begin
     Y:= 0;
     Timer1.Enabled:= False;
     Timer2.Enabled:= True;
   end;

   if (Image4.Top >= 334) or (Image4.Top <= 0) then
    Y:= -Y;

end;

procedure TForm9.Timer2Timer(Sender: TObject);
begin
  Vector();
  Timer2.Enabled:= False;
  Timer1.Enabled:= True;
end;

procedure TForm9.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_UP then
    Image3.Top:= Image3.Top - 10;
  if Key = VK_DOWN then
    Image3.Top:= Image3.Top + 10;
  if Key = 87 then
    Image2.Top:= Image2.Top - 10;
  if Key = 83 then
    Image2.Top:= Image2.Top + 10;
  if (Key = 13) and (Pause = true) then
  begin
    Label2.Caption:= '';
    Timer1.Enabled:= true;
    Pause:= false;
  end else if (Key = 13) and (Pause = false) then
  begin
    Label2.Caption:='Пауза';
    Timer1.Enabled:= false;
    Pause:= true;
  end;
  if Key = 78 then
  begin;
    Label1.Caption:= '0 : 0';
    Label2.Caption:= 'Нажмите ENTER для старта';
    C:= 0;
    P:= 0;
    Pause:= true;
    Image4.Left:= 224;
    Image4.Top:= 168;
    Timer1.Enabled:= false;
    Vector();
  end;
  if Image2.Top <= 0 then
    Image2.Top:= 0;
  if Image2.Top + Image2.Height >= 366 then
    Image2.Top:= 366 - Image2.Height;
  if Image3.Top <= 0 then
    Image3.Top:= 0;
  if Image3.Top + Image3.Height >= 366 then
    Image3.Top:= 366 - Image3.Height;
end;

begin
C:= 0;
P:= 0;
X:= 3;
Y:= 0;
Pause:= true;
end.

Всё то же самое, здесь изменения только в FormKeyDown(), а также убран код бота.

Подсказки:
* Image1 - изображение головы
* Image2 - изображение левой платформы
* Image3 - изображение правой платформы
* Image4 - изображение "удивлённой" головы
* C - очки компьютера или игрока 2 в мультиплеере
* P - очки игрока 1
Всё остальное, думаю, будет понятно.

0

54

Я так и не понял по какому принципу ты делал ЭТО...

0

55

Тоа Куфута написал(а):

Я так и не понял по какому принципу ты делал ЭТО...

Delphi зубрить надо, чтобы понять))

0

56

К стати о Delphi, у Седьмой версии какой-то странный интерфейс. Это у меня одного он состоит из множества отдельных окон?

0

57

Onumaru написал(а):

К стати о Delphi, у Седьмой версии какой-то странный интерфейс. Это у меня одного он состоит из множества отдельных окон?

Нет, у меня тоже. И мне так удобнее.

0

58

Только сейчас заметил, что в коде Image4 указан только в type,  а в var нету! Странно...

0

59

Onumaru написал(а):

К стати о Delphi, у Седьмой версии какой-то странный интерфейс. Это у меня одного он состоит из множества отдельных окон?

Да, так и есть. Начиная с какой-то версии в IDE можно изменить вид, т. е. все в одно окно. А в новых версиях всё в одном окне по-умолчанию.

0

60

Malum написал(а):

Да, так и есть. Начиная с какой-то версии в IDE можно изменить вид, т. е. все в одно окно. А в новых версиях всё в одном окне по-умолчанию.

Мне в одном окне неудобно. Поэтому чаще я работаю в Делфи 7, нежели в РАД Стьюдио.

0


Вы здесь » Бара Магна » Творчество » Lego Mad Head (исходный код открыт!)