Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

передвижение персонажа

-

Общение разработчиков

- Программирование для Perfect World, общение и обсуждене разработок

Ответ
 
Опции темы
Старый 07.08.2012, 21:36   #16
-= Мастер Света =-
 Рыцарь-капитан
Аватар для krukovis
 
krukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нации
Регистрация: 07.10.2009
Сообщений: 496
Популярность: 2687
Сказал(а) спасибо: 64
Поблагодарили 325 раз(а) в 105 сообщениях
 
По умолчанию Re: передвижение персонажа

Цитата:
Сообщение от sumikotПосмотреть сообщение
Ну это слишком просто. И опять к нажатиям переходить? Я от них уже ушел

Новое - это хорошо забытое старое ))
Цитата:
Сообщение от sumikotПосмотреть сообщение
Тоже не хочу. Гораздо больше адресов. Труднее будет обновлять. Да и заморочек больше. У меня в самом первом боте использовался массив Action, в том числе и ручник. На мой взгляд - гемор.

Тогда либо смирись с разворотом перса, либо Esc. А вообще, расскажи плз, в каких это случаях тебе нужно останавливать перса. Ни разу не встречал необходимости останавливать перса.
________________
--------------------------------------------

Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
- Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------

Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
- Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------

Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
- патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
  Ответить с цитированием
Старый 07.08.2012, 22:27   #17
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 145 раз(а) в 36 сообщениях
 
По умолчанию Re: передвижение персонажа

Цитата:
Сообщение от krukovisПосмотреть сообщение
Тогда либо смирись с разворотом перса, либо Esc. А вообще, расскажи плз, в каких это случаях тебе нужно останавливать перса. Ни разу не встречал необходимости останавливать перса.

Esc, если я правильно помню, сначала вытирает таргет. Только потом стоп. Буду в игре - посмотрю. А остановка нужна при упоре в препятствие, допустим. Ведь когда играет человек, он не ждет, пока перс на месте полминуты будет бежать. Потом стоп нужен еще при копке ресов и при подьеме лута. Что делает человек? Ткнул в пенек, перс недобегая, остановился и копает. А бот (во всяком случае, у меня) отправляет перса по координатам этого пенька, ждет остановки, потом (стоя с пеньком в одних координатах) начинает копать. Можно отследить дистанцию и остановить, недобегая. Можно вычислить точку, куда послать, чтобы он недобежал. В этом варианте лень возиться с расчетами в трехмерной системе, хотя он самый удачный. А теперь что получилось со стопом по инжекту с текущими координатами - останавливается, недобегая, разворачивается спиной к пеньку и начинает копать... Неэстетично как то...
Все таки буду точку считать, раз вариантов больше нет.
  Ответить с цитированием
Старый 07.08.2012, 23:28   #18
 Старший сержант
Аватар для N00bSa1b0t
 
N00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядомN00bSa1b0t в состоянии испепелить взглядом
Регистрация: 09.04.2010
Сообщений: 204
Популярность: 5518
Сказал(а) спасибо: 49
Поблагодарили 512 раз(а) в 198 сообщениях
 
По умолчанию Re: передвижение персонажа

А если сразу послать пакет на стоп, но только с неправильными координатами? Так геобот делает, после подьема на высоту. В итоге сервер нам пришлет пакет с текущими координатами и все. Правда хз, прекратится ли инжект на движение.
Кстати, а может попробовать поймать инжект на остановку? Тот, что происходит при нажатии ESC


Цитата:
Сообщение от sumikotПосмотреть сообщение
Esc, если я правильно помню, сначала вытирает таргет.

А если таргета нету, то будет стоп


Цитата:
Сообщение от sumikotПосмотреть сообщение
А бот (во всяком случае, у меня) отправляет перса по координатам этого пенька,

Дык, определи расстояние на котором перс может копать пенек. И беги не в точку пенька, а рядом и все.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]-cофт и прочее для комфортной игры в PW.

Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
  Ответить с цитированием
Старый 08.08.2012, 08:52   #19
-= Мастер Света =-
 Рыцарь-капитан
Аватар для krukovis
 
krukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нации
Регистрация: 07.10.2009
Сообщений: 496
Популярность: 2687
Сказал(а) спасибо: 64
Поблагодарили 325 раз(а) в 105 сообщениях
 
По умолчанию Re: передвижение персонажа

Цитата:
Сообщение от sumikotПосмотреть сообщение
отом стоп нужен еще при копке ресов и при подьеме лута.

У меня это делает инжект, который тыкает по пеньку и перс бежит к пеньку и копает или собирает лут.
Если обнаруживается припятствие - нужно бежать в бок или назад, но никак не останавливаться, если, конечно, ты не научился работать с directX-овскими объектами и вычислять координаты препятствий.
________________
--------------------------------------------

Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
- Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------

Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
- Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------

Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
- патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
  Ответить с цитированием
Старый 08.08.2012, 11:21   #20
Бандеровец
 Лейтенант-командор
Аватар для VeTaL_UA
 
VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(
Регистрация: 12.08.2010
Сообщений: 727
Популярность: 30569
Золото Zhyk.Ru: 1
Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
Отправить сообщение для VeTaL_UA с помощью ICQ Отправить сообщение для VeTaL_UA с помощью Skype™
 
По умолчанию Re: передвижение персонажа

В порядке бреда: перед остановкой вынуть из клиента угол поворота персонажа, отправить инжект в текущие координаты и запихнуть в клиент угол поворота, который был до отправки инжекта. Это конечно бред, так как исправит последствия, а не причину. Попробуй посылать в инжекте на "остановку" координаты +1/2, может помочь, хотя и не лучшее решение
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).

Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.

Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.


  Ответить с цитированием
Старый 09.08.2012, 19:18   #21
 Разведчик
Аватар для vladoscom93
 
vladoscom93 никому не известный тип
Регистрация: 23.02.2011
Сообщений: 19
Популярность: 18
Сказал(а) спасибо: 30
Поблагодарили 4 раз(а) в 2 сообщениях
 
По умолчанию Re: передвижение персонажа

пытаюсь перейти в точку 573 654 на карте клиент почему-то крашится... есть подозрения на то, что координаты неправильно привожу... вот код:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  PParams = ^TParams;
  TParams = packed record
    Param1: DWord;
    Param2,Param3,Param4: Single;
  end;

const
  PW_BASE_ADDRESS = $009C0E6C;
  PW_GAMERUN_ADDR = $00A57ACC;

var
  Form1: TForm1;
  rw: cardinal;
  hProcess: Dword;

implementation

{$R *.dfm}
procedure InjectFunc(ProcessID: Cardinal; Func, aParams: Pointer;
  aParamsSize: DWord);
var
  hThread: THandle;
  lpNumberOfBytes: DWord;
  ThreadAddr, ParamAddr: Pointer;
begin
  if ProcessID<>0 then
  begin
    // ---- Âûäåëÿåì ìåñòî â ïàìÿòè ïðîöåññà, è çàïèñûâàåì òóäà íàøó ôóíêöèþ
    ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);

    // ---- Òàêæå çàïèøåì ïàðàìåòðû ê íåé
    ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);

    // ---- Ñîçäàåì ïîòîê, â êîòîðîì âñå ýòî áóäåò âûïîëíÿòüñÿ.
    hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);

    // ---- Îæèäàåì çàâåðøåíèÿ ôóíêöèè
    WaitForSingleObject(hThread, INFINITE);

    // ---- ïîä÷èùàåì çà ñîáîé
    CloseHandle(hThread);
    VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE);
    VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE);
  end
end;

procedure WalkCall(aPParams:PParams);Stdcall;
var CallAddress1,CallAddress2,CallAddress3:Pointer;
    x,y,z:single;
    flying:DWORD;
