forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   xfreeEntity (http://forum.boolean.name/showthread.php?t=15707)

Vadimich 25.10.2011 09:49

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"" не помогают. объект переходит к любому другому объекту на свой выбор.
помогите пожалуйста

.Squid 25.10.2011 12:15

Ответ: xfreeEntity
 
Цитата:

Сообщение от Vadimich (Сообщение 206852)
Всем привет. возникла следующая проблема

cube = xCreateCube()
xPositionEntity cube,-5,0,0
xFreeEntity cube
xPositionEntity cube,-10,0,0
a# = xEntityX(cube)

этот код не выдает ошибку и a получает координату -10 в итоге. более того, если удаленный объект подвергается каким-то модификациям, информация обновляется.. как будто он просто стал невидимым.

Это нормально, если бы деаллокатор физически заполнял очищенную область нулями или каким-то паттерном (что происходит в Debug-режиме), то все работало бы очень медленно. Просто не надо обращаться к удаленным объектам.
Цитата:

Сообщение от Vadimich (Сообщение 206852)
обнуление Cubу после xfreeentity тоже не дает нужного результата. объекты, обращающиеся к cube переходят к любому другому объекту и начинают брать информацию с него
это становится проблемой, когда этот entity передался какому-то объекту аргументом и уловки вроде "if entity=0" или "if xentityClass<>"Null"" не помогают. объект переходит к любому другому объекту на свой выбор.
помогите пожалуйста

Вот этого не понял. Пример, на котором можно воспроизвести, пожалуйста.

Vadimich 25.10.2011 12:23

Ответ: xfreeEntity
 
проблема то как раз в том, чтобы сообщить функции, что объект удален. на стандартном блитце хватало (if entity>0 then (делаем что-то) )

HolyDel 25.10.2011 12:33

Ответ: 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 битный инт. такчто должно работать.

Vadimich 25.10.2011 12:56

Ответ: 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


.Squid 25.10.2011 14:54

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

Vadimich 25.10.2011 15:02

Ответ: xfreeEntity
 
через пару сек он снова начинает движение "верхом" уже на другом маленьком

.Squid 25.10.2011 15:46

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

Vadimich 25.10.2011 15:59

Ответ: xfreeEntity
 
2.Squid: ты имеешь ввиду обнулить его в функции target_update(), когда ентити удаляется? При этом экземпляр должен не только знать, что на нём "сидит" Reader, но и иметь ссылку на этот объект (конечно я могу и ошибаться). а суть в том, чтобы Reader мог снимать координаты с любого entity(yt подготовленного для работы с Reader), к которому его применят, до того момента, пока этот объект существует

.Squid 25.10.2011 16:15

Ответ: 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


moka 25.10.2011 16:15

Ответ: xfreeEntity
 
Цитата:

cube = xCreateCube()
xPositionEntity cube,-5,0,0
xFreeEntity cube
cube = 0
xPositionEntity cube,-10,0,0
a# = xEntityX(cube)
Как сказал HolyDel, это твоя задача обнулять свои же переменные..

Vadimich 25.10.2011 16:27

Ответ: xfreeEntity
 
т.е. с "не подготовленными" для работы с reader'om объектами этого сделать не получится?
спасибо

moka 25.10.2011 16:36

Ответ: xfreeEntity
 
Ну вообще в нормальных проектах, сам entity, это лишь мелкая визуальная составляющая, и логика крутится относительно самих данных объекта, где entity лишь визуальное отображение их.

Vadimich 25.10.2011 16:44

Ответ: xfreeEntity
 
ну да, так оно и есть


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot