Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Игра Блоки, Вопрос 
:(
    Опции темы
CODARZ
  Дата 13.12.2003, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 3.10.2003
Где: Москва

Репутация: нет
Всего: нет



В моей игре "Блоки" есть такая процедура, которая проверяет
чтобы блок перестал падать если упал на землю или на другой блок,
вот она:


Код

procedure BlockDown;
var
 i,OccupY: integer;
begin

 for i := 0 to 200 do
 begin
   if Blocks[BlocksCount].y = Blocks[i].y-16 then
   OccupY := Blocks[i].y;
 end;

 if (Blocks[BlocksCount].y <> OccupY - 16) or (Blocks[BlocksCount].y < 368) then
 Blocks[BlocksCount].y := Blocks[BlocksCount].y + 16
 else
 begin
   Blocks[BlocksCount].y := 368;
   AddBlock(0,0,0,true);
 end;
 
 DrawBlocks;
end;


Так вот, у меня не получается изменить процедуру до такого вида,
чтобы блоки останавливались как только коснутся земли или
другого блока.

Может кто поопытнее и знает? Может у вас получится...

Это сообщение отредактировал(а) CODARZ - 13.12.2003, 21:33
PM MAIL WWW ICQ   Вверх
dm9
Дата 14.12.2003, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Ты бы выложил сюда всю программу. По одной процедурке сложно что-то понять smile.gif
PM MAIL ICQ   Вверх
dvs
Дата 14.12.2003, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Владимир Драпалюк
**


Профиль
Группа: Участник Клуба
Сообщений: 660
Регистрация: 25.8.2003
Где: Воронеж->Москв а

Репутация: нет
Всего: 19



Точно, Dm9 прав - Давай все, а так, много вопросов что и для чего!


--------------------
Любите друг друга!
PM MAIL WWW ICQ   Вверх
CODARZ
Дата 14.12.2003, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 3.10.2003
Где: Москва

Репутация: нет
Всего: нет



сек

Это сообщение отредактировал(а) CODARZ - 14.12.2003, 16:36
PM MAIL WWW ICQ   Вверх
CODARZ
Дата 14.12.2003, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 3.10.2003
Где: Москва

Репутация: нет
Всего: нет



ОК, вот полный код.

Main.pas

Код

unit Main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, TetroTypes, TetroProcs, ImgList, DXInput, Buttons;

type
 TMainForm = class(TForm)
   Timer1: TTimer;
   SpeedButton1: TSpeedButton;
   GameCanvas: TImage;
   BlockList: TImageList;
   procedure Timer1Timer(Sender: TObject);
   procedure SpeedButton1Click(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
 BlockDown;
end;

procedure TMainForm.SpeedButton1Click(Sender: TObject);
begin
 CreateBlocks;
 DrawBlocks;
 Timer1.Enabled := true;
end;

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if (Key = (VK_RIGHT)) and (Blocks[BlocksCount].x<240) then
 Blocks[BlocksCount].x := Blocks[BlocksCount].x + 16;
 if (Key = (VK_LEFT)) and (Blocks[BlocksCount].x>0) then
 Blocks[BlocksCount].x := Blocks[BlocksCount].x - 16;
 if (Key = (VK_DOWN)) and (Blocks[BlocksCount].y<>368) then
 Blocks[BlocksCount].y := Blocks[BlocksCount].y + 16;
 DrawBlocks;
end;

end.


TetroTypes.pas

Код

unit TetroTypes;

interface

type
 TBlock = class
   x,y: integer;
   img: integer;
   Live: boolean;
   constructor Create;
   procedure Kill;
end;  

var
 Blocks: array[0..200] of TBlock;
 BlocksCount: integer = 0;

implementation

constructor TBlock.Create;
begin
 x := 0;
 y := 0;
 img := random(1);
 Live := true;
end;

procedure TBlock.Kill;
begin
 Live := false;
end;

end.



TetroProcs.pas

Код

unit TetroProcs;

interface

uses
 TetroTypes, Graphics, Windows;

procedure CreateBlocks;
procedure DrawBlocks;
procedure AddBlock(x,y,img: integer;Live: boolean);
procedure BlockDown;

implementation

uses
 Main;

procedure CreateBlocks;
var
 i: integer;
begin
 for i := 0 to 200 do
 begin
   Blocks[i] := TBlock.Create;
 end;
end;

procedure DrawBlocks;
var
 i: integer;
begin
 with MainForm do
 begin
   GameCanvas.Canvas.Brush.Color := clBlack;
   GameCanvas.Canvas.FillRect(ClientRect);
   for i := 0 to 200 do
   BlockList.Draw(GameCanvas.Canvas,Blocks[i].x,Blocks[i].y,Blocks[i].img);
 end;
end;

procedure AddBlock(x,y,img: integer;Live: boolean);
begin
 BlocksCount := BlocksCount + 1;
 Blocks[BlocksCount] := TBlock.Create;
 Blocks[BlocksCount].x := x;
 Blocks[BlocksCount].y := y;
 Blocks[BlocksCount].img := img;
 Blocks[BlocksCount].Live := Live;
end;

procedure BlockDown;
var
 i,OccupY: integer;
begin

 for i := 0 to 200 do
 begin
   if Blocks[BlocksCount].y = Blocks[i].y-16 then
   OccupY := Blocks[i].y;
 end;

 if (Blocks[BlocksCount].y <> OccupY - 16) or (Blocks[BlocksCount].y < 368) then
 Blocks[BlocksCount].y := Blocks[BlocksCount].y + 16
 else
 begin
   Blocks[BlocksCount].y := 368;
   AddBlock(0,0,0,true);
 end;
 
 DrawBlocks;
end;

end.


Это сообщение отредактировал(а) CODARZ - 14.12.2003, 16:43
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.