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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2007, 15:38   #1
-=DeS=-
Форумчанин
 
Аватар для -=DeS=-
 
Регистрация: 20.12.2006
Сообщений: 135
Стрелка Уроки по созданию игр для новичков...

В этом уроке я научу вас как можно передвигать обьекты по форме с помощью клавиш...
--------------------------
Начнём.
1)Создайте новый проект File> New> Application
2)Теперь киньте на форму объект TShape
3)После этого выбираем в Object TreeView форму (Form1)
4)В Object inspector на вкладке Events ищем свойство OnKeyDown и щёлкаем на него 2 раза.
5)В созданной процедуре пишем код (я рекомендую вам не просто копировать а понять как это работает!)
Цитата:
if key=VK_UP then Shape1.Top:=Shape1.Top-2;
Этот код будет двигат фигуру Shape1 на 2 пиксела вверх!
---------------------------
Попробуйте сами написать движение вниз, вправо, влево...
Позже и это будет показано!
writeln('Hello Dude!!!');
-=DeS=- вне форума Ответить с цитированием
Старый 12.01.2007, 21:52   #2
-=DeS=-
Форумчанин
 
Аватар для -=DeS=-
 
Регистрация: 20.12.2006
Сообщений: 135
По умолчанию

Урок #2 Двигаем фигуру как хотим!!!
Добавьте в свою программу этот код и ваша фигура будет двигаться по всей форме!
Цитата:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Shape1: TShape;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_UP then Shape1.Top:=Shape1.Top-2;
if key=VK_LEFT then Shape1.Left:=Shape1.Left-2;
if key=VK_DOWN then Shape1.Top:=Shape1.Top+2;
if key=VK_RIGHT then Shape1.Left:=Shape1.Left+2;
end;
end.
writeln('Hello Dude!!!');
-=DeS=- вне форума Ответить с цитированием
Старый 24.01.2007, 23:18   #3
-=DeS=-
Форумчанин
 
Аватар для -=DeS=-
 
Регистрация: 20.12.2006
Сообщений: 135
Восклицание

Урок №3
--------------------
Как вы уже поняли фигура может двигаться куда попало...даже за пределы формы... а это не очень то и хорошо =)...
Давайте вместе напишем код который будет ограничевать движение фигуры влево и вправо...
---------------------
Попробуйте написать вашу программу вот так:
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
type
  TForm1 = class(TForm)
    Shape1: TShape;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if( Key = VK_RIGHT ) and ( shape1.Left + shape1.Width <= Form1.ClientWidth-7 ) then shape1.Left := shape1.Left+7;
  if (key = VK_LEFT)and(shape1.Left>=3) then shape1.Left:=shape1.Left-7;
end;
end.
---------------------
и уже TShape не будет убегать за границы формы! Но будет двигаться только влево и вправо...попробуйте сделать самостоятельно так чтобы TShape не выходил за границы формы сверху и снизу + самостоятельно разберите код...возникнут вопросы задавайте их в этой теме...
---------------------
writeln('Hello Dude!!!');

Последний раз редактировалось execom; 26.03.2007 в 12:47.
-=DeS=- вне форума Ответить с цитированием
Старый 27.01.2007, 21:58   #4
itisiam
аккаунт недоступен
Форумчанин
 
Регистрация: 23.01.2007
Сообщений: 107
Вопрос Вопросы по уроку №3

Сначала хотелось бы сказать спасибо модератору за эту тему т.к. лично мне она очень помогает. =)
Теперь, собственно, к вопросам.()
1. Я не понял смысла этого кода, можешь объяснить?. У меня по оси x объект стал двигаться быстрее, а когда начинал выходить за пределы формы двигался с обычной скоростью. Не надо ли вставить что-то подобное ,чтобы он не мог выйти за пределы формы:
Код:
  if (Key=VK_RIGHT) and (Shape1.Left+Shape1.Width)>=Form1.ClientWidth 
  then Shape1.Left:=Shape1.Left
  if (Key=VK_LEFT) and (Shape1.Left<0) 
  then Shape1.Left:=Shape1.Left
Или же переписать основной код вот так:
Код:
  if (key=VK_UP) and (Shape1.Top>=0)
    then Shape1.Top:=Shape1.Top-2;
  if (key=VK_LEFT) and (Shape1.Left>=0)
    then Shape1.Left:=Shape1.Left-2;
  if (key=VK_DOWN) and (shape1.Top + shape1.Height <= Form1.ClientHeight)
    then Shape1.Top:=Shape1.Top+2;
  if (key=VK_RIGHT) and (shape1.Left + shape1.Width <= Form1.ClientWidth)
    then Shape1.Left:=Shape1.Left+2;
У меня это работает.

2. Можно по-подробнее о событии OnKeyDown ? В частности что за параметры передаются переменными Key, Shift?
ввел пароль, который мне не известен

Последний раз редактировалось Beermonza; 01.07.2010 в 15:51.
itisiam вне форума Ответить с цитированием
Старый 28.01.2007, 08:39   #5
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Key - код клавиши, UNICOD вроде передаётся.
Shift - передаётся состояние клавишь Shift, Alt, Ctrl (нажаты или нет)

Нажми f1 (справка в делфе) и введи OnKeyDown,TWinControl там полностью описание есть + есть ссылка Virtual Key codes - там тоже много полезного.
zetrix вне форума Ответить с цитированием
Старый 28.01.2007, 14:00   #6
psyke
Пользователь
 
Аватар для psyke
 
Регистрация: 08.01.2007
Сообщений: 41
По умолчанию

немного усложнив эту конструкцию становится интереснее

Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);

begin

 case Key of
 VK_LEFT:
 begin
 Image1.Picture.Bitmap.LoadFromFile('left.bmp');
 if image1.Left > 0 then
 image1.Left:=Image1.Left-image1.Width;
 end;

 VK_RIGHT:
   begin
 Image1.Picture.Bitmap.LoadFromFile('right.bmp');
 if image1.Left+image1.Width < ClientWidth then
 image1.Left:=Image1.Left+image1.Width;
 end;


 VK_UP:
  begin
 Image1.Picture.Bitmap.LoadFromFile('top.bmp');
 if image1.Top > 0 then
 image1.Top:=Image1.top-image1.Height;
 end;
 VK_DOWN:
  begin

    Image1.Picture.Bitmap.LoadFromFile('bottom.bmp');
           if not (image1.Top+Image1.Height > ClientHeight) then
    image1.top:=Image1.Top+image1.Height;

 end;

 VK_SPACE:
 begin
 paintbox1.Canvas.Rectangle(image1.Left+2,image1.top+2,
 image1.Left+image1.Width-1,image1.Top+image1.Height-1);
 end;



 VK_ESCAPE:
 begin
 Sendmessage(handle,WM_CLOSE,0,0);
 end;
 end;



  caption:='X: '+IntToStr(image1.Left div image1.Width)+' Y: '+
  IntToStr(image1.top div image1.Height);

end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i: Integer;
cols,rows: Byte;
begin
if sender is ttimer then
paintbox1.Canvas.Create;

paintbox1.Canvas.Brush.Color:=clLime;
cols:=(panel1.Width div 50)+1;
rows:=(panel1.Height div 50)+1;
for i:=0 to cols do
begin
PaintBox1.Canvas.MoveTo((i mod cols)*50,0);
PaintBox1.Canvas.LineTo((i mod cols)*50,panel1.Height);

end;

for i:=0 to rows do
begin
PaintBox1.Canvas.MoveTo(0,(i mod rows)*50);
PaintBox1.Canvas.LineTo(panel1.Width,(i mod rows)*50);

end;
 timer1.Enabled:=false;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case ord(key) of
  49: paintbox1.Canvas.Brush.Color:=clRed;
  50: paintbox1.Canvas.Brush.Color:=clBlack;
  51: paintbox1.Canvas.Brush.Color:=clYellow;
  52: paintbox1.Canvas.Brush.Color:=clLime;
  53: paintbox1.Canvas.Brush.Color:=clWhite;
  end;
end;
рисуем 4 имаги, пусть стрелочки, в разных направлениях, вверх, вниз, лево, право.. Х=50, Y=50

таймер для избежания падения фокуса на какой-нить из контролов, потом стрелочка ваша ездить не будет.

