Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2003.12.09;
Скачать: [xml.tar.bz2];

Вниз

игра hitman   Найти похожие ветки 

 
iliann   (2003-05-16 23:06) [0]

в игре(open lg) hitman главный персонаж находиться в 3-х мерном пространстве
упрвление осуществляется мышью и курсорн. клавишами
я хочу сделать подобную игру ,но не знаю с чего начать
пожалста подскажите основные функции для такой игры


 
TButton   (2003-05-17 00:37) [1]

Для начала попробуй по читать пару книжек по дельфе, потом возьмись за "пятнашки" или "змейку" через пару месяцев у тебя ничего не получится. тут возникают 2 варианта
1. плюнуть на все
2. продолжать работать
выберешь первый вариант и все вопросы отпадут сами собой, выберешь второй - то может через год - полтора сможешь браться за что-то наподобии ХитМана


 
Кен   (2003-05-17 01:39) [2]

Поставь glscene и разбирай демки к нему.
http://glscene.sourceforge.net


 
k-man   (2003-05-17 12:52) [3]

Монстр. "Я хочу сдлать такую игру..."
Сколько тут таких веток было....
Повторюсь Хитман писали не один десяток ПРОФФЕССИОНАЛОВ несколько лет. Они не спрашивали с чего начать, они не занимались другими делами.... Они писали Хитман и Хитман2.
А ты один собрался...
Ты может думаешь что это как ва пальца.... Хитмана написать.


 
iliann   (2003-05-17 22:20) [4]

я не хочу писать всегоhitmana мне нужно только чтобы героем можно было управлять мышью


 
Кен   (2003-05-18 01:53) [5]

iliann
А что ты хочешь получить в результате ? Свои миссии что ли к Хитману сделать ? Или улучшить его ? Или что вообще хочешь ?


 
TButton   (2003-05-18 18:06) [6]

2 Кен
он же ясно сказал "я хочу героем мышью управлять", а писать он будет Q4


 
greenrul   (2003-05-18 22:41) [7]

По поводу управления мышью - представь себе сферу, окружающую персонажа. Проще говоря возьми глобус, сними с него карту и разверни ее в 2д, по ней и перемещайся


 
Кен   (2003-05-19 01:23) [8]

Кстати по поводу мыши. Как действительно её контролировать ?
Нужно :
1) Чтобы курсора небыло. Ни небыло видно картинку курсора, а просто небыло. Чтобы он не выезжал за пределы программы когда она работает в окнном режиме, чтобы он не останавливался, доехав до края экрана или окна.
2) Снимать с мыши показания насколько она перемещена. То есть на лево 10 вперёд 5. Обратились к мыши ещё раз. И получили направо 4 назад 2. И всё. Просто с этим удобно работать.

Как это сделать ? Может есть компонент какой специальный ?


 
greenrul   (2003-05-19 02:31) [9]

2Кен - тебе многие, в том числе и я могут ответить на эти вопросы, но если задаются такие вопросы, то лучше почитать немного книг о Дельфи.

1) Form.Cursor:=crNone;
невыезд за пределы программы - преступление против юзера. такие вещи по определению делать нельзя.

2) Насколько перемещена тебе так просто не получить. Делай таймер, по таймеру присваивай xx и yy текущим координатам мыши. При таймере ты сравниваешь текущий х и у и вычитаешь их них хх и уу - получаешь - по оси Х минус 2, по У - плюс 5 - значит на 2 влево и на 5 вниз.

Правда. купи книгу. намного проще потом будет


 
Asteroid   (2003-05-19 02:34) [10]

> Кен © (19.05.03 01:23)
Для этого компоненты не нужны (хотя может даже есть). GetCursorPos и SetCursorPos, а также ShowCursor. При запуске ставишь курсор в середину экрана и пишешь ShowCursor( false );
На каждом кадре (для полноэкранного режима):
GetCursorPos( p );
dx := p.x - WindowWidth shr 1; // *
dy := p.y - WindowHeight shr 1; // *
p.x := WindowWidth shr 1; p.y := WindowHeight shr 1;
SetCursorPos( p );

