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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2009, 21:57   #1
Deamonig
Форумчанин
 
Аватар для Deamonig
 
Регистрация: 19.09.2009
Сообщений: 166
По умолчанию Проблема с перемещением

Проблема в том что при нажатии в форме Up у меня человечек на картинке прыгает вверх, держа эту же клавишу Up и затем нажать left или right то человек начнет прыгать по косой линии, после того как я бросаю left или тот же right и при этом все еще держа клавишу Up то он у меня перестает прыгать, и чтобы начал прыгать вверх нужно опять бросить и нажать заново Up. Мне же нужно чтобы просле того как я бросаю left или right то отработка события нажатия Up оставалась работать. Кто может подскажите как это можно реализовать. Вот код:

С помощью меток f2,f3,f1,k1,f,s,i,k,P1,P2,P3 я определяю физику так сказать, т. е. персонаж не может вылететь за пределы не может подпрыгнуть выше чем указано, не может подпрыгнув просто вверх двигаться назад и т.д.

Код:
var 
f2,f3,f1,k1,f,s,i,k,P1,P2,P3:integer;

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

if ((GetKeyState(vk_Up) AND 128)=128)
and ((GetKeyState(vk_Left) AND 128)=128)
and(P2<>1) and (P3<>1) and(image2.left>10)
and ((f2<>1) or (image2.top=k1))
then
 begin
  P1:=1;
  k1:=Image2.Top;
  timer4.enabled:=true;
 end;

if ((GetKeyState(vk_Right) AND 128)=128)
and ((GetKeyState(vk_Up) AND 128)=128)
and(P2<>1) and(P1<>1) and(image2.left<Form1.ClientWidth-image2.Width-7)
and ((f3<>1) or (image2.top=k1))
then
 begin
  P3:=1;
  k1:=Image2.Top;
  timer5.enabled:=true;
 end;

if ((GetKeyState(vk_Up) AND 128)=128)
and(P1<>1)  and(P3<>1)
and ((f1<>1) or (image2.top=k))
then
 begin
  P2:=1;
  k:=Image2.Top;
  timer3.enabled:=true;
 end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
 f1:=1;
 if (image2.top>k-100)   and (f<>1)
 then
  begin
   image2.top:=image2.top-6;
  end
 else if image2.top<k
 then
  begin
   f:=1;
   image2.Top:=image2.top+6;
  end;
 if image2.Top=k
 then
  begin
   f:=0;
   P2:=0;
   timer3.enabled:=false;
  end;
end;


procedure TForm1.Timer4Timer(Sender: TObject);
begin
 f2:=1;
 if (image2.top>k1-100)   and (f<>1)
 then
  begin
   if image2.left>10
   then
   image2.left:=image2.left-6;
   image2.top:=image2.top-6;
  end
 else if image2.top<k1
 then
  begin
   f:=1;
   if image2.left>10
    then
     image2.left:=image2.left-6;
     image2.Top:=image2.top+6;
  end;
 if image2.Top=k1 then
 begin
 f:=0;
 P1:=0;
 timer4.enabled:=false;
 end;
end;

procedure TForm1.Timer5Timer(Sender: TObject);
begin
 f3:=1;
 if (image2.top>k1-100)   and (f<>1)
 then
  begin    if image2.left<Form1.ClientWidth-image2.Width-7
  then
   image2.left:=image2.left+6;
   image2.top:=image2.top-6;
  end
  else if image2.top<k1
  then
   begin
    f:=1;
    if image2.left<Form1.ClientWidth-image2.Width-7
    then
     image2.left:=image2.left+6;
     image2.Top:=image2.top+6;
   end;
 if image2.Top=k1 then
  begin
   f:=0;
   P3:=0;
   timer5.enabled:=false;
  end;
end;
Deamonig вне форума Ответить с цитированием
Старый 26.09.2009, 11:09   #2
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Зачем столько таймеров сделал, это лишнее.
VintProg вне форума Ответить с цитированием
Старый 26.09.2009, 11:20   #3
Deamonig
Форумчанин
 
Аватар для Deamonig
 
Регистрация: 19.09.2009
Сообщений: 166
По умолчанию

Просто если делать перемещение в той же FormKeyDown то не видно самого движения картинки, т. е. она сразу переместится с позиции допустим 300 500 на 300 300 за пол секунды, а с помощью таймера видно четко движения картинки (в 1 милисекунду на 6 пикселей)
Deamonig вне форума Ответить с цитированием
Старый 26.09.2009, 11:24   #4
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

А Images мерцают при передвижении?
VintProg вне форума Ответить с цитированием
Старый 26.09.2009, 13:00   #5
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Ты изначально все делаешь не правильно. Твой вариант неоптимизированный и сложный. Отсюда и все проблемы. Почитай Уроки по созданию игр для новичков.
Вадим Буренков вне форума Ответить с цитированием
Старый 26.09.2009, 13:02   #6
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Diamonig, на самом деле всё просто, думаю, что падение фигуры ты сам сможешь сделать. Если я правильно понял, в чём у тебя проблема, то вот код:
Код:
unit ModuleToDiamonig;

interface

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

type
  TForm1 = class(TForm)
    TimerMove: TTimer;
    procedure ReDraw;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TimerMoveTimer(Sender: TObject);
  end;

var
  Form1: TForm1;
  buf: TBitmap;
  player: TBitmap; // Персонаж
  XPos, YPos: integer; // Позиция игрока по X и Y
implementation

{$R *.dfm}

procedure TForm1.ReDraw;
begin
  buf.Canvas.FillRect(Rect(0,0,400,400)); // Очистить буфер
  buf.Canvas.Draw(XPos, YPos, Player);
  Canvas.Draw(0,0,buf); // Вывести buf на экран
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  ReDraw;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  buf := TBitmap.Create;
  buf.Width := 400;
  buf.Height := 400;

  Player := TBitmap.Create;
  Player.Width := 20;
  Player.Height := 20;
  Player.Canvas.Ellipse(0,0,20,20);

  XPos := 20;
  YPos := 380;
end;

procedure TForm1.TimerMoveTimer(Sender: TObject);
begin
  if GetKeyState(37) shr 31 = 1 then Dec(XPos, 5);
  if GetKeyState(38) shr 31 = 1 then Dec(YPos, 5);
  if GetKeyState(39) shr 31 = 1 then Inc(XPos, 5);
  ReDraw;
end;
У таймера частота обновления 33 мс.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 26.09.2009, 13:32   #7
Deamonig
Форумчанин
 
Аватар для Deamonig
 
Регистрация: 19.09.2009
Сообщений: 166
По умолчанию

Цитата:
Сообщение от VintProg Посмотреть сообщение
А Images мерцают при передвижении?
нет не мерцают
Deamonig вне форума Ответить с цитированием
Старый 26.09.2009, 13:34   #8
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Deamonig
Тогда юзай код что написал
Манжосов Денис , он действительно проше чем твой, ты видимо
начинающий игро-программер?
VintProg вне форума Ответить с цитированием
Старый 26.09.2009, 13:49   #9
Deamonig
Форумчанин
 
Аватар для Deamonig
 
Регистрация: 19.09.2009
Сообщений: 166
По умолчанию

Цитата:
Сообщение от Манжосов Денис :) Посмотреть сообщение
Diamonig, на самом деле всё просто, думаю, что падение фигуры ты сам сможешь сделать. Если я правильно понял, в чём у тебя проблема, то вот код:
Сэнкс, помогло
Deamonig вне форума Ответить с цитированием
Старый 26.09.2009, 13:51   #10
Deamonig
Форумчанин
 
Аватар для Deamonig
 
Регистрация: 19.09.2009
Сообщений: 166
По умолчанию

Цитата:
Сообщение от VintProg Посмотреть сообщение
Deamonig
Тогда юзай код что написал
Манжосов Денис , он действительно проше чем твой, ты видимо
начинающий игро-программер?
угу начинающий
Deamonig вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распределение памяти перемещаемыми разделами с перемещением в сторону старших адресов со сжатием Лисичкина Помощь студентам 4 08.12.2009 21:12
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37
Проблема с перемещением картинки Vanya Общие вопросы Delphi 2 16.07.2008 14:30
ВОПРОС на счет блоков памяти и отслеживание за перемещением потока. Big Zee Свободное общение 7 21.04.2008 14:38