в конечном итоге ваша стрелочка будет бегать по клеточному полю и принажатии на пробел будет закрашивать клеточки цветом. ах да! на форму кинуть панель а на неё paintbox не забудте и image -- ваша стрелочка!

зы-Shift это прежде всего множество из (ssShift, ssAlt, ssCtrl,
ssLeft, ssRight, ssMiddle, ssDouble), обращаться надо к ним через квадратные скобочки -- if shift = [ssShift] then ... if shift = [ssShift,ssAlt] then...
пробуй

Последний раз редактировалось psyke; 28.01.2007 в 14:21.
psyke вне форума Ответить с цитированием
Старый 25.02.2007, 12:20   #7
Yogurt
Пользователь
 
Аватар для Yogurt
 
Регистрация: 22.01.2007
Сообщений: 25
По умолчанию

У меня назрел такой вопрос: при движении объекта с помощью клавиш появляется такой эффект, что, когда я зажимаю кнопку (например стрелочку), то объект сдвинется на n пикселов (где n это шаг, который задаётся заранее), затем остановится на, приблезительно, 0.5 с, а потом начинает нормально двигаться. Разумеется в игре такое движение неприемлемо, и хотелось бы знать как это устранить.

И второй вопрос заключается в том, что двигается объект слишком отрывисто (я предполагаю, что это из-за медленного действия компьютера, несмотря на то, что у меня очень мощная машина). Хотелось бы узнать, как сделать движение более плавным.
Yogurt вне форума Ответить с цитированием
Старый 26.02.2007, 01:31   #8
Speeker
Форумчанин
 
Аватар для Speeker
 
Регистрация: 01.12.2006
Сообщений: 241
По умолчанию

причина задержки скорее всего в настройках винды (есть иакой параметр - сколько времени держиться клавиша зажатой прежде чем применить к ней залипание) Выход я вижу в том что бы отключить опцию в настройках виндовс (скорее всего через реестр), а по выходу из игры снова включать. Или создать обработчик OnKeyDown, который приводит логическую переменную движения в соответствуующую сторону в True и OnKeyUp - все переменные движения в False, а движения обрабатывать в таймере.
А торможением возможно называешь мерцание объекта, если да попробуй использоватьпараметр
Form1.AlphaBlend:=True;
Програмисты - единственные люди, которым платят за исправления их же ошибок
Speeker вне форума Ответить с цитированием
Старый 02.03.2007, 16:26   #9
Cezar
Средний прогер
Форумчанин
 
Аватар для Cezar
 
Регистрация: 16.01.2007
Сообщений: 123
По умолчанию

Цитата:
У меня назрел такой вопрос: при движении объекта с помощью клавиш появляется такой эффект, что, когда я зажимаю кнопку (например стрелочку), то объект сдвинется на n пикселов (где n это шаг, который задаётся заранее), затем остановится на, приблезительно, 0.5 с, а потом начинает нормально двигаться. Разумеется в игре такое движение неприемлемо, и хотелось бы знать как это устранить.
http://programmersforum.ru/showthread.php?t=982
Посмотри там последний пост, мож подойдет...
Cezar вне форума Ответить с цитированием
Старый 04.03.2007, 08:46   #10
Yogurt
Пользователь
 
Аватар для Yogurt
 
Регистрация: 22.01.2007
Сообщений: 25
По умолчанию

Цитата:
Сообщение от Speeker Посмотреть сообщение
А торможением возможно называешь мерцание объекта, если да попробуй использоватьпараметр
Form1.AlphaBlend:=True;
Я попробовал вставить это в процедуру, но единственым изменением стало то, что форма 1 раз моргнула черным цветом и всё. Всё остальное осталось без изменений.

Далее назрел вопрос. Как сделать, чтобы можно было вставить в программу какой-то код (не в процедуры, которые находятся в модуле). Например, я сделал пятнашки и нужно, чтобы условие победы отслеживалось не при каком-то событии, а постоянно.
Yogurt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хорошие уроки Render Общие вопросы Delphi 9 15.09.2012 07:13
Акцесс вопросы новичков Yaga Помощь студентам 4 02.06.2008 00:16
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07