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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2008, 19:36   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию Подскажите с управлением в "Змейке".

Народ, пожалуйста помогите.
Пытаюсь написать игру "Змейка". В качестве тела змеии использую массив из компонентов TShape (создаю их в отдельной процедуре - конструктором).

Сама змейка движется, только вот когда управляешь ей, она НЕ правильно движется. Например при движении вверх все Shape'ы начинают вдигатся вместе не поварачивая. А нада как в обычной змейке, что бы она умела поворачивать.

Проблема : как сделать управление змейкой (Вверх, Вниз, Вправо, Влево) что бы она правильно поворачивала???

Вот то что я уже написал:

Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    MainMenu1: TMainMenu;
    Main: TMenuItem;
    NewGames: TMenuItem;
    N1: TMenuItem;
    Exit: TMenuItem;
    Cpravka: TMenuItem;
    About_program: TMenuItem;
    Image1: TImage;
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Vpravo();
    procedure VLevo();
    procedure VVerx();
    procedure Vniz();
    procedure CreateUdav();
  end;
const
  shag = 10;
var
  Form1: TForm1;
  napravlenie: string[1];
  mas:array[0..999] of TShape;
  i:integer;
implementation
uses MaskUtils, Math;
{$R *.dfm}
procedure TForm1.CreateUdav();
begin
for i:=0 to 2 do
begin
  mas[i]:=TShape.Create(self);
  mas[i].Left:=150;
  mas[i].Width:=10;
  mas[i].Height:=10;
  mas[i].Left:=mas[i].Left+i*10;
  mas[i].Top:=150;
  mas[i].Parent:=Form1;
end;
end;
procedure TForm1.Vpravo();
begin
for i:=0 to 2 do
  mas[i].Left:=mas[i].Left+shag;
end;
procedure TForm1.VLevo();
begin
for i:=0 to 2 do
  mas[i].Left:=mas[i].Left-shag;
end;
procedure TForm1.VVerx();
begin
for i:=0 to 2 do
  mas[i].Top:=mas[i].Top-shag;
end;
procedure TForm1.Vniz();
begin
for i:=0 to 2 do
  mas[i].Top:=mas[i].Top+shag;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if napravlenie = 'R' then Vpravo;
  if napravlenie = 'L' then VLevo;
  if napravlenie = 'D' then Vniz;
  if napravlenie = 'U' then VVerx;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case key of
vk_RIGHT: napravlenie:='R';
VK_LEFT:  napravlenie:='L';
vk_DOWN:  napravlenie:='D';
VK_UP:    napravlenie:='U';
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
napravlenie := 'L';
CreateUdav();
end;
end.
Вот прикрепил исходник.
Подскажите плз.
Вложения
Тип файла: rar Games.rar (167.4 Кб, 35 просмотров)
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 19.12.2008, 20:30   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Я делал когда-то змейку. Сейчас и не вспомню уже как я реализовал этот механизм. Принцип такой, что с каждым шагом, координаты одной части змеи переходят в следующую, а новые получает только голова. То есть с клавиатуры управляется голова, а все тело получает предыдущие координаты. Можно в цикле это сделать, тогда нужно чтобы части змеи представляли из себя массив.

Вот для примера событие смены координат головы, все условно, mas - элемент змеи, n - новые координаты
Код:
//сначала меняем координаты элементов
for i:=Length(mas)-1 downto 1 do
  mas[i]:=mas[i-1];
//после этого можно поменять координаты головы
mas[0]:=n;
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; 19.12.2008 в 20:40.
mutabor вне форума Ответить с цитированием
Старый 19.12.2008, 21:43   #3
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Если хорошо приглядеться, то у змейки в процессе движения прибавляется 1 клетка вначале и убирается последняя. В момент роста просто не происходит укорачивание.
Если все таки хотите делать массивом а не списком, советую перемещать последний элемент вначало - те сдвигать массив.
Так вы избавитесь от лишних перерисовок.
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 19.12.2008, 22:02   #4
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Вот вам наглядный пример змейки:Zme.zip
В нём вы сможете посмотреть как что реализуется.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 19.12.2008, 23:17   #5
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

все, уже готово управление, спасибо за советы.
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 20.12.2008 в 20:12.
spamer вне форума Ответить с цитированием
Старый 20.12.2008, 20:12   #6
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Народ может кто подскажет еще. как сделать что бы змея что то съедала и увеличивалась???
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 20.12.2008, 22:06   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Ну так говорили уже, когда съедает то хвост не удалять и она станет длиннее.
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 вне форума Ответить с цитированием
Старый 31.12.2008, 12:18   #8
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
По умолчанию

Вот как то от скуки на работе набросал простеньную змейку...
Всё работает, познавательно будет посмотреть
Вложения
Тип файла: rar Змейка.rar (2.3 Кб, 59 просмотров)
=LeonZone= вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите ссылку на примеры к книге Архангельского "Программирование в Делфи7". SkAndrew Свободное общение 0 24.11.2008 12:17
Подскажите плз, как распаковать ".tar.gz"? Gauss Софт 6 10.10.2008 00:00
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49