begin
CallAddress1:=Pointer($00468070);
CallAddress2:=Pointer($0046BCB0);
CallAddress3:=Pointer($00468470);
x:=aPParams^.Param2;
y:=aPParams^.Param3;
z:=aPParams^.Param4;
flying:=aPParams^.Param1;
 asm
  pushad
  mov eax, dword ptr [PW_GAMERUN_ADDR]
  mov esi, dword ptr [eax+$20]
  mov ecx, dword ptr [esi+$FE0]
  push 1
  call CallAddress1
  mov edi, eax
  lea eax, dword ptr [esp+$0C]
  push eax
  push flying
  mov ecx, edi
  call CallAddress2
  mov ecx, dword ptr [esi+$FE0]
  push 0
  push 1
  push edi
  push 1
  call CallAddress3
  mov eax, dword ptr [PW_GAMERUN_ADDR]
  mov eax, dword ptr [eax+$20]
  mov eax, dword ptr [eax+$FE0]
  mov eax, dword ptr [eax+$30]
  mov ecx, dword ptr [eax+$4]
  mov eax, x
  mov dword ptr[ecx+$20], eax
  mov eax, z
  mov dword ptr[ecx+$24], eax
  mov eax, y
  mov dword ptr[ecx+$28], eax
  popad
 end;
end;

function BaseWalkMode: dword;
var
  addr: dword;
begin
  readprocessmemory(hProcess, ptr(PW_GAMERUN_ADDR), @addr, sizeof(addr), rw);
  readprocessmemory(hProcess, ptr(addr + $20), @addr, sizeof(addr), rw);
  readprocessmemory(hProcess, ptr(addr + $61C), @addr, sizeof(addr), rw);
  result := addr;
end;

procedure Walk(x,y,z:single);
var aParams: TParams;
  walkmode: dword;
begin
ReadProcessMemory(hProcess, ptr(BaseWalkMode), @WalkMode, 1, rw); //BaseWalkMode = GA +20 +61C
if WalkMode = 0 then aParams.Param1:=0 else aParams.Param1:=1;
aParams.Param2:=x;
aParams.Param3:=y;
aParams.Param4:=z;
InjectFunc(hProcess,@WalkCall,@aParams,SizeOf(aParams));
end;

procedure ConnectClient;
var
  PID: Dword;
  WID: Thandle;
begin
  WID := FindWindow(nil, 'Perfect World');
  GetWindowThreadProcessId(WID, @PID);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  X, Y, Z: single;
  cX, cY, cZ: single;
begin
  ConnectClient;
  //573654;
  cX := 57;
  cY := 36;
  cZ := 54;
  x := cX/10 + 400;
  y := cY/10 + 550;
  z := cZ/10;
  Walk(x,y,z);
end;
  Ответить с цитированием
Старый 28.01.2013, 22:14   #22
 Разведчик
Аватар для yeyebvz
 
yeyebvz никому не известный тип
Регистрация: 04.09.2010
Сообщений: 20
Популярность: 10
Сказал(а) спасибо: 14
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: передвижение персонажа

Цитата:
Сообщение от sumikotПосмотреть сообщение
асм:
Код:
....
push Param_add // адрес координат для движения
....
ret

для Param_add подошёл следующий формат
Код:
 Pxyz = ^xyz;
 xyz = record
    x : single;
    z : single;
    y : single;
 end;

Var
    coord : xyz;
    Pcoord : Pxyz;

// 
coord.x := x;
coord.y := y;
coord.z := z;
Pcoord := @coord;
//
push Pcoord


и что значит ret в конце? - без него сработало, предыдущий код был без ret

Последний раз редактировалось yeyebvz; 28.01.2013 в 23:57.
  Ответить с цитированием
Старый 29.01.2013, 01:43   #23
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 145 раз(а) в 36 сообщениях
 
По умолчанию Re: передвижение персонажа

Цитата:
Сообщение от yeyebvzПосмотреть сообщение
и что значит ret в конце? - без него сработало, предыдущий код был без ret

Тут все зависит от компилятора и языка. Я писал на аутоит, ret (возврат из подпрограммы) там был нужен обязательно. Когда тот же инжект попробовал написать на С++, а затем декомпилировать, увидел, что компилятор подставляет его сам.
  Ответить с цитированием
Старый 29.01.2013, 19:43   #24
-= Мастер Света =-
 Рыцарь-капитан
Аватар для Ginrey
 
Ginrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака Норриса
Регистрация: 14.06.2012
Сообщений: 511
Популярность: 7566
Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
 
По умолчанию Re: передвижение персонажа

а на 1.3.6 есть инжект движения?
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо"
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).

Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
  Ответить с цитированием
Старый 29.01.2013, 21:38   #25
-= Мастер Света =-
 Рыцарь-лейтенант
Аватар для Smertig
 
Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(Smertig сломал счётчик популярности :(
Регистрация: 31.01.2011
Сообщений: 413
Популярность: 14489
Золото Zhyk.Ru: 300
Сказал(а) спасибо: 77
Поблагодарили 361 раз(а) в 145 сообщениях
Отправить сообщение для Smertig с помощью ICQ Отправить сообщение для Smertig с помощью Skype™
 
По умолчанию Re: передвижение персонажа

Цитата:
Сообщение от GinreyПосмотреть сообщение
а на 1.3.6 есть инжект движения?

Абсолютно такой же, но с другими адресами
________________
Больше не занимаюсь читами, ушёл в серверную часть. Новый ник - int 3.
P.S. Но я всё такой же добрый модератор раздела PW.
  Ответить с цитированием
Старый 30.01.2013, 01:52   #26
 Разведчик
Аватар для yeyebvz
 
yeyebvz никому не известный тип
Регистрация: 04.09.2010
Сообщений: 20
Популярность: 10
Сказал(а) спасибо: 14
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: передвижение персонажа

мозг взорван... если после запуска клиента какое-то время не трогать (какое не удалось выяснить) - то прога компилится, правится, снова компилится - и перс движется.
после перезапуска клиента - та же прога, которая только что на ура двигала перса - вызывает краш. причём соединение идёт, информацию читает

Код:
 Pxyz = ^xyz;
 xyz = record
    x : single;
    z : single;
    y : single;
 end;

procedure WalkCall(aPParams:PParams);Stdcall;
const
  ActionArrOfs=nz_ActionArrOfs;
var
  WalkMode:DWORD;
  coord : xyz;
  Pcoord : Pxyz;
begin
  coord.x := aPParams^.x;
  coord.y := aPParams^.y;
  coord.z := aPParams^.z;
  Pcoord := @coord;
  WalkMode:=aPParams^.Param1;
 asm
pushad
mov edx, nz_base_add
mov ecx, dword ptr [edx]
mov edx, dword ptr [ecx+nz_pers_path_1]
mov esi, [edx+nz_pers_path_2]
mov ecx, dword ptr [esi+ActionArrOfs]
mov eax, dword ptr [esi+WalkMode]
push $01
mov edx, nz_walk1
call edx
mov edi, eax
push Pcoord // адрес координат для движения
push WalkMode// 0- пешком, 1- полет, вплавь
mov ecx, edi
mov edx, nz_walk2
call edx
push $00
push $01
push edi
push $01
mov ecx, dword ptr [esi+ActionArrOfs]
mov edx, nz_walk3
call edx
popad
 end;
end;


procedure Walk_nz(hProcess : Cardinal; x,y,z:Single; BaseWalkMode:Byte);
var aParams: TParams;
begin
  if BaseWalkMode = 0 then aParams.Param1:=0 else aParams.Param1:=1;
  AParams.x:=x;
  AParams.y:=y;
  AParams.z:=z;

  InjectFunc(hProcess,@WalkCall,@aParams,SizeOf(aParams));
end;
закоромерность вылета следующая: после перезапуска клиента - если координаты брать как переменные - из скажем результата считывания xyz моба - будет вылет. если подсунуть координаты в виде чисел - перс движется. после этого возвращаем переменные - перс движется.

Цитата:
Сообщение от sumikotПосмотреть сообщение
Сохраняешь в выделенной памяти клиента три переменные флоат x.z.y подряд.

есть подозрение, что память под push Pcoord надо таки выделять в памяти клиента - а не программы. вот только как это сделать?

Последний раз редактировалось yeyebvz; 30.01.2013 в 01:58.
  Ответить с цитированием
Старый 30.01.2013, 23:10   #27
 Разведчик
Аватар для GenOstr
 
GenOstr никому не известный тип
Регистрация: 12.12.2010
Сообщений: 4
Популярность: 14
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
 
По умолчанию Re: передвижение персонажа

Цитата:
Сообщение от yeyebvzПосмотреть сообщение
есть подозрение, что память под push Pcoord надо таки выделять в памяти клиента - а не программы. вот только как это сделать?

Элементарно. )))) запихиваешь координаты в стэк и передаешь указатель стека как push Pcoord // адрес координат для движения

