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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2010, 19:11   #1
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
Восклицание Делаю игру "змейка".

Hello world!

Делаю игру "змейка" и нуждаюсь в помощи. Сама змейка сделана (делаю я её через Shape, никаких объектов на форме нет кроме таймера!) :
snake[i] := TShape.Create(Form1); //// указываем ей, что это объект
snake[i].Parent := Form1; /// пишем, кто родитель
snake[i].Shape := stCircle; ///// задаём форму
snake[i].Height := block_height; //// длину
snake[i].Width := block_width; //// ширину
snake[i].Top := 250 + i*20 ; //// где находится на форме
snake[i].Left := 250 ; //// где находится на форме

Проблема в том, что я пока не знаю, как сделать стену (или как ещё называют "препятствия"). Мои соображения: Разделить всю карту 25х25 на условные квадраты по 20 (т.к. один Shape = 20) и пока что просто расставить туда единицы и нули (пока не важно как), и там где есть единица рисовать Shape , там где 0 - ничего не рисовать.

P.S. могу переформулировать вопрос иначе: как вообще сделать эту "стену"? Выслушаю любые разумные предложения!

Уфф.... ну вроде бы вот. Прошу, помогите! Желательно срочно! Заранее спасибо!

Последний раз редактировалось Grenade; 03.03.2010 в 20:18.
Grenade вне форума Ответить с цитированием
Старый 03.03.2010, 20:20   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Можете сделать двумерный массив Shap'ов и просто менять цвета нужных вам просто обращаясь к индексам, нужным вам.
Код:
Tiles[i,j].Brush.Color:=$FFFF0000
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 03.03.2010, 20:28   #3
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
По умолчанию

Когда я писал "змейку" в Borland Pascal, я использовал двумерный массив и всё получилось (правда сама игра была не очень). Здесь у меня тоже есть двумерный массив:

map: array[0..24,0..24]of integer;

Программу я написал также, как и в Pascal'е. Но в Delphi (у меня стоит 2010) он выводит ошибку в этой строчке. С похожей родом проблемами я встречался и приходилось даже переписывать что-то. Я не спорю, возможно я что-то не так делаю....

Если Вам не сложно, не могли бы Вы скинуть мне код, как бы Вы написали это!
Grenade вне форума Ответить с цитированием
Старый 03.03.2010, 20:30   #4
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Ну, таких проблем быть не должно, покажите код, можт поможем-с. Просто так гораздо легче реализовать всё это.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 03.03.2010, 20:31   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

1. Иди в раздел про создание игр, там есть прикрепленная тема с уроками по созданию игр.

2. Про разделение поля на клетки это ты угадал. Это и есть основа таких игр. Сегмент тела змеи или ее добыча занимают одну клетку, так же и стены.

Цитата:
Можете сделать двумерный массив Shap'ов и просто менять цвета нужных вам просто обращаясь к индексам, нужным вам.
Плохая идея. Ни к чему это, достаточно динамического массива длиной равным длине тела змеи.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 03.03.2010 в 20:34.
mutabor вне форума Ответить с цитированием
Старый 03.03.2010, 20:47   #6
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
По умолчанию

Кажется начинаю догонять. Правда в процедуре DrawMap у меня пусто, и пока что писать - я не сильно догадываюсь. Если можете - помогите!
const
block_height = 20;
block_width = 20;
var
Form1: TForm1;
snake: array of TShape;
map: array[0..24,0..24]of integer;
length: integer;
direction: array of byte; // 1- left, 2- up, 3-right, 4- down
OldDir : byte;
NewDir : byte;
food: TShape;
implementation
procedure DrawMap();
var
i : integer;
j : integer;
temp : TShape;
begin

end;
procedure Move();
var
i : integer;
Key : word;
begin
for i:=length-1 downto 1 do
direction[i] := direction[i-1];
for i:=0 to length-1 do
begin
case direction[i] of
1: snake[i].Left:=snake[i].Left - 20;
2: snake[i].Top:=snake[i].Top - 20;
3: snake[i].Left:=snake[i].Left + 20;
4: snake[i].Top:=snake[i].Top + 20;
end;
end;
if OldDir<>NewDir then
begin
case NewDir of
1: key := vk_Left;
2: key := vk_up;
3: key := vk_right;
4: key := vk_down;
end;
UpdateDirection(Key);
end;
OldDir := direction[0];
end;
procedure AddSegment();
var
i : integer;
begin
length := length + 1;
SetLength(snake,length);
SetLength(direction,length);
snake[length-1] := TShape.Create(Form1);
snake[length-1].Parent := Form1;
snake[length-1].Shape := stCircle;
snake[length-1].Height := block_height;
snake[length-1].Width := block_width;
direction[length-1] := direction[length-2];
case direction[length-2] of
1: begin
snake[length-1].Top := snake[length-2].Top;
snake[length-1].Left := snake[length-2].Left +20;
end;
2: begin
snake[length-1].Top := snake[length-2].Top + 20;
snake[length-1].Left := snake[length-2].Left;
end;
3: begin
snake[length-1].Top := snake[length-2].Top;
snake[length-1].Left := snake[length-2].Left -20;
end;
4: begin
snake[length-1].Top := snake[length-2].Top - 20;
snake[length-1].Left := snake[length-2].Left;
end;
end;
end;
procedure UpdateDirection(Key : word);
begin
if ( direction[0] = 0 ) then
begin
if (Key = vk_up) then
begin
direction[0] := 2;
direction[1] := 2;
direction[2] := 2;
direction[3] := 2;
end;
end else
if ( Key = vk_Left ) and ( direction[0] = 2 ) then
begin
snake[0].Left := snake[0].Left - 20;
snake[0].Top := snake[0].Top + 20;
direction[0] := 1;
end else
if ( Key = vk_Left ) and ( direction[0] = 4 ) then
begin
snake[0].Left := snake[0].Left - 20;
snake[0].Top := snake[0].Top - 20;
direction[0] := 1;
end else
if ( Key = vk_Right ) and ( direction[0] = 2 ) then
begin
snake[0].Left := snake[0].Left + 20;
snake[0].Top := snake[0].Top + 20;
direction[0] := 3;
end else
if ( Key = vk_Right ) and ( direction[0] = 4 ) then
begin
snake[0].Left := snake[0].Left + 20;
snake[0].Top := snake[0].Top - 20;
direction[0] := 3;
end else
if ( Key = vk_Down ) and ( direction[0] = 1) then
begin
snake[0].Left := snake[0].Left + 20;
snake[0].Top := snake[0].Top + 20;
direction[0] := 4;
end else
if ( Key = vk_Down ) and ( direction[0] = 3) then
begin
snake[0].Left := snake[0].Left - 20;
snake[0].Top := snake[0].Top + 20;
direction[0] := 4;
end else
if ( Key = vk_Up ) and ( direction[0] = 1) then
begin
snake[0].Left := snake[0].Left + 20;
snake[0].Top := snake[0].Top - 20;
direction[0] := 2;
end else
if ( Key = vk_Up ) and ( direction[0] = 3) then
begin
snake[0].Left := snake[0].Left - 20;
snake[0].Top := snake[0].Top - 20;
direction[0] := 2;
end;
end;
Grenade вне форума Ответить с цитированием
Старый 03.03.2010, 20:48   #7
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
По умолчанию

Оставшаяся часть программы:
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
length := 2;
SetLength(direction,length);
SetLength(snake,length);
for i := 0 to length-1 do
begin
snake[i] := TShape.Create(Form1);
snake[i].Parent := Form1;
snake[i].Shape := stCircle;
snake[i].Height := block_height;
snake[i].Width := block_width;
snake[i].Top := 250 + i*20 ;
snake[i].Left := 250 ;
direction[i] := 0;
end;
OldDir:=1;
NewDir:=1;
map := [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0]; //// Здесь вместо единичек должны быть Shap'ы в процедуре DrawMap();
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
i:integer;
begin
for i := 0 to length-1 do
snake[i].Free;

end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
i : integer;
begin
case Key of
vk_left: newdir:=1;
vk_right: newdir:=3;
vk_up: newdir:=2;
vk_down: newdir:=4;
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
AddSegment();
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Move();
end;
end.
Grenade вне форума Ответить с цитированием
Старый 03.03.2010, 20:57   #8
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
По умолчанию

P.S. извините, что без Enter'ов и пробелов, Не хватило места....
Grenade вне форума Ответить с цитированием
Старый 04.03.2010, 16:33   #9
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Для кодов на форуме есть тег CODE.
Вадим Буренков вне форума Ответить с цитированием
Старый 05.03.2010, 14:55   #10
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
По умолчанию

Да, поспешил
Grenade вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Информация по игре "Змейка" Arions Помощь студентам 9 14.12.2009 17:28
Делаю игру "Tanks" 3D anyx Gamedev - cоздание игр: Unity, OpenGL, DirectX 19 20.09.2009 20:55
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Помогите с игрой "Змейка". spamer Общие вопросы Delphi 2 26.12.2008 21:17
Ещё одна игра "Змейка" Simply-Art Софт 17 05.07.2007 04:10