Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


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

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 в 21:18.
Grenade вне форума   Ответить с цитированием
Старый 03.03.2010, 21:20   #2
Selestis
Участник клуба
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Адрес: Самара
Сообщений: 719
Репутация: 268
По умолчанию

Можете сделать двумерный массив Shap'ов и просто менять цвета нужных вам просто обращаясь к индексам, нужным вам.
Код:

Tiles[i,j].Brush.Color:=$FFFF0000

Selestis вне форума   Ответить с цитированием
Старый 03.03.2010, 21:28   #3
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
Репутация: 10
По умолчанию

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

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

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

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

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

icq: 401708834
По умолчанию

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

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

Цитата:
Можете сделать двумерный массив Shap'ов и просто менять цвета нужных вам просто обращаясь к индексам, нужным вам.
Плохая идея. Ни к чему это, достаточно динамического массива длиной равным длине тела змеи.

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

Кажется начинаю догонять. Правда в процедуре 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, 21:48   #7
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
Репутация: 10
По умолчанию

Оставшаяся часть программы:
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, 21:57   #8
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
Репутация: 10
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Информация по игре "Змейка" Arions Помощь студентам 9 14.12.2009 18: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 22:17
Ещё одна игра "Змейка" Simply-Art Софт 17 05.07.2007 04:10


16:43.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru