Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 25.10.2011, 09:49   #1
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 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
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 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
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: xfreeEntity

проблема то как раз в том, чтобы сообщить функции, что объект удален. на стандартном блитце хватало (if entity>0 then (делаем что-то) )
(Offline)
 
Ответить с цитированием
Старый 25.10.2011, 12:33   #4
HolyDel
 
Регистрация: 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
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 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
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: xfreeEntity

Ну у меня красный большой куб останавливается после того, как маленький исчезает. Что не так?
__________________

(Offline)
 
Ответить с цитированием
Старый 25.10.2011, 15:02   #7
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: xfreeEntity

через пару сек он снова начинает движение "верхом" уже на другом маленьком
(Offline)
 
Ответить с цитированием
Старый 25.10.2011, 15:46   #8
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: xfreeEntity

r\target тоже нужно в ноль сбрасывать.
ЗЫ. Вообще занятная тема. Возможно стоит перевести все это дело на некие идентификаторы, а не явные указатели на объекты. Муторно, конечно, и наивная реализация будет медленной, но, возможно, стоит поковыряться.
__________________

(Offline)
 
Ответить с цитированием
Старый 25.10.2011, 15:59   #9
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: xfreeEntity

2.Squid: ты имеешь ввиду обнулить его в функции target_update(), когда ентити удаляется? При этом экземпляр должен не только знать, что на нём "сидит" Reader, но и иметь ссылку на этот объект (конечно я могу и ошибаться). а суть в том, чтобы Reader мог снимать координаты с любого entity(yt подготовленного для работы с Reader), к которому его применят, до того момента, пока этот объект существует
(Offline)
 
Ответить с цитированием
Старый 25.10.2011, 16:15   #10
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 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
moka
.
 
Регистрация: 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
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: xfreeEntity

т.е. с "не подготовленными" для работы с reader'om объектами этого сделать не получится?
спасибо
(Offline)
 
Ответить с цитированием
Старый 25.10.2011, 16:36   #13
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: xfreeEntity

Ну вообще в нормальных проектах, сам entity, это лишь мелкая визуальная составляющая, и логика крутится относительно самих данных объекта, где entity лишь визуальное отображение их.
(Offline)
 
Ответить с цитированием
Старый 25.10.2011, 16:44   #14
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: xfreeEntity

ну да, так оно и есть
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com