Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Смещение экрана


Автор: Vladimir13 14.12.2004, 08:19
как можно двигать экран при перемещении на нем героя, как, например, в Штырлице.

Автор: chipset 14.12.2004, 15:59
Смещать все обьекты при рисовании..

Автор: Vladimir13 14.12.2004, 18:02
а если одна сцена, но по ней можно перемещаться? Я понимаю, что надо связать с полосой прокрутки, но размер Image ограничен?! Как быть?

Автор: chipset 15.12.2004, 02:17
Не понял вопроса..
Персонаж - обьект, он не смещается.. Когда ты нажимаешь жопустим "ВПРАВО" увеличивается переменная на которую пространство сдвигается. Персонаж стоит на месте.

Автор: En_t_end 15.12.2004, 06:41
chipset
Нет, так делают ленивые люди smile
На самом деле Vladimir13 имел в виду, что по-мимо сдвига всей картинки влево-вправо, персонаж может перемещаться и по той области, которую мы сейчас видим... То есть движение в движении

Автор: Ptica 15.12.2004, 10:20
...почерпните некоторые идеи:
Код

{This is main project file}
program Project1;

uses
 Forms,
 Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.
{-----------------------------}
{ This is 'Unit1.pas' file }
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Timer1: TTimer;
   CheckBox1: TCheckBox;
   RadioButton1: TRadioButton;
   RadioButton2: TRadioButton;
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button2Click(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure CheckBox1Click(Sender: TObject);
 private
   { Private declarations }
   Rct: TRect;
   Bitmap: TBitmap;
 public
   { Public declarations }
 end;

const
speed=10;

var
Form1: TForm1;
x: integer = 0;
dx: integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
doublebuffered:=true;
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('panoramb.bmp');
Rct := Rect(0,0,ClientWidth-1,Bitmap.Height-1);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.CopyRect(Rct,Bitmap.Canvas,rect(x,0,Rct.Right+x,Rct.Bottom));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Bitmap.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
x:=x+dx;

If (x < 0) or (x > Bitmap.Width - ClientWidth) then
   begin
     Timer1.Enabled := false;
     dx := 0;
     Button2.Enabled := false;

     If x < 0 then
       begin
         x := 0;
         Button3.Enabled:=false;
       end
     else
       begin
         x := Bitmap.Width - ClientWidth;
         Button1.Enabled:=false;
       end
   end;

If RadioButton1.Checked
   then Repaint
   else InvalidateRect(Handle,@Rct,false);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
dx := speed;
Timer1.enabled := true;
Button1.Enabled := false;
Button2.Enabled := true;
Button3.Enabled := true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled := false;
Button1.Enabled := true;
Button2.Enabled := false;
Button3.Enabled := true;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
dx := -speed;
Timer1.enabled := true;
Button1.Enabled := true;
Button2.Enabled := true;
Button3.Enabled := false;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
DoubleBuffered := CheckBox1.Checked;
end;

end.
{-----------------------------}
{ This is 'Unit1.dfm' file (saved as text)}
object Form1: TForm1
 Left = 269
 Top = 350
 BorderIcons = [biSystemMenu]
 BorderStyle = bsDialog
 Caption = 'Version 1.1'
 ClientHeight = 318
 ClientWidth = 235
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 OldCreateOrder = False
 Position = poScreenCenter
 Scaled = False
 OnClose = FormClose
 OnCreate = FormCreate
 OnPaint = FormPaint
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 0
   Top = 216
   Width = 75
   Height = 25
   Caption = #1051#1077#1074#1072'!'
   TabOrder = 0
   OnClick = Button1Click
 end
 object Button2: TButton
   Left = 80
   Top = 216
   Width = 75
   Height = 25
   Caption = #1057#1090#1086#1087
   Enabled = False
   TabOrder = 1
   OnClick = Button2Click
 end
 object Button3: TButton
   Left = 160
   Top = 216
   Width = 75
   Height = 25
   Caption = #1055#1088#1072#1074#1072'!'
   Enabled = False
   TabOrder = 2
   OnClick = Button3Click
 end
 object CheckBox1: TCheckBox
   Left = 8
   Top = 248
   Width = 105
   Height = 17
   Caption = 'Double buffering'
   Checked = True
   State = cbChecked
   TabOrder = 3
   OnClick = CheckBox1Click
 end
 object RadioButton1: TRadioButton
   Left = 8
   Top = 272
   Width = 89
   Height = 17
   Caption = 'Use Repaint'
   Checked = True
   TabOrder = 4
   TabStop = True
 end
 object RadioButton2: TRadioButton
   Left = 8
   Top = 296
   Width = 113
   Height = 17
   Caption = 'Use InvalidateRect'
   TabOrder = 5
 end
 object Timer1: TTimer
   Enabled = False
   Interval = 50
   OnTimer = Timer1Timer
   Left = 80
   Top = 80
 end
end
{-----------------------------}

К этому еще прилагался рисунок 'PanoramB.Bmp', превосходивший по размеру окно просмотра.

Автор: Vladimir13 16.12.2004, 20:52
поясняю: хочу сделать игру наподобе Штырлица ( надеюсь все видели smile ).
я понял что можно сделать так: при нажатии ВПРАВО человечек поворачивается вправо и начинает движение на месте. В это время задний фон смещается ВЛЕВО. Экран разбивается на прямоугольники ( напр. по 5 пикселей ) и смещать эти прямоугольнички, причем самый правый, который не помещается при движении - удалить, а самый левый - создать.
Идея хорошая, но один вопрос: как это сделать? ( т.е. как я догадываюсь, вопрос - реально ли это?)

Автор: Ptica 17.12.2004, 13:12
Для программиста все реально!
Я делал так (правда, у меня не было плавного движения по локации, а было походовое перемещение по карте, разбитой на клетки):
Есть большая карта (скажем, 100х100 клеток). Есть некоторое окно просмотра (скажем, 10 на 10). И есть координаты той клетки карты, которую в данный момент нужно выводить в левом верхнем углу окна просмотра. Попробую пояснить: допустим, сейчас в левом верхнем углу окна просмотра выведена клетка карты с координатами (5,5). Это значит, что всего в окне должны быть выведены клетки карты из прямоугольника (5,5)-(14,14). Карта у меня хранится в массиве, при этом различные разновидности клеток закодированы числами. Я пробегаюсь в цикле по интересующей меня части массива и в зависимости от кодов клеток вывожу соотвествующие маленькие изображения. Для вывода можно просто использовать Canvas.Draw.
Теперь я хочу сместиться на клетку влево. Это значит, что теперь мне нужно вывести часть карты, соответствующей прямоугольнику (4,5)-(13,14). (Будем считать, что первая координата - горизонтальная).
Таким образом, основной цикл выглядит так:
1. Выясняем направление движения
2. Определяем, какую часть карты будем выводить
3. Выводим кусок карты в окно просмотра
4. Выводим персонажа
А вообще поищите в Инете "программирование игр Delphi". Кое-что да найдете.
P.S. Приятно встретить человека, который пишет "хочу сделать игру" и при этом задает конкретные осмысленные вопросы.

Автор: Vladimir13 18.12.2004, 10:41
так это понятно. В общем, я начал, когда закончу - выложу общую идею создания квестов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)