|
Xors3D Графический движок с поддержкой DirectX9 |
22.06.2012, 23:37
|
#1
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Баг или мудаг?
Помогите, ребят, разобраться в топе вопроса)
Смысл такой, есть 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() иногда сразу иногда нет
И проблема больше из-за того что я конкретно ошибку не вижу. Выдает такую фигню. Помогите плиз, может debugger какойто нормальный есть?
__________________
|
(Offline)
|
|
22.06.2012, 23:46
|
#2
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Баг или мудак?
О, та ошибка походу вылетала из-за функции 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 - ошибка...
__________________
|
(Offline)
|
|
23.06.2012, 20:04
|
#3
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Баг или мудак?
Ураааааа!!! Я не мудак!!! ))
Сам нашел баг в ксорсе, с синусами косинусами
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
__________________
|
(Offline)
|
|
24.06.2012, 03:22
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Баг или мудаг?
Т.к. ты не описал "баг ксорса", после быстрого просмотра последнего исходника, вижу что вся "байда" у тебя с мат. вычислениями, следственно это не баг ксорса, а не знание математики или видов углов в которых идёт представление наклона объектов.
Да и я более чем уверен, люди которые как-то и могут тебе помочь, вряд ли будут запускать твой код..
|
(Offline)
|
|
24.06.2012, 21:33
|
#5
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Баг или мудаг?
Не принимай за грубость, но ты умничаешь не разобравшись и твое сообщение бесполезно - услышал звон и не знаешь где он. И причем тут знания математики и видов углов (хотя у меня нет с этим проблем). Работа косинуса и синуса при любых значениях не должна быть 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. И кому-нибудь это может помочь поэтому создал тему.
А не для того чтоб мне говорили что я не знаю как синусами пользоваться.
__________________
|
(Offline)
|
|
24.06.2012, 22:47
|
#6
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Баг или мудаг?
При валидных данных Cos и Sin всегда возвращает число.
Если данные не валидные (например это не число), то следственно и результат будет не валидный.
Также числа очень близкие к 0 могут иногда выдавать ошибочные данные (проблема с точностью флоатов).
Учитывая что Ксорс затачивали дружелюбно к Блицу, то данные из функций ксорса должны быть аналогичны блицу, лишь с отличием что как уже упомянул, данное из функции ксорса может быть не числом.
Даже если и Cos возвращает что-то, и это не число - то это не баг Ксорса, это относиться к твоему незнанию что Cos может возвращаеть не числа а NaN.
Груби, это лишь выказывает твою эмоциональность по поводу собственной тупости из-за которой ты убил пять часов заместо простого теста валидности данных в функциях Cos / Sin.
|
(Offline)
|
|
24.06.2012, 23:24
|
#7
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Баг или мудаг?
Не, вот ты нормальный вообще человек, код хоть посматри!
Объясняю специально для тебя
Cos(xEntityYaw(camera)) - получается число (разжёвываю, косинус угла поворота камеры возвращает нормальное число)
а
xEntityZ(camera)+Cos(xEntityYaw(camera)) - получается NaN (разжёваваю, а когда к такому же косинусу прибавляешь позицию объекта получаем Null!)
Но с Багом можно справиться так:
a#=xEntityYaw(camera,1)
xEntityZ(camera)+Cos(a)
ПС. Вот кто из нас показывает тупость?! Тебе просто лень нормально посматреть, лиш бы побурдеть.
__________________
|
(Offline)
|
|
25.06.2012, 00:30
|
#8
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Баг или мудаг?
Это не ксорс.
Фикс твоего бага:
Cos(xEntityYaw(camera)) + xEntityZ(camera)
Поменяй местами, работает ок.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.06.2012, 03:39
|
#9
|
AnyKey`щик
Регистрация: 24.06.2012
Сообщений: 16
Написано 5 полезных сообщений (для 6 пользователей)
|
Ответ: Баг или мудаг?
Проблема и в хорсе и в блице. Синусы и косинусы тут вообще не причем.
В хорсе какая-то проблема в вычислении, т.к. функции EntityX, EntityPitch и подобные возвращают не 0. По стандарту IEEE-754, нуль в int представлении равен нулю во float представлении, а эти функции возвращают в int представлении одна 800, другая 1245080 и т.д. ( притом что ентити в нулевой позиции, и должно соответственно возвращать 0 )
В блице же такие числа в float представлении вызывают NaN, причем, как выше показано, не всегда. Видимо компилятор что-то мутит.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Hartmann1 за это полезное сообщение:
|
|
26.06.2012, 00:10
|
#10
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Баг или мудаг?
Сообщение от MoKa
При валидных данных Cos и Sin всегда возвращает число.
Если данные не валидные (например это не число), то следственно и результат будет не валидный.
Также числа очень близкие к 0 могут иногда выдавать ошибочные данные (проблема с точностью флоатов).
Учитывая что Ксорс затачивали дружелюбно к Блицу, то данные из функций ксорса должны быть аналогичны блицу, лишь с отличием что как уже упомянул, данное из функции ксорса может быть не числом.
Даже если и Cos возвращает что-то, и это не число - то это не баг Ксорса, это относиться к твоему незнанию что Cos может возвращаеть не числа а NaN.
Груби, это лишь выказывает твою эмоциональность по поводу собственной тупости из-за которой ты убил пять часов заместо простого теста валидности данных в функциях Cos / Sin.
|
сказываются пробелы в образовании*? cos и sin определены на всей числовой прямой, это не тангенс - нет тут места NaN или Inf!
*да - трололо. Но с каким упорством и гонором набросился на участника дискуссии!
Кстати тоже наблюдал неадекватное поведение (про одно уже писал, второе - некогда вычленить в минимальный код, но сильно смахивает на описываемое Hartmann1). Вот вам хороший пример (лишённые оков ревнители научных истин) как вы поклоняетесь авторитету, отвергая истину ( Фрэнсис Бэкон негодует!)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
26.06.2012, 00:34
|
#11
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Баг или мудаг?
Всё дело в точности float и преобразовании типов. Например добавление сверх малого float числа к сверх большому float числу может вызвать неадекватную реакцию в некоторых реализациях. Происходит это по тому что плавающая точка, меняет своё положение делая число или точнее (при малых величинах) или менее точным вплоть до целого при хранении большого близкого к придельному числа.
Естественно для числа 7654321,0 прибавление числа 0,1234567 или не даст ожидаемого эффекта, мы получим что то типа 7654321,1 или выдаст Inf/NaN.
Хотя последнее возможно скорее при умножении/делении.
ИМХО
__________________
|
(Offline)
|
|
26.06.2012, 01:21
|
#12
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Баг или мудаг?
Ну не скажите, у блица с математикой так себе. Он даже тангенс 90 считает. При том не NaN\Infinity, а вполне себе годное число.
|
(Offline)
|
|
26.06.2012, 13:19
|
#13
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Баг или мудаг?
Он даже тангенс 90 считает
|
ваще. и даже корень от отрицательных чисел не находит
|
(Offline)
|
|
26.06.2012, 16:08
|
#14
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Баг или мудаг?
Если не находит, значит всё верно. Или есть корень из отрицательного числа?
|
(Offline)
|
|
26.06.2012, 20:48
|
#15
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Баг или мудаг?
Сообщение от Nikich
Если не находит, значит всё верно. Или есть корень из отрицательного числа?
|
четный корень из отрицательного числа будит мниное число.
а нечетный и так норм извлекается)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:17.
|