Добавлено через 12 минут
Цитата:
Сообщение от krukovisПосмотреть сообщение
Если обнаруживается припятствие - нужно бежать в бок или назад, но никак не останавливаться, если, конечно, ты не научился работать с directX-овскими объектами и вычислять координаты препятствий.

зачем такие сложности? в серверных картах все непроходимые места обозначены. добавить только координаты динамических обьектов (нпс и проч.)- и все. а если уж совсем по-взрослому: пропускаешь всю эту кухню через волну или А* и никто никуда не упирается и бежит как живой )))))

Последний раз редактировалось GenOstr; 30.01.2013 в 23:22. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 31.01.2013, 00:05   #28
 Разведчик
Аватар для yeyebvz
 
yeyebvz никому не известный тип
Регистрация: 04.09.2010
Сообщений: 20
Популярность: 10
Сказал(а) спасибо: 14
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: передвижение персонажа

Цитата:
Сообщение от GenOstrПосмотреть сообщение
Элементарно. )))) запихиваешь координаты в стэк и передаешь указатель стека как push Pcoord // адрес координат для движения

угу)) что такое стек понимаю. лекции по програмингу и математике. вот только засада... почему-то на программировании тупо рассказывают теорию, забывая о практике... что такое var i:integer; - понятно, record - тоже)) но я так и не понял что такое стек в программировании - как объявляется, как потом стучаться в его элементы...
в общем.... буду пробовать переписывать старую функцию, где координаты отдавались в теле, без выделения памяти((
  Ответить с цитированием
Старый 31.01.2013, 15:37   #29
 Разведчик
Аватар для krysun
 
krysun на правильном пути
Регистрация: 01.07.2009
Сообщений: 23
Популярность: 83
Сказал(а) спасибо: 33
Поблагодарили 14 раз(а) в 11 сообщениях
Отправить сообщение для krysun с помощью Skype™
 
По умолчанию Re: передвижение персонажа

Можно сделать так.

Код:
Sh - расстояние точки останова к ресу (луту, или что там у вас)
XT, YT - координаты точки где надо остановится
XC, YC - текущие координаты
XR, YR - координаты реса

if (XC > XR) then 
  XT := XR + Sh 
else 
  XT := XR - Sh;

if (YC > YR) then 
  YT := YR + Sh
else 
  YT := YR - Sh;
Нарисовать на листик ось, ткнуть 2-е точки и пораскинуть мозгами? Не, не слышал...

Последний раз редактировалось krysun; 31.01.2013 в 15:44.
  Ответить с цитированием
Старый 31.01.2013, 17:02   #30
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 21.03.2012
Сообщений: 83
Популярность: 1178
Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
 
По умолчанию Re: передвижение персонажа

Цитата:
Сообщение от yeyebvzПосмотреть сообщение
но я так и не понял что такое стек в программировании - как объявляется, как потом стучаться в его элементы...

Тут в принцыпе теории(и воображения) должно быть вполне достаточно)
Вот пример: мы пишем на низкоуровневом языке, например асме. Мы написали кусок кода - функцию, которая выполняет какие-либо действия(возможно и возвращает какое либо значение), так же она принимает какие-либо входящие значения. Как мы можем из различных кусков кода нашей программы перейти по адресу этой сАмой функции, и при этом она бы получила эти данные? Понятно, что перед переходом нужно эти входные данные куда-то поместить, и функция должна знать откуда их брать, не зная с какого места проги к ней вообще перепрыгнули. Для этого существуют регистры процессора и стек. То-есть мы пишем функцию, которая к примеру берёт значение с определённого регистра и производит на основании этого параметра "что-нибудь". Значит перед обращением к функции, мы должны параметр(или несколько) пихнуть в этот регистр(или несколько), а другой кусок кода(наша функция) уже их оттуда берёт. Так же есть другой способ передачи параметров в функцию, существует такая штука как СТЕК. Стек - это кусок памяти, в котором при выполнении проги хранятся какие-либо данные. Этот стек можено "наполнять" различными значениями, для этого существует команда процессора в (ассемблерном написании) PUSH [регистр], при этом значение из регистра копируется в стек(в начало памяти, отведённое под этот стек). Откуда процессор знает где этот самый адрес в стеке и куда помещать значение из указанного регистра по команде PUSH? А это значение адреса так же находится в одном из регистров процессора, который служит для работы со стеком. После приведённой выше команды проц берёт из указанного регистра значение и "пихает" его в память по адресу, который указан в регистре SP(стек пойнт - вершина стека) при этом он автоматом уменьшает значение регистра-указателя вершины стека, чтобы при следующем PUSH второе помещаемое значение не затёрло первое(оно нам ещё нужно, ну не зря же мы его в стек пихали), размер стека естественно увеличится, так как там уже 2 значения. При переходе в функцию, значение из стека достаётся командой POP [регистр], при этом всё происходит в обратном порядке.

Кстати, при вызове функции (CALL) мы переходим по какому-либо адресу, но ведь функция подразумевает возврат в то место, откуда мы на неё перешли, не так ли? Так вот адрес возврата тоже помещается в стек, и при RET из функции значение из стека берётся и по этому адресу переход и происходит обратно.

На практике ты вообще можешь нафиг не знать где и в каком месте этот стек находится, главное знать для чего он нужен и понимать в каком порядке туда помещаются значения(принцып LIFO, Last In, First Out — последним пришёл — первым ушёл).

Теперь что касется языков более высокого уровня.. Там ведь нет таких заморочек с регистрами-шмегистрами? Есть, просто это всё представлено в намного удобной форме.
Допустим у нас есть функция

float Испечь_лепёшек(int kol)
{
float удачно_испечёные = kol * 0.01;
return удачно_испечёные;
}

И в проге мы эту функцию вызываем

1| float a = Испечь_лепёшек(1000);
2| bool b = огорчиться_что_нихера_не_вышло;

При вызове функции наше значение 1000 пихнётся в стек, а в функции, когда мы будем оперировать значением kol - это и будет это значение "достатое" со стека.
return удачно_испечёные; - возмёт адрес возврата(а это будет адрес сделующей строчка нашей программы - 2| bool b = огорчиться_что_нихера_не_вышло и перейдёт по нему, то-есть вернётся из функции.

Так вот что касается практики.. просто знайте что оно происходит примерно так, либо пишите на асме, чтоб прям всем и вся управлять самому)). Кстати, в настройках компиляторов должен быть такой пункт, как указать нужный для нашей проги способ передачи параметров, через стек или через регистры, но любителю нафиг об этом задумываться, писать себе прогу, а там как нибудь да передастся)).

Если где-то ошибся в объяснении, надеюсь меня поправяи и не отругают ногами)

Добавлено через 2 минуты
Цитата:
Сообщение от yeyebvzПосмотреть сообщение
угу)) что такое стек понимаю. лекции по програмингу и математике. вот только засада... почему-то на программировании тупо рассказывают теорию, забывая о практике... что такое var i:integer; - понятно, record - тоже)) но я так и не понял что такое стек в программировании

ну да))

Цитата:
Сообщение от yeyebvzПосмотреть сообщение
как объявляется, как потом стучаться в его элементы...

стучаться POP-ом, запихивать в него PUSH-ем на асме, а в яз высокого уровня ты не задумываешься об этом. просто птшешь в проге тот параметр как входящий в функции указан, при компиляции всё само "раскидается" как нуно
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝

Последний раз редактировалось dwa83; 31.01.2013 в 17:09. Причина: Добавлено сообщение
  Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
Smertig (31.01.2013), Unheilig)) (04.10.2013), yeyebvz (02.02.2013)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Передвижение камеры pia3333(4) Общение разработчиков 28 29.07.2012 22:51
[Помогите!] передвижение по координатам Meg(0) Общение разработчиков 4 24.05.2012 15:22
[Помогите!] Передвижение вещей с Чара dar0k Общение и обсуждение, архив Lineage 2 2 21.01.2012 10:50
Передвижение ассассинов *ZLOY* Баги и читы для Aion 1 15.10.2010 05:48

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 22:23.

Пишите нам: forum@zhyk.ru
Copyright © 2025 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net