В оконном в строчках * придется еще учесть смещение окна и его рамку, но на VCL это вообще дело техники. Для чистоты на выходе из программы не забудь поставить ShowCгrsor( true );


 
Asteroid   (2003-05-19 02:36) [11]

> greenrul © (19.05.03 02:31)
Проблема в том, что если мышь будет на правом краю экрана и ты двинешь ее вправо, смещения по x не будет.


 
Кен   (2003-05-19 05:46) [12]

greenrul ©
> 2Кен - тебе многие, в том числе и я могут ответить на эти
> вопросы, но если задаются такие вопросы, то лучше почитать
> немного книг о Дельфи.
>
> 1) Form.Cursor:=crNone;

А если даются такие ответы, то стоит внимательно перечитать вопрос.

> невыезд за пределы программы - преступление против юзера.
> такие вещи по определению делать нельзя.

*** А как ты будешь поворачивать мышью ? Повернул чуть чуть, потом курсор вышел из окна программы и поворот прекратился.


Asteroid ©
Вот по всему по этому я и хочу какой-нибудь удобный компонент.


 
NailMan   (2003-05-19 09:58) [13]

To -> iliann
Для начала, определись на каком API писать собираешься.
- Если OpenGL, то можешь GLScene использовать.
- Если DirectX, то лучше свой написать.

В любом случае юзать VCL для 3Д-игр сложного уровня - это имхо взгляд преступление по отношению к юзверю.

Управление(снятие данных с устройств ввода) лучше организовывать через DirectInput - не тормозит и богатые и удобные возможности.

To -> greenrul ©
2) Насколько перемещена тебе так просто не получить. Делай таймер, по таймеру присваивай xx и yy текущим координатам мыши. При таймере ты сравниваешь текущий х и у и вычитаешь их них хх и уу - получаешь - по оси Х минус 2, по У - плюс 5 - значит на 2 влево и на 5 вниз.
А не проще DirectInput юзать - он сам тебе выдает смещение координат для мышки. Ни каких таймеров, ни калькуляций, просто и быстро.

To -> Кен ©
*** А как ты будешь поворачивать мышью ? Повернул чуть чуть, потом курсор вышел из окна программы и поворот прекратился.

Поэтому оконный режим(для 3Д игр) используют только для отладки и конечному юзверю дают только полноэкраный(и соотв. более быстрый) режим. И собсно при считывании данных посредством DInput такая проблема как выход за пределы окна отпадает сама собой, бо DInput что окно что фуллскрин - феолетово.


 
greenrul   (2003-05-19 21:00) [14]

прошу прощения... сильно стормозил... извиняй кен, если обиделся :(


 
Кен   (2003-05-21 02:11) [15]

Вопрос номер 2 решается так :
DXInput1.Update - Обнуляет.
DXInput1.Mouse.X и DXInput1.Mouse.Y - насколько мышь сдвинули. Работает даже когда мышь на краях экрана.

Остаётся вопрос исчезновения курсора.
Можно конечно через SetCursorPos(Screen.Width, Screen.Heigth), но хочеться сделать это грамотно, без финтов. Может в DXInput есть чего для этих целей предназначеннео ?


 
NailMan   (2003-05-21 09:46) [16]

ShowCursor(False); у меня решил вопрос


 
Кен   (2003-05-22 02:15) [17]


> ShowCursor(False); у меня решил вопрос

Когда программа в оконном режиме, то курсор невиден только когда он в окне программы. Когда же программа открыта полностью, а курсор сдвигается на край окна, то он вызывает появление Виндосовской панели.
То есть всёравно придётся делать SetCursorPos.


 
NailMan   (2003-05-22 15:25) [18]

Мдя, я делал такой финт ушами, но окно делал без бордеров и капшенов - чистое окно. Типа чтобы они не влияли на координаты.

Правда очень неудобно было при отладке, когда надо лазить в редактор и смореть какое значение а в какой переменной.


 
DeadMeat   (2003-05-22 16:14) [19]

А нельзя-ли без DXInput-а с приславутым Timer1... Как сказал greenrul ... 2)... А что-бы мыша не выходила за пределы экрана, то после считывания X и Y ставить её опять в центр через SetCursorPos... При потере окном фокуса, показывать её заново, и не теребить...


 
pasha676   (2003-05-22 16:26) [20]

2DeadMeat
Да чем угодно можно. Хоть сам из порта читай. Только вот удобственнее и практичнее ДиректИнпута пожалуй еще не придумали.


 
Кен   (2003-05-23 01:14) [21]

Ну так как же в DXInput отключать перемещение курсора мыши ?


 
pasha676   (2003-05-23 10:03) [22]

У тебя вопросы просто зачипись. Надо отключать не перемещение, а изображение. Вопрос вполне посильный. Я сам не делал, но что такая фенька есть - это точно.


 
cyborg   (2003-05-23 12:41) [23]

Кен в DirectInput ничего перемещать не нужно, получаешь смещение на которое передвинулся курсор и всё.

Uses
...
DirectInput8;
//+++++++DirectInput8 объекты (Клавиатура и мышь)+++++++++++++++
CONST
KEYBOARD_BUFFER_SIZE = 16; //Размер буффера клавишь DirectInput8
VAR
DInput : IDIRECTINPUT8 = nil; //Интерфейс DirectInput8
DIKeyboard : IDIRECTINPUTDEVICE8 = nil; //Интерфейс клавиатуры
DIMouse : IDIRECTINPUTDEVICE8 = nil; //Интерфейс мышки
Keyboard : Array [0..KEYBOARD_BUFFER_SIZE - 1] of TDIDEVICEOBJECTDATA; //Буффер клавишь DirectInput8
Mouse : TDIMOUSESTATE2; //Значения статуса мышки

//Координаты крсора мышки:
MouseX : LongInt = 100;
MouseY : LongInt = 100;
MouseZ : LongInt = 0; //Содержит значение прокрутки колёсика мышки

Function InitDirectInput : Cardinal;
Var
dipdw : TDIPROPDWORD;

Begin
//DirectInput8:
DInput := nil;
Result := DirectInput8Create (hInstance, DIRECTINPUT_VERSION,
IID_IDirectInput8, DInput, nil);
if Result<>0 then Exit;
//Клавиатура:
DIKeyboard := nil;


Result := DInput.CreateDevice (GUID_SysKeyboard, DIKeyboard, nil);
if Result<>0 then Exit;

Result := DIKeyboard.SetDataFormat(@c_dfDIKeyboard);
if Result<>0 then Exit;

Result := DIKeyboard.SetCooperativeLevel(WindowHandle, DISCL_EXCLUSIVE or DISCL_FOREGROUND);
if Result<>0 then Exit;

FillChar(dipdw, SizeOf (dipdw),0);
with dipdw do begin
diph.dwSize := SizeOf(TDIPROPDWORD);
diph.dwHeaderSize := SizeOf(TDIPROPHEADER);
diph.dwObj := 0;
diph.dwHow := DIPH_DEVICE;
dwData := KEYBOARD_BUFFER_SIZE;
end;

Result := DIKeyboard.SetProperty(DIPROP_BUFFERSIZE, dipdw.diph);
if Result<>0 then Exit;

Result := DIKeyboard.Acquire;

//Мышка:
DIMouse:=nil;

Result := DInput.CreateDevice (GUID_SysMouse, DIMouse, nil);
if Result<>0 then Exit;

Result := DIMouse.SetDataFormat(@c_dfDIMouse2);
if Result<>0 then Exit;

Result := DIMouse.SetCooperativeLevel(WindowHandle, DISCL_EXCLUSIVE or DISCL_FOREGROUND);
if Result<>0 then Exit;

Result := DIMouse.Acquire;
End;

Procedure CloseDirectInput;
begin
//Освобождение мышки DirectInput8
if DIMouse<>nil then
begin
DIMouse.Unacquire;
DIMouse := nil;
end;

