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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2008, 14:35   #1
sting
Форумчанин
 
Аватар для sting
 
Регистрация: 03.07.2008
Сообщений: 114
По умолчанию Графика в Делфи! Управление обьектами с помощью клавиш

Здравствуйте!

Помогите пожалуйста!

Задание:

надо сделать управление самолётом с помощью клавишь! (вверх, вниз, влево, вправо)

У меня не получается! он не летит так как надо!
тоесть при нажатие на клавишу он на 1 единицу отклоняеться и всё! а дальше не хочет!
нажимаю на право - а он всё равно налево летит!
Памагите плиз!


вот код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    // битовые образы
    Sky: TBitmap;    // небо
    Plane: TBitmap;  // самолет
    x,y: integer;
  public
    { Public declarations }
  end;
  const
  x=vk_left+vk_right;
var
  Form1: TForm1;

implementation

{$R *.dfm}

// конструктор формы
procedure TForm1.FormCreate(Sender: TObject);
begin
  // создать два объекта TBitmap
  // и загрузить в них картинки
  Sky := TBitmap.Create;
  Sky.LoadFromFile('sky.bmp');
  Plane := TBitmap.Create;
  Plane.LoadFromFile('plane.bmp');
  Plane.Transparent := true; // прозрачный фон

  x:=0;
  y:=0;
  Timer1.Interval:=2;
end;


// обработка события Paint
procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Draw(0,0,Sky);      // фон - небо
  Canvas.Draw(x,y,Plane); // объект - самолет
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
r: trect;

begin
r:=rect(x,y,x+plane.Width, y+plane.Height);
 Canvas.Copyrect(r,sky.canvas,r);
x:=x+1;
 Canvas.Draw(x,y,plane);

if x>Form1.Width +plane.Width +10
then
x:=2;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case   key of
vk_LEFT: x:=1;
VK_RIGHT: x:=-1;

end;


begin
case   key of
vk_UP: y:=-1;
VK_DOWN: y:=1;

end;
 end;
 end;
end.

вот файлики
Вложения
Тип файла: rar 12.rar (360.2 Кб, 25 просмотров)
Люди гибнут за МЕТАЛ!!!
sting вне форума Ответить с цитированием
Старый 14.12.2008, 14:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Фух... Во первых чего так нельзя?:
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case   key of
 vk_LEFT: x:=1;
 VK_RIGHT: x:=-1;
 vk_UP: y:=-1;
 VK_DOWN: y:=1;
end;
 end;
Цитата:
нажимаю на право - а он всё равно налево летит!
Логично: x:=x+1; в таймере
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2008, 14:51   #3
sting
Форумчанин
 
Аватар для sting
 
Регистрация: 03.07.2008
Сообщений: 114
По умолчанию

хм(((( всё равно!

и он не обновляет фон блин ещё! скоко не пытался так и не смог это сделать! надо сделать обновление фона и зациклить)))
Люди гибнут за МЕТАЛ!!!
sting вне форума Ответить с цитированием
Старый 14.12.2008, 14:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
надо сделать обновление фона и зациклить
Ниче не цикли. Пусть фон обновляется в OnPaint формы. или в WM_ERASEBACKGROUND сам выбереш что лучше. (второе вроде предпочтительней)
Цитата:
хм(((( всё равно!
Тогда отладчиком пройдись и посмотри чего где меняется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2008, 15:09   #5
sting
Форумчанин
 
Аватар для sting
 
Регистрация: 03.07.2008
Сообщений: 114
По умолчанию

Я не наю как это! не первое не второе!


Самолёт летит! и управляется! но мне бы хотелось что бы я зажал клавишу вниз он бы и вниз летел пока не отпущю клавишу и вперёл сам по себе! а у мну так не получаетс!

Я в делфи н профи! если можно то поподробнее обясните плиз
Люди гибнут за МЕТАЛ!!!
sting вне форума Ответить с цитированием
Старый 14.12.2008, 15:23   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну примерно так тогда:
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case   key of
 vk_UP: y:=y-1;
 VK_DOWN: y:=y+1;
end;
 end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2008, 15:41   #7
sting
Форумчанин
 
Аватар для sting
 
Регистрация: 03.07.2008
Сообщений: 114
По умолчанию

Во! супер класс! Спасибо большое! а можно сделать что бы он летел вперёд только тогда када нажимал бы я на клавишу НАПРАВО??
Люди гибнут за МЕТАЛ!!!
sting вне форума Ответить с цитированием
Старый 14.12.2008, 15:46   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Все можно, еси осторожно
ПЕревирая твои поделки можно написать так:
Код:
implementation

{$R *.dfm}

// конструктор формы
procedure TForm1.FormCreate(Sender: TObject);
begin
  // создать два объекта TBitmap
  // и загрузить в них картинки
  Sky := TBitmap.Create;
  Sky.LoadFromFile('sky.bmp');
  Plane := TBitmap.Create;
  Plane.LoadFromFile('plane.bmp');
  Plane.Transparent := true; // прозрачный фон

  x:=0;
  y:=0;
end;


// обработка события Paint
procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Draw(0,0,Sky);      // фон - небо
  Canvas.Draw(x,y,Plane); // объект - самолет
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
r: trect;

begin
case   key of
 vk_LEFT: x:=x+1;
 VK_RIGHT: x:=x-1;
 vk_UP: y:=y-1;
 VK_DOWN: y:=y+1;
end;
r:=rect(x,y,x+plane.Width, y+plane.Height);
 Canvas.Copyrect(r,sky.canvas,r);
 Canvas.Draw(x,y,plane);
if x>Form1.Width +plane.Width +10
then
x:=2;

 end;
end
И от таймера тогда избавляйся.

А еще:
зАчем ты дважды пишеш прорисовку самолета и неба?
Один раз в OnPaint пропиши а потом после изменения координат напиши repaint
I'm learning to live...

Последний раз редактировалось Stilet; 14.12.2008 в 15:50.
Stilet вне форума Ответить с цитированием
Старый 14.12.2008, 15:59   #9
sting
Форумчанин
 
Аватар для sting
 
Регистрация: 03.07.2008
Сообщений: 114
По умолчанию

Спасибо большое! Выручили очень!

Пошёл в другом разделе писать)))
Люди гибнут за МЕТАЛ!!!
sting вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление windows с помощью delphi Hallo Обсуждение статей 6 05.09.2010 23:50
Графика в Делфи Killbrum Мультимедиа в Delphi 19 17.09.2008 22:29
Управление системными устройствами в Делфи )Игнат( Общие вопросы Delphi 1 07.09.2008 12:13
Графика в Делфи, требуется помощь с задачей Natisha Помощь студентам 3 10.05.2008 00:25
написать модуль в Делфи для построения графика Анютик Общие вопросы Delphi 2 26.03.2008 03:04