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

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

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

Ответ
 
Опции темы
Старый 07.01.2007, 16:38   #1
-=DeS=-
Форумчанин
 
Аватар для -=DeS=-
 
Регистрация: 20.12.2006
Адрес: UNDERGROUND
Сообщений: 135
Репутация: 55

icq: 676975
Стрелка Уроки по созданию игр для новичков...

В этом уроке я научу вас как можно передвигать обьекты по форме с помощью клавиш...
--------------------------
Начнём.
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, 22:52   #2
-=DeS=-
Форумчанин
 
Аватар для -=DeS=-
 
Регистрация: 20.12.2006
Адрес: UNDERGROUND
Сообщений: 135
Репутация: 55

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

Урок #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=- вне форума   Ответить с цитированием
Старый 25.01.2007, 00:18   #3
-=DeS=-
Форумчанин
 
Аватар для -=DeS=-
 
Регистрация: 20.12.2006
Адрес: UNDERGROUND
Сообщений: 135
Репутация: 55

icq: 676975
Восклицание

Урок №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, 22:58   #4
itisiam
аккаунт недоступен
Форумчанин
 
Регистрация: 23.01.2007
Сообщений: 107
Репутация: 54
Вопрос Вопросы по уроку №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, 09:39   #5
zetrix
Delphi/C++/C#
Профессионал
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,973
Репутация: 589
По умолчанию

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

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

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

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

Код:

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 в 15:21.
psyke вне форума   Ответить с цитированием
Старый 25.02.2007, 13:20   #7
Yogurt
Пользователь
 
Аватар для Yogurt
 
Регистрация: 22.01.2007
Сообщений: 25
Репутация: 38
По умолчанию

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

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

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

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

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

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

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



Опции темы

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

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

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

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




07:57.


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

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


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