//Освобождение клавиатуры DirectInput8
if DIKeyboard<>nil then
begin
DIKeyboard.Unacquire;
DIKeyboard := nil;
end;

if DInput<>nil then DInput := nil;
end;

function ReadDirectInputData : Cardinal; //Чтение буффера нажатых клавишь и мышки
var
i : Cardinal;
hRet : Cardinal;
// s : String;
begin
//Чтение статуса клавиатуры:
if DIKeyboard = nil then begin
Result := DI_OK;
Exit
end;
hRet := DIKeyboard.GetDeviceData (SizeOf(TDIDEVICEOBJECTDATA),
@Keyboard, Result, 0);
if hRet<>0 then begin
hRet := DIKeyboard.Acquire;
while hRet = DIERR_INPUTLOST do
hRet := DIKeyboard.Acquire;
end;

//Чтение статуса мышки:
FillChar(Mouse, SizeOf(Mouse),0);
hRet := DIMouse.GetDeviceState(SizeOf(TDIMOUSESTATE2), @Mouse);
if hRet<>0 then begin
hRet := DIMouse.Acquire;
( mouseX,Mouse.lX) [23]
Кен в DirectInput ничего перемещать не нужно, получаешь смещение на которое передвинулся курсор и всё.

Uses
...
DirectInput8;
//+++++++DirectInput8 объекты (Клавиатура и мышь)+++++++++++++++
CONST
KEYBOARD_BUFFER_SIZE = 16; //Размер буффера клавишь DirectInput8
VAR
DInput : IDIRECTINPUT8 = nil; //Интерфейс DirectInput8
DIKeyboard : IDIRECTINPUTDEVICE8 = nil; //Интерфейс клавиатуры
DIMouse : IDIRECTINPUTDEVICE8 = nil; //Интерфейс мышки
Keyboard : Array [0..KEYBOARD_BUFFER_SIZE - 1] of TDIDEVICEOBJECTDATA; //Буффер клавишь DirectInput8
Mouse : TDIMOUSESTATE2; //Значения статуса мышки

//Координаты крсора мышки:
MouseX : LongInt = 100;
MouseY : LongInt = 100;
MouseZ : LongInt = 0; //Содержит значение прокрутки колёсика мышки

Function InitDirectInput : Cardinal;
Var
dipdw : TDIPROPDWORD;

Begin
//DirectInput8:
DInput := nil;
Result := DirectInput8Create (hInstance, DIRECTINPUT_VERSION,
IID_IDirectInput8, DInput, nil);
if Result<>0 then Exit;
//Клавиатура:
DIKeyboard := nil;


Result := DInput.CreateDevice (GUID_SysKeyboard, DIKeyboard, nil);
if Result<>0 then Exit;

Result := DIKeyboard.SetDataFormat(@c_dfDIKeyboard);
if Result<>0 then Exit;

Result := DIKeyboard.SetCooperativeLevel(WindowHandle, DISCL_EXCLUSIVE or DISCL_FOREGROUND);
if Result<>0 then Exit;

FillChar(dipdw, SizeOf (dipdw),0);
with dipdw do begin
diph.dwSize := SizeOf(TDIPROPDWORD);
diph.dwHeaderSize := SizeOf(TDIPROPHEADER);
diph.dwObj := 0;
diph.dwHow := DIPH_DEVICE;
dwData := KEYBOARD_BUFFER_SIZE;
end;

Result := DIKeyboard.SetProperty(DIPROP_BUFFERSIZE, dipdw.diph);
if Result<>0 then Exit;

Result := DIKeyboard.Acquire;

//Мышка:
DIMouse:=nil;

Result := DInput.CreateDevice (GUID_SysMouse, DIMouse, nil);
if Result<>0 then Exit;

Result := DIMouse.SetDataFormat(@c_dfDIMouse2);
if Result<>0 then Exit;

Result := DIMouse.SetCooperativeLevel(WindowHandle, DISCL_EXCLUSIVE or DISCL_FOREGROUND);
if Result<>0 then Exit;

Result := DIMouse.Acquire;
End;

Procedure CloseDirectInput;
begin
//Освобождение мышки DirectInput8
if DIMouse<>nil then
begin
DIMouse.Unacquire;
DIMouse := nil;
end;

//Освобождение клавиатуры DirectInput8
if DIKeyboard<>nil then
begin
DIKeyboard.Unacquire;
DIKeyboard := nil;
end;

if DInput<>nil then DInput := nil;
end;

function ReadDirectInputData : Cardinal; //Чтение буффера нажатых клавишь и мышки
var
i : Cardinal;
hRet : Cardinal;
// s : String;
begin
//Чтение статуса клавиатуры:
if DIKeyboard = nil then begin
Result := DI_OK;
Exit
end;
hRet := DIKeyboard.GetDeviceData (SizeOf(TDIDEVICEOBJECTDATA),
@Keyboard, Result, 0);
if hRet<>0 then begin
hRet := DIKeyboard.Acquire;
while hRet = DIERR_INPUTLOST do
hRet := DIKeyboard.Acquire;
end;

//Чтение статуса мышки:
FillChar(Mouse, SizeOf(Mouse),0);
hRet := DIMouse.GetDeviceState(SizeOf(TDIMOUSESTATE2), @Mouse);
if hRet<>0 then begin
hRet := DIMouse.Acquire;
while hRet = DIERR_INPUTLOST do hRet := DIMouse.Acquire;
end;
//Чтение координат курсора и проверка на выход из экрана:
inc(mouseX,Mouse.lX);
// mouseX := mouseX + Mouse.lX;
if mouseX < 0 then mouseX := 0;
if mouseX > WindowWidth then mouseX := WindowWidth;

inc(mouseY,Mouse.lY);
if mouseY < 0 then mouseY := 0;
if mouseY > WindowHeight then mouseY := WindowHeight;

mouseZ := mouseZ + Mouse.lZ;
end;


В начале программы InitDirectInput, в конце CloseDirectInput;

Для получения состояния клавишь и мышки делаешь ReadDirectInputData, после этого в MouseX, MouseY будут значения смещения курсора по осям, а в MouseZ значение прокрутки колёсика мышки.

Обработка например идёт так:

//++++++Обработка нажатых клавишь++++++
//Клавиатура:
NumKeys:=ReadDirectInputData;
if NumKeys <> 0 then
for i := 0 to NumKeys - 1 do
begin
Case Keyboard[i].dwOfs of
//Если нажата клавиша ESC, тогда выйти из проигрывания ролика
DIK_ESCAPE : if Keyboard[i].dwData and $80<>0 then
begin //Если клавиша нажата
QuitProgram:=True;
end else //Если отпущена
begin
end;
end; //case Keyboard[i].dwOfs
end;
//Мышка:
if Mouse.rgbButtons[0] = 128 then begin //Нажата левая кнопка
end;
if Mouse.rgbButtons[1] = 128 then begin //Нажата правая кнопка
end;
if Mouse.rgbButtons[2] = 128 then begin //Нажата средняя кнопка
end;
if Mouse.rgbButtons[3] = 128 then begin //Нажата левая дополнительная
end;
if Mouse.rgbButtons[4] = 128 then begin //Нажата правая дополнительная
end;


 
3d[Power]   (2003-05-24 01:05) [24]

При инициализации DirectInput8 курсор пропадает вообще (сам), даже вне области окна.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2003.12.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.002 c
9-28378
Sword-Fish
2003-05-25 14:23
2003.12.09
Глюк с окном


9-28380
KIE
2003-05-22 13:26
2003.12.09
Граф движок, на чем лучше писать?


11-28392
alfromorel
2003-03-28 14:55
2003.12.09
Как перейти на следующие поле по Enter


9-28388
Juster~
2003-05-08 18:02
2003.12.09
2NailMan


9-28386
Holocaust
2003-05-26 17:30
2003.12.09
DelphiX/RPG/Collision





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский