forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Баг или мудаг? (http://forum.boolean.name/showthread.php?t=16951)

burovalex 22.06.2012 23:37

Баг или мудаг?
 
Вложений: 1
Помогите, ребят, разобраться в топе вопроса)

Смысл такой, есть 3 фунции - HeroAction()-проверяет, 2 фунции вызываются из под неё.

Код:

Global heroLeftHandFree%,heroRightHandFree%
Global heroLeftHandEntity,heroRightHandEntity
;===================================================
Function HeroAction()
;действие игрока
If heroActionEnable=True Then
        ObjectPicked=xCameraPick(camera,graphicsWC,graphicsHC)
        If ObjectPicked<>0 Then
                ObjectPickedName=xEntityName(ObjectPicked)
                If xEntityDistance(ObjectPicked,camera)>heroActionDistance Then ObjectPicked=0 : objectPickedName=""
        Else
                ObjectPicked=0 : objectPickedName=""
        EndIf
        ;если пикнул объект
        If ObjectPicked<>0 Then
                If mouseHited1 Or mouseHited2 Then               
                        ;если трава
                        If mousehited1 Then mb=1 Else mb=2
                        If objectPickedName="grass" Then TakeGrass(mb)
                EndIf
        Else
        ;если не пикнул объект
                If mouseHited1 Or mouseHited2 Then               
                        If mousehited1 Then mb=1 Else mb=2
                        DropItem(mb)
                EndIf
        EndIf
EndIf
End Function
;===================================================
Function TakeGrass(mb)
For grass.grass=Each grass
        If grass\entity=objectPicked Then
                If mb=1 Then
                        If heroLeftHandFree=False Then
                                messageCenterText="Левая рука занята" : messageCenterAlpha=700
                                Else
                                grid(xEntityX(grass\entity),xEntityZ(grass\entity),1)=0
                                heroLeftHandEntity=xCopyEntity(grass\entity) : xHideEntity(heroLeftHandEntity)
                                heroLeftHandFree=False
                                leftHandItemTex=grassItemTex
                                xFreeEntity grass\entity :        Delete grass.grass
                        EndIf
                EndIf       
        EndIf
Next
End Function
;===================================================
Function DropItem(mb)
If mb=1 And heroLeftHandEntity<>0 Then
        xPositionEntity heroLeftHandEntity,xEntityX(camera,1)+Sin(xEntityYaw(camera)),xEntityY(camera,1),xEntityZ(camera,1)+Cos(xEntityYaw(camera))
        xShowEntity heroLeftHandEntity
        ResourceCreate(heroLeftHandEntity,resourceClassGrass)
        heroLeftHandFree=True
        leftHandItemTex=0
xFreeEntity heroLeftHandEntity
EndIf
End Function
;===================================================

Не пойму почему этот вариант не работает. Ошбка вознивает в фукции ItemDrop() иногда сразу иногда нет :4to:

И проблема больше из-за того что я конкретно ошибку не вижу. Выдает такую фигню. Помогите плиз, может debugger какойто нормальный есть?

burovalex 22.06.2012 23:46

Ответ: Баг или мудак?
 
О, та ошибка походу вылетала из-за функции ResourceCreate(..) там создается боди для физикса.
Но осталась ошибка MAV на :
Код:

Function DropItem(mb)
If mb=1 And heroLeftHandEntity<>0 Then
        ;Stop
        xPositionEntity heroLeftHandEntity,xEntityX(camera,1)+Sin(xEntityYaw(camera)),xEntityY(camera,1),xEntityZ(camera,1)+Cos(xEntityYaw(camera))
        xShowEntity heroLeftHandEntity ;Тут выпрыгивает MAV
        ;ResourceCreate(heroLeftHandEntity,resourceClassGrass)
        heroLeftHandFree=True
        leftHandItemTex=0
        xFreeEntity heroLeftHandEntity
EndIf
End Function

В дебаге блитца нашел heroLeftHandEntity - и в нем цифры, т.е. ентити. И главное xPositionEntity почему то проходит, а вот xShowEntity - ошибка...

burovalex 23.06.2012 20:04

Ответ: Баг или мудак?
 
Вложений: 1
Ураааааа!!! Я не мудак!!! ))
Сам нашел баг в ксорсе, с синусами косинусами
Код:

Include "Xors3d.bb"
xGraphics3D 640,480,32,0,1

Global camera=xCreateCamera()

cb=xCreateCube()
xMoveEntity cb,0,1,30

While Not(xKeyHit(1))
msx=xMouseXSpeed()
xMoveMouse 200,200
xRenderWorld(1,0)

xTurnEntity camera,0,-msx*0.11,0
xMoveEntity camera,0,0,(xKeyDown(200)-xKeyDown(208))*0.03
xText 10,20,"xEntityYaw(camera) = "+xEntityYaw(camera)
xText 10,40,"xEntityZ(camera) = "+xEntityZ(camera)
xText 10,60,"Cos(xEntityYaw(camera)) = "+Cos(xEntityYaw(camera))
;NaN
xText 10,100,"xEntityZ(camera) + Cos(xEntityYaw(camera)) = "
xColor 170,120,100 :                        xText 450,100,(xEntityZ(camera)+Cos(xEntityYaw(camera)))                                : xColor 255,255,255
;is working properly  О_о
a#=xEntityYaw(camera,1)
xText 10,120,"a# = xEntityYaw(camera)  :  xEntityZ(camera) + Cos(a) = "
xColor 120,190,110 :                        xText 450,120,(xEntityZ(camera)+Cos(a))                                                : xColor 255,255,255
xFlip
Wend
End


moka 24.06.2012 03:22

Ответ: Баг или мудаг?
 
Т.к. ты не описал "баг ксорса", после быстрого просмотра последнего исходника, вижу что вся "байда" у тебя с мат. вычислениями, следственно это не баг ксорса, а не знание математики или видов углов в которых идёт представление наклона объектов.

Да и я более чем уверен, люди которые как-то и могут тебе помочь, вряд ли будут запускать твой код..

burovalex 24.06.2012 21:33

Ответ: Баг или мудаг?
 
Вложений: 1
Не принимай за грубость, но ты умничаешь не разобравшись и твое сообщение бесполезно - услышал звон и не знаешь где он. И причем тут знания математики и видов углов (хотя у меня нет с этим проблем). Работа косинуса и синуса при любых значениях не должна быть Nan (т.е. Null)

Код:

Graphics3D 640,480,32,2
Global camera=CreateCamera()
cb=CreateCube()
MoveEntity cb,0,1,30

While Not(KeyHit(1))
msx=MouseXSpeed()
MoveMouse 200,200
RenderWorld

TurnEntity camera,0,-msx*0.11,0
MoveEntity camera,0,0,(KeyDown(200)-KeyDown(208))*0.03
Text 10,20,"EntityYaw(camera) = "+EntityYaw(camera)
Text 10,40,"EntityZ(camera) = "+EntityZ(camera)
Text 10,60,"Cos(xEntityYaw(camera)) = "+Cos(EntityYaw(camera))
;b3d работает и так
Text 10,100,"EntityZ(camera) + Cos(EntityYaw(camera)) = "
Color 170,120,100 :                        Text 450,100,(EntityZ(camera)+Cos(EntityYaw(camera)))                                : Color 255,255,255
;и так
a#=EntityYaw(camera,1)
Text 10,120,"a# = EntityYaw(camera)  :  EntityZ(camera) + Cos(a) = "
Color 120,190,110 :                        Text 450,120,(EntityZ(camera)+Cos(a))                                                : Color 255,255,255
Flip
Wend
End

Без обид, просто очень бесит когда пытаешь сделать чтото полезное, летят всякие бесполезные сообщения.
Я просто написав 2к строк наткнулся на этот баг, потратил часов 5. И кому-нибудь это может помочь поэтому создал тему.
А не для того чтоб мне говорили что я не знаю как синусами пользоваться.

moka 24.06.2012 22:47

Ответ: Баг или мудаг?
 
При валидных данных Cos и Sin всегда возвращает число.
Если данные не валидные (например это не число), то следственно и результат будет не валидный.
Также числа очень близкие к 0 могут иногда выдавать ошибочные данные (проблема с точностью флоатов).

Учитывая что Ксорс затачивали дружелюбно к Блицу, то данные из функций ксорса должны быть аналогичны блицу, лишь с отличием что как уже упомянул, данное из функции ксорса может быть не числом.

Даже если и Cos возвращает что-то, и это не число - то это не баг Ксорса, это относиться к твоему незнанию что Cos может возвращаеть не числа а NaN.

Груби, это лишь выказывает твою эмоциональность по поводу собственной тупости из-за которой ты убил пять часов заместо простого теста валидности данных в функциях Cos / Sin.

burovalex 24.06.2012 23:24

Ответ: Баг или мудаг?
 
Не, вот ты нормальный вообще человек, код хоть посматри!
Объясняю специально для тебя
Cos(xEntityYaw(camera)) - получается число (разжёвываю, косинус угла поворота камеры возвращает нормальное число)
а
xEntityZ(camera)+Cos(xEntityYaw(camera)) - получается NaN (разжёваваю, а когда к такому же косинусу прибавляешь позицию объекта получаем Null!)

Но с Багом можно справиться так:
a#=xEntityYaw(camera,1)
xEntityZ(camera)+Cos(a)

ПС. Вот кто из нас показывает тупость?! Тебе просто лень нормально посматреть, лиш бы побурдеть.

moka 25.06.2012 00:30

Ответ: Баг или мудаг?
 
Это не ксорс.

Фикс твоего бага:
Код:

Cos(xEntityYaw(camera)) + xEntityZ(camera)
Поменяй местами, работает ок.

Hartmann1 25.06.2012 03:39

Ответ: Баг или мудаг?
 
Проблема и в хорсе и в блице. Синусы и косинусы тут вообще не причем.
В хорсе какая-то проблема в вычислении, т.к. функции EntityX, EntityPitch и подобные возвращают не 0. По стандарту IEEE-754, нуль в int представлении равен нулю во float представлении, а эти функции возвращают в int представлении одна 800, другая 1245080 и т.д. ( притом что ентити в нулевой позиции, и должно соответственно возвращать 0 )
В блице же такие числа в float представлении вызывают NaN, причем, как выше показано, не всегда. Видимо компилятор что-то мутит.

impersonalis 26.06.2012 00:10

Ответ: Баг или мудаг?
 
Цитата:

Сообщение от MoKa (Сообщение 231300)
При валидных данных Cos и Sin всегда возвращает число.
Если данные не валидные (например это не число), то следственно и результат будет не валидный.
Также числа очень близкие к 0 могут иногда выдавать ошибочные данные (проблема с точностью флоатов).

Учитывая что Ксорс затачивали дружелюбно к Блицу, то данные из функций ксорса должны быть аналогичны блицу, лишь с отличием что как уже упомянул, данное из функции ксорса может быть не числом.

Даже если и Cos возвращает что-то, и это не число - то это не баг Ксорса, это относиться к твоему незнанию что Cos может возвращаеть не числа а NaN.

Груби, это лишь выказывает твою эмоциональность по поводу собственной тупости из-за которой ты убил пять часов заместо простого теста валидности данных в функциях Cos / Sin.

сказываются пробелы в образовании*? cos и sin определены на всей числовой прямой, это не тангенс - нет тут места NaN или Inf!
*да - трололо. Но с каким упорством и гонором набросился на участника дискуссии!

Кстати тоже наблюдал неадекватное поведение (про одно уже писал, второе - некогда вычленить в минимальный код, но сильно смахивает на описываемое Hartmann1). Вот вам хороший пример (лишённые оков ревнители научных истин) как вы поклоняетесь авторитету, отвергая истину (Фрэнсис Бэкон негодует!)

SBJoker 26.06.2012 00:34

Ответ: Баг или мудаг?
 
Всё дело в точности float и преобразовании типов. Например добавление сверх малого float числа к сверх большому float числу может вызвать неадекватную реакцию в некоторых реализациях. Происходит это по тому что плавающая точка, меняет своё положение делая число или точнее (при малых величинах) или менее точным вплоть до целого при хранении большого близкого к придельному числа.

Естественно для числа 7654321,0 прибавление числа 0,1234567 или не даст ожидаемого эффекта, мы получим что то типа 7654321,1 или выдаст Inf/NaN.
Хотя последнее возможно скорее при умножении/делении.

ИМХО

Nikich 26.06.2012 01:21

Ответ: Баг или мудаг?
 
Ну не скажите, у блица с математикой так себе. Он даже тангенс 90 считает. При том не NaN\Infinity, а вполне себе годное число.

HolyDel 26.06.2012 13:19

Ответ: Баг или мудаг?
 
Цитата:

Он даже тангенс 90 считает
ваще. и даже корень от отрицательных чисел не находит :(

Nikich 26.06.2012 16:08

Ответ: Баг или мудаг?
 
Если не находит, значит всё верно. Или есть корень из отрицательного числа?

radiobutton 26.06.2012 20:48

Ответ: Баг или мудаг?
 
Цитата:

Сообщение от Nikich (Сообщение 231486)
Если не находит, значит всё верно. Или есть корень из отрицательного числа?

четный корень из отрицательного числа будит мниное число.
а нечетный и так норм извлекается)

HolyDel 27.06.2012 01:42

Ответ: Баг или мудаг?
 
пардон. прочитал как "Он даже тангенс 90 НЕ считает"

ANIK123 28.06.2012 19:47

Ответ: Баг или мудаг?
 
"Баг или мудаг?" =)
такая вот штука обнаружилась: когда после команды "FIX->StartDraw()" использую "xLinePick" то FastImage тупо перестает рисовать все что находится после вышеупомянутого "xLinePick"

и еще: "xLinePick" возвращает совсем неверные результаты, это 100%, ибо пикабельных энтити в сцене !только! !2!(200%!), а в результатах указываются вообще хз что (хэндл неведомого энтити, уж точно не одного из этих двух пикабельных)
единственное, что эта функция правильно определяет так это в результате "0" если ниодного энтити по дороге нету
О_О


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

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