|
Xors3D Графический движок с поддержкой DirectX9 |
25.10.2011, 09:49
|
#1
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
xfreeEntity
Всем привет. возникла следующая проблема
cube = xCreateCube()
xPositionEntity cube,-5,0,0
xFreeEntity cube
xPositionEntity cube,-10,0,0
a# = xEntityX(cube)
этот код не выдает ошибку и a получает координату -10 в итоге. более того, если удаленный объект подвергается каким-то модификациям, информация обновляется.. как будто он просто стал невидимым.
обнуление Cubу после xfreeentity тоже не дает нужного результата. объекты, обращающиеся к cube переходят к любому другому объекту и начинают брать информацию с него
это становится проблемой, когда этот entity передался какому-то объекту аргументом и уловки вроде "if entity=0" или "if xentityClass<>"Null"" не помогают. объект переходит к любому другому объекту на свой выбор.
помогите пожалуйста
|
(Offline)
|
|
25.10.2011, 12:15
|
#2
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: xfreeEntity
Сообщение от Vadimich
Всем привет. возникла следующая проблема
cube = xCreateCube()
xPositionEntity cube,-5,0,0
xFreeEntity cube
xPositionEntity cube,-10,0,0
a# = xEntityX(cube)
этот код не выдает ошибку и a получает координату -10 в итоге. более того, если удаленный объект подвергается каким-то модификациям, информация обновляется.. как будто он просто стал невидимым.
|
Это нормально, если бы деаллокатор физически заполнял очищенную область нулями или каким-то паттерном (что происходит в Debug-режиме), то все работало бы очень медленно. Просто не надо обращаться к удаленным объектам.
Сообщение от Vadimich
обнуление Cubу после xfreeentity тоже не дает нужного результата. объекты, обращающиеся к cube переходят к любому другому объекту и начинают брать информацию с него
это становится проблемой, когда этот entity передался какому-то объекту аргументом и уловки вроде "if entity=0" или "if xentityClass<>"Null"" не помогают. объект переходит к любому другому объекту на свой выбор.
помогите пожалуйста
|
Вот этого не понял. Пример, на котором можно воспроизвести, пожалуйста.
__________________
|
(Offline)
|
|
25.10.2011, 12:23
|
#3
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: xfreeEntity
проблема то как раз в том, чтобы сообщить функции, что объект удален. на стандартном блитце хватало (if entity>0 then (делаем что-то) )
|
(Offline)
|
|
25.10.2011, 12:33
|
#4
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: xfreeEntity
то что ты делаешь - называется UB. вешать на авторов мультимедийного движка те проверки, которые ты сам должен делать в клиентском коде - это неправильно и дерзко.
cube = xCreateCube()
xPositionEntity cube,-5,0,0
xFreeEntity cube; cube = 0;
xPositionEntity cube,-10,0,0
a# = xEntityX(cube)
и проверяй cube на 0
если я правильно понимаю то все handle для хорса ето 32 битный инт. такчто должно работать.
|
(Offline)
|
|
25.10.2011, 12:56
|
#5
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: xfreeEntity
у меня и в мыслях не было просто надеюсь, что вы мне поможете. вот накатал пример:
мне надо сделать так, чтобы красный объект оставался на месте после уничтожения target. не удалялся, а именно не двигался больше. надеюсь, пример понятный. просто на обычном блитце это работало..
;==============================
Target(0,15,1)
timer = 0
Repeat
WaitTimer (t)
xMoveMouse 320,240
timer=timer+1
If timer>50 Then
Target(Rnd(-10,10),15,0)
timer=0
EndIf
Target_update()
Reader_update()
xUpdateWorld()
xRenderWorld()
;!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
xFlip()
Until xKeyHit(1)
End
Type target
Field entity
Field speed#
End Type
Function Target(x#,y#, withObject=0)
t.Target = New target
t\entity = xCreateCube()
xPositionEntity t\entity,x,y,0
xScaleEntity t\entity,.3,.3,.3
t\speed = -Rnd(.05,.08)
If withObject = 1 Then Reader(t\entity)
End Function
Function Target_update()
For t.Target = Each target
xTranslateEntity t\entity,0,t\speed,0
If xEntityY(t\entity)<0 Then
xFreeEntity t\entity: t\entity=0
Delete t
EndIf
Next
End Function
Type Reader
Field entity
Field target
End Type
Function Reader(entity)
r.Reader = New Reader
r\entity = xCreateCube(): xEntityColor r\entity,255,0,0: xEntityAlpha r\entity,.5
r\target = entity
End Function
Function Reader_update()
For r.Reader = Each Reader
If r\target>0 Then xPositionEntity r\entity, xEntityX(r\target,1), xEntityY(r\target,1),0
Next
End Function
Последний раз редактировалось SBJoker, 25.10.2011 в 15:17.
|
(Offline)
|
|
25.10.2011, 14:54
|
#6
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: xfreeEntity
Ну у меня красный большой куб останавливается после того, как маленький исчезает. Что не так?
__________________
|
(Offline)
|
|
25.10.2011, 15:02
|
#7
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: xfreeEntity
через пару сек он снова начинает движение "верхом" уже на другом маленьком
|
(Offline)
|
|
25.10.2011, 15:46
|
#8
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: xfreeEntity
r\target тоже нужно в ноль сбрасывать.
ЗЫ. Вообще занятная тема. Возможно стоит перевести все это дело на некие идентификаторы, а не явные указатели на объекты. Муторно, конечно, и наивная реализация будет медленной, но, возможно, стоит поковыряться.
__________________
|
(Offline)
|
|
25.10.2011, 15:59
|
#9
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: xfreeEntity
2.Squid: ты имеешь ввиду обнулить его в функции target_update(), когда ентити удаляется? При этом экземпляр должен не только знать, что на нём "сидит" Reader, но и иметь ссылку на этот объект (конечно я могу и ошибаться). а суть в том, чтобы Reader мог снимать координаты с любого entity(yt подготовленного для работы с Reader), к которому его применят, до того момента, пока этот объект существует
|
(Offline)
|
|
25.10.2011, 16:15
|
#10
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: xfreeEntity
Включи лог и посмотри на хендлы кубов. Они повторяются - новый куб может быть создан на месте старого, т.к. размеры объектов одинаковые и аллокатору удобно засунуть новый объект на место старого.
При этом в r\target все еще хранится указатель на объект, который может быть уже не тем первоначальным объектом.
Type target
Field entity
Field speed#
Field r.Reader
End Type
Function Target(x#,y#, withObject=0)
Local t.target = New target
t\entity = xCreateCube()
xPositionEntity t\entity,x,y,0
xScaleEntity t\entity,.3,.3,.3
t\speed = -Rnd(.05,.08)
If withObject = 1 Then t\r = Reader(t\entity)
End Function
Function Target_update()
Local t.target
For t.target = Each target
xTranslateEntity t\entity,0,t\speed,0
If xEntityY(t\entity)<0 Then
xFreeEntity t\entity: t\entity=0
If t\r <> Null
t\r\target = 0
EndIf
Delete t
EndIf
Next
End Function
Type Reader
Field entity
Field target
End Type
Function Reader.Reader(entity)
r.Reader = New Reader
r\entity = xCreateCube(): xEntityColor r\entity,255,0,0: xEntityAlpha r\entity,.5
r\target = entity
Return r
End Function
Function Reader_update()
For r.Reader = Each Reader
If r\target>0 Then xPositionEntity r\entity, xEntityX(r\target,1), xEntityY(r\target,1),0
Next
End Function
__________________
|
(Offline)
|
|
25.10.2011, 16:15
|
#11
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: xfreeEntity
cube = xCreateCube()
xPositionEntity cube,-5,0,0
xFreeEntity cube
cube = 0
xPositionEntity cube,-10,0,0
a# = xEntityX(cube)
|
Как сказал HolyDel, это твоя задача обнулять свои же переменные..
|
(Offline)
|
|
25.10.2011, 16:27
|
#12
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: xfreeEntity
т.е. с "не подготовленными" для работы с reader'om объектами этого сделать не получится?
спасибо
|
(Offline)
|
|
25.10.2011, 16:36
|
#13
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: xfreeEntity
Ну вообще в нормальных проектах, сам entity, это лишь мелкая визуальная составляющая, и логика крутится относительно самих данных объекта, где entity лишь визуальное отображение их.
|
(Offline)
|
|
25.10.2011, 16:44
|
#14
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: xfreeEntity
ну да, так оно и есть
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:50.
|