Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите по 2D игре 
V
    Опции темы
Des666
  Дата 20.12.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.10.2006

Репутация: -1
Всего: нет



вот в чем беда...
По задумке при нажатии определенной клавиши объект face (это обычный овал - Shape) должен 10-ью кадрами (задержка кадра - 15мс, изменение координаты: 5пикс./кадр) плавно подняться на 50 пикселей.
А на деле получается, что проходит 1.5с и face резко перепрыгивает на 50пикс. Вот фрагмент кода. Что можно сделать, чтобы было "как по задумке"?
Код

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

  var i: integer;

begin
 
if key= VK_UP then for i:=1 to 10 do
                   begin
                   face.Top:=face.Top-5;
                   sleep(15);
                   end;
 
if key= VK_DOWN  then for i:=1 to 10 do
                    begin
                    face.Top:=face.Top+5;
                    sleep(15);
                    end;
 
if key= VK_LEFT then for i:=1 to 10 do
                     begin
                     face.Left:=face.Left-5;
                     sleep(15);
                     end;
 
if key= VK_RIGHT then for i:=1 to 10 do
                      begin
                      face.Left:=face.Left+5;
                      sleep(15);
                      end;
 
end;


Это сообщение отредактировал(а) Des666 - 20.12.2006, 19:03
PM MAIL WWW ICQ   Вверх
Elfebet
Дата 20.12.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



повыставляй в цыклах application.processmessage;


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Snowy
Дата 20.12.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



угу. Перед Sleep;
PM MAIL   Вверх
Des666
Дата 20.12.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.10.2006

Репутация: -1
Всего: нет



не работает:
[Error] some.pas(36): Undeclared identifier: 'processmessage'
Из за чего вылазит такая ошибка?

Это сообщение отредактировал(а) Des666 - 20.12.2006, 20:32
PM MAIL WWW ICQ   Вверх
GuManOiD
Дата 20.12.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

Репутация: нет
Всего: нет



повыставляй перед Sleep(15):
Код

Repaint;


перерисует форму... а вообще я бы использовал таймер

ИМХО хотя быстрее работать будет если вызывать
Код

Face.RePaint;



Это сообщение отредактировал(а) GuManOiD - 20.12.2006, 20:56
PM MAIL   Вверх
Des666
Дата 20.12.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.10.2006

Репутация: -1
Всего: нет



А как можно его тут использовать?
PM MAIL WWW ICQ   Вверх
GuManOiD
Дата 20.12.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

Репутация: нет
Всего: нет



Ну много способов smile
Напрмер, можно создать 1 и в нем обрабатывать нажатия...

Я вообще не очень красноречив, но постараюсь обьяснить smile

Все зависит от конкретной задачи. Если это 2D игра, то возможно во время плавного перемещения 
обьекта тебе потребуется перерисовка других обьектов, а процедура Sleep стопорит обработку сообщений в главном потоке.
+ к этому, как я понял KeyDown обработает все клавиши нажатые даже во время Sleep, а значит если игрок быстро нажмет несколько раз клавиш, а потом перестанет нажимать то ему придется подождать пока обьект закончит перемещения...

Ну вообщем, сейчас сделаю с таймером, жди кода...

+По конкретней цель стоит описать smile
PM MAIL   Вверх
dimazu
Дата 20.12.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Цитата(Des666 @ 20.12.2006,  20:14)
не работает:
[Error] some.pas(36): Undeclared identifier: 'processmessage'
Из за чего вылазит такая ошибка?

Ну вы, блин, даете....
Код

 Application.ProcessMessages;

PM MAIL   Вверх
GuManOiD
Дата 20.12.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

Репутация: нет
Всего: нет



dimazu, Тоже написать хотел smile

Код

unit Unit1;

interface

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

const GridStep = 50;

type
  TForm1 = class(TForm)
    face: TShape;
    tmrMain: TTimer;
    procedure tmrMainTimer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    XStep, YStep : Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.tmrMainTimer(Sender: TObject);
begin
  Face.Top := Face.Top+YStep;
  Face.Left := Face.Left+XStep;

  if (Face.Top mod GridStep) = 0 then
    YStep := 0;

  if (Face.Left mod GridStep) = 0 then
    XStep := 0;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_UP : YStep := -5;
    VK_DOWN : YStep := 5;
    VK_LEFT : XStep := -5;
    VK_RIGHT : XStep := 5;
  end;
end;

end.


В начальное положение face:
Top и Left должны быть кратны GridStep.

Пример простой и довольно "пластмассовый" но поэксперементировать и подогнать под задачу вполне реально.
Если требуется что бы при зажатой клавише обьект всегда перемещался используй GetKeyState, тогда обрабатывать 
KeyDown не требуется smile


Это сообщение отредактировал(а) GuManOiD - 20.12.2006, 21:32
PM MAIL   Вверх
Des666
Дата 20.12.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.10.2006

Репутация: -1
Всего: нет



Пасибо разобрался вроде =) 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.