[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]


  • Страница 1 из 1
  • 1
Модератор форума: Spidy, turBO, blitz3d  
Форум мира Blitz3D » Язык Blitz3D » 3D программирование » Открыть дверь и выбор предмета (Поможите люди добрыя)
Открыть дверь и выбор предмета
LavatarДата: Понедельник, 05.01.2009, 15:19 | Сообщение # 1
ламер
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Вообще-то я не программист, но нужда заставила... начальство сказало - надо сделать одну штуку... и изъе...вайся как хочешь...
Прошу помощи по следующим вопросам:
1) Как лучше организовать открытие двери, чтобы открывалась как при подходе к ней, а после прохода закрывалась, не защемляя игрока, так и при нажатии на кнопку рядом с дверью (кстати дверь слеплена из спрайтов - чтобы не грузила систему).
2) Пытался организовать выбор предмета (допустим стола, лампы на столе), однако не работает... Хотел сделать чтобы при однократном нажатии ЛКМ на предмете он изменял бы свой цвет, при повторном - возвращался бы первоначальный. При нажатии ПКМ - снимается весь выбор. Для определения того, в каком состоянии находится предмет (до или после выбора) использовал GetBrushTexture (GetEntityBrush (Entity),1).
Вот кусок функции, которые я использовал:

Function MouseTest(); функция MouseTest-реализация выбора и нажатия клавиши мыши
Local mx#,my#
mx#=MouseX()
my#=MouseY()

Local pick

pick=CameraPick (camera,mx#,my#); выбирает объект, находящийся в области просмотра камеры и координатах mx и my (в данном случае указателя мыши)
If pick<>0 Then ;если указатель мыши находится на объекте
If MausHitR Then; если нажата правая клавиша мыши
DeleteTex PickedEntity();
EndIf
If MausHitL Then
SelectBox PickedEntity()
EndIf
EndIf
End Function

Function SelectBox(Entity)
If Entity=0 Then Return 0
DebugLog "SelectBox"
Local twice=0
If GetBrushTexture (GetEntityBrush (Entity),1)=True Then
DeleteTex Entity
twice=True
EndIf

If twice=True Then Return 0

BrushTexture BrushLamp,TexLampGreen,0,1: PaintMesh Entity,BrushLamp

Return True

End Function

Function DeleteTex (DelEntity); красим одним цветом===========================================================================
BrushLamp=CreateBrush(): BrushTexture BrushLamp,TexLampRed: PaintMesh DelEntity,BrushLamp
End Function

Не пойму, почему когда снимаю текстуру с объекта, то оа какая-то не понятная, меняется во времени... и ее нельзя сравнить с текстурой, которуя я на предмет изначально накладывал...
Может кто подскажет, как это все попроще реализовать?

 
turBOДата: Четверг, 08.01.2009, 23:53 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 297
Награды: 5
Репутация: 12
Статус: Offline
Гм...
По первому вопросу. Если необходимо чтобы дверь реагировала на героя - здесь множество путей реализации. Можно использовать коллизии:

Const TYPE_DOOR=1,TYPE_PLAYER=2
Collisions TYPE_PLAYER,TYPE_DOOR,2,3

;и далее
If EntityCollided( TYPE_PLAYER,TYPE_DOOR )
...
endif

Также не исключаю что тебе больше подходит вариант использования дистанции:

if EntityDistance (door, player_mesh)<10 RotateEntity door,0,50,0

...что-то в таком духе.

Насчёт манипуляций с кистью не всё понимаю.
Цитата: Не пойму, почему когда снимаю текстуру с объекта, то оа какая-то не понятная, меняется во времени...

Ты не случайно не путаешь возвращаемые handle обьектов?


If 2+2<>4 Then Restart
 
LavatarДата: Вторник, 13.01.2009, 11:27 | Сообщение # 3
ламер
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
С дверью я уже разобрался, примерно тем образом, через дистанцию...
А про текстуру: когда я использую команду GetBrushTexture (GetEntityBrush (Entity),1) - он мне что возвращает?
 
blitz3dДата: Пятница, 16.01.2009, 09:31 | Сообщение # 4
Admin
Группа: Администраторы
Сообщений: 203
Награды: 3
Репутация: 7
Статус: Offline
Ко второму вопросу - GetBrushTexture не подойдет.
Используй для такого случая переменную, которая будет описывать состояние предмета. Если предметов несколько вводи массив.

Code

Dim predmety(10)            ;установка массива из десяти предметов
Dim Predmet_entity(10)    ;установка массива мэшей (энтити)

Далее проверяем нажатие на объекте и окрашиваем его соответственно его состоянию

Code

If MouseHit(1) And VibranPredmet Then        ;проверяем нажат ли объект ЛКМ
    predmety(Predmet)=1-predmety(Predmet)  ;изменение состояния объекта
    End If

For a=1 To 10   ;проверка и окраска
    If predmety(a)=0 Then EntityColor Predmet_entity(a),0,0,0
    If predmety(a)=1 Then EntityColor Predmet_entity(a),255,0,255
    Next


перед тобой две таблетки - красная и синяя - какую ты выберешь?
 
LavatarДата: Среда, 28.01.2009, 16:08 | Сообщение # 5
ламер
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Что-то я не догоняю, как работает проверка состояния объекта? То есть VibranPredmet это PickedEnttity? И как predmety(Predmet)=1-predmety(Predmet) определяет, что объект перекрасился?
Поподробнее опишу пример ситуации, которую мне нужно создать: Допустим на доме решетка, и мне надо проверить целая ли она, я подхожу, визуально осматриваю, а после осмотра щелкаю на нее (причем когда я навожу на нее курсор-она подсвечивается). Она помечается как осмотренная, т.е. заносится в какой-то счетчик и перестает реагировать на наведение курсора и на щелчки ЛКМ. При этом если я не щелкаю на нее, а просто отвел курсор в сторону она перестает подсвечиваться, а если еще раз навел - опять подсвечивается, пока не щелкну на ней ЛКМ... такая вот задачка Решетка то никуда не девается после осмотра

Добавлено (28.01.2009, 17:08)
---------------------------------------------
blitz3d, с твоим кодом разобрался, вроде работает, может еще одну проблему подскажешь?
вопрос - у меня игрок пока состоит из пивота, к которому крепятся камера и прямоугольник. Пытался определить расстояние от игрока до объекта (PickedEntity ()) с помощью EntityDistance (player,PickedEntity ()) - возвращает почему-то ноль, на какое бы расстояние к объекту не подходил... причем в качестве игрока проверял и камеру, и пивот и прямоугольник...

 
Форум мира Blitz3D » Язык Blitz3D » 3D программирование » Открыть дверь и выбор предмета (Поможите люди добрыя)
  • Страница 1 из 1
  • 1
Поиск: