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

Вниз

Помогите устранить ошибку(столкновение).   Найти похожие ветки 

 
_Jenaxx_   (2004-05-23 18:19) [0]

{Здравствуйте мастера =), где то у меня в коде есть ошибка вернее даже не ошибка а недоработка. Суть в том что при наезде на обьект, в данном случае дом, мне надо еще помимо столкновения с ним проехать на него 20 пикселей, поскольку у меня все спрайты одного размера(100 на 100), поэтому если бы персонаж уже на границе останавливался то было бы очень некрасиво(ведь визуально он бы в воздух упирался.) }
{Вот это процедура где происходит обработка столкновений. Я сделал чтобы он проезжал еще эти 20 пикселей, но проблема в том что он так весь спрайт может до конца и проехать, достаточно закрыть окошко которое появляеться при наезде на дом и закрыв его снова продвинуться на пиксель вперед, потом закрыть и снова проехать и так пока не проедешь, и еще при наезде закрываем это самое окошко(в house_reaction1) и пытаемся проехать обратно, но окно появляетсья даже если я еду назад. Это и опнятно ведь направление роли не играет, ведь мы в области спрайта и collision:=true;}
//Необходимо, сделать чтобы эти 20 пикселей по краям спрайта полностью отключить, чтобы добиться реального столкновения. Надеюсь все понятно.
//Delphi 7 + DelphiX

procedure TGameProcess.MakeMove(const Dir: TStepDirection);
var TtX, TtY, TtxX, TtyY : Integer ;
begin

 TtY := tY ;    //переменные куда сохраняем координаты игрока
 TtX := tX ;
 TtyY := fY ;
 TtxX := fX ;

   Case Integer(Dir) of  //движение игрока
   0 : if tX - STEPSIZE > 0 then tX := tX - STEPSIZE;
   1 : if tX + STEPSIZE  < WIDTHRESTRICT then tX := tX + STEPSIZE ;
   2 : if tY - STEPSIZE > 0 then tY := tY - STEPSIZE ;
   3 : if tY + STEPSIZE < HEIGHTRESTRICT then tY := tY + STEPSIZE ;
   end;

 if tX > fX * HW then //условия движения
   fX := fX + 1 ;
 if tX < fX * HW then
   fX := fX - 1 ;
 if tY > fY * HW then
   fY := fY + 1 ;
 if tY < fY * HW then
   fY := fY - 1 ;

{Обработка столкновения House 1 вот тут и надо что то исправить, это обработка столкновения когда мы идем по горизонтали по карте}
 
if not Collision then //если столкновения еще не было
   begin
     if FAreaField.ObjectOnMap[fX+1,fY] = 6 then // если обьект на карте номер 6 из DxImageList(дом)
        begin
          Collision :=true;  // ставим флаг наезда в true
          _tempCounter :=20;                // счетчик в 20(тип Integer)
        end;
   end else if _tempCounter=0 then // если счетчик уже обнулился
               begin
                 In_House1:=true; /флаг - мы в доме..
                 tX := TtX ;
                 tY := TtY ;
                 fX := TtxX ;
                 fY := TtyY ;
                 Collision :=false; //флаг - столкновения нету
             house_reaction1;{процедура которая выполняеться если мы в доме}
               end else dec(_tempCounter); { постепенно уменьшаем счетчик, если еще не равен 0 }


 
Ландграф Павел ©   (2004-05-23 20:37) [1]

Я не совсем понял что за окошко... видимо какое-то сообщение "мы в доме" да? Я бы лично с выводом окошка взял и отпихнул героя назад от дома на один пиксель, закрыв окно и сделав шаг опять окно, опять возвращаем на один ПИХЕЛь... или я чегой-то не понял?=)


 
_Jenaxx_   (2004-05-23 20:42) [2]

Да возникает картинка с кнопочками, - "типа мы в доме =)" .Но просто отпихивать назад это не самая лучшая идея. Значит зашел в дом, сделал там что то, окно закрываешь а ты стоишь в 20 пикселях от дома. Для дома это не критично. Но как быть с полностью статичными обьектами. Лес ??? подошел к дереву и тебя обратно откинуло на какое то расстояние???


 
Ландграф Павел   (2004-05-23 20:54) [3]

А ты еще способы знаешь, окромя как откидывания назад? ну можно предотвращать движение проверяя наперед куда мы премся при нажатии клавиши вперед, но не суть важно... главное отталкивать после того как мы сделали шаг на пиксель вперед: например при нажатии клавиши влево будет x:=x+1; а ниже этого если герой попал за границу дозволенного мы делаем x:=x-1; таким образом отрисовки x:=x+1; небудет вообще, и дерганья не будет... теперь угодил?=)


 
_Jenaxx_   (2004-05-24 19:37) [4]

Хмм..не совсем понимаю о чем речь, если можно то на примере моего кода показать как и что.


 
wiz ©   (2004-05-24 20:13) [5]

to _Jenaxx_:
честно говоря не работал с DelphiX, но почему бы тебе не сделать два спрайта:
1) "полный" спрайт - то, что видит пользователь на экране (в изометрии или еще как)
2) спрайт "коллизии" - спрайт (по хорошему вообще невидимый ;] ), который определяет коллизию. Что-нибудь вроде разреза на уровне метра от земли. Вот он-то должен быть на 20 пикселей "меньше" первого.

и так для всех объектов. первые ты показываешь пользователю, а на вторых обрабатываешь столкновение. (не знаю, насколько это реализуемо в DelphiX... просто мысли вслух)


 
ПсихЪ_клон   (2004-05-24 23:20) [6]

to wiz:
Реализуемо, точно. Если руки из того места растут. Но тут как я понял несколько про другое.

to _Jenaxx_:
Так или иначе придётся "отталкивать" игрока или просчитывать упреждающий коллижен. Кстати, функция упреждающего коллижена может возвращать число допустимых в следующем шаге пикселей перемещения. Например если у тебя каждый шаг равен 5 пикселям, а коллижен наступит через 3, то она вернёт тебе эти 3 пикселя. Будет что-то вроде:

x := x + CollisionDetect( char_id );


Вообще покопайся в сети на предмер создания аркад. Я натыкался много раз на этот вопрос в буржуйских статьях по созданию скролинговых аркад.



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

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

Наверх





Память: 0.47 MB
Время: 0.047 c
3-1093179316
CAMCOH
2004-08-22 16:55
2004.09.19
Как очистить таблицу с помощью Zeos


3-1092903418
Вера
2004-08-19 12:16
2004.09.19
TreeView


14-1093603838
SergP
2004-08-27 14:50
2004.09.19
Чем можно сделать chm?


1-1093871295
Sword
2004-08-30 17:08
2004.09.19
Распечатать Chart в масштабе 1;1


1-1094472221
4МО
2004-09-06 16:03
2004.09.19
Где достать?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский