Показать сообщение отдельно
Старый 15.11.2013, 19:47   #1
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Непостоянная ошибка

Я не знаю, куда конкретно закралась ошибка, поэтому пишу оба кода. Blitz-евский код с подключённой библиотекой работает непостоянно: иногда запускается, иногда выдаёт MAV. Знает кто, что это за фигня?

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

cam = CreateCamera()
PositionEntity cam,0,0,-10

plane = CreatePlane()
EntityColor plane,0,100,100
PositionEntity plane,0,-1,0

sphere1 = CreateSphere()
EntityColor sphere1,150,0,0

sphere2 = CreateSphere()
EntityColor sphere2,0,0,150

sphere3 = CreateSphere()
EntityColor sphere3,0,150,0

r1 = dpCreateArea(1,1)
r2 = dpCreateArea(1,1)
r3 = dpCreateArea(1,1)

While Not KeyHit(1)

dpAttachEntity(sphere1,r1)
dpAttachEntity(sphere2,r2)
dpAttachEntity(sphere3,r3)

dpPropelArea(r1,1,0,1)
dpPropelArea(r2,-1,0,1)
dpPropelArea(r3,0,0,1)

dpUpdateAreas()

UpdateWorld()
RenderWorld()

Flip

Wend

End
Structure Object
  num.i
  type.i
  mass.f
  xPos.f
  yPos.f
  zPos.f
  xSc.f
  ySc.f
  zSc.f
  xRot.f
  yRot.f
  zRot.f
  xSp.f
  ySp.f
  zSp.f
EndStructure
 
Global NewMap Objects.Object()

Global num.i = 0

;==========Procedures==========;

ProcedureDLL.f dpCreateArea(type.i,mass.f)
  
  AddMapElement(Objects(),Str(num))
  
  Objects()\num = num
  Objects()\type = type
  Objects()\mass = mass
  Objects()\xPos = 0
  Objects()\yPos = 0
  Objects()\zPos = 0
  Objects()\xSc = 1
  Objects()\ySc = 1
  Objects()\zSc = 1
  Objects()\xRot = 0
  Objects()\yRot = 0
  Objects()\zRot = 0
  Objects()\xSp = 0
  Objects()\ySp = 0
  Objects()\zSp = 0
  
  Protected *area = AllocateMemory(56)
  
  PokeI(*area,Objects()\num)
  PokeI(*area + 4,Objects()\type)
  PokeF(*area + 8,Objects()\mass)
  PokeF(*area + 12,Objects()\xPos)
  PokeF(*area + 16,Objects()\yPos)
  PokeF(*area + 20,Objects()\zPos)
  PokeF(*area + 24,Objects()\xSc)
  PokeF(*area + 28,Objects()\ySc)
  PokeF(*area + 32,Objects()\zSc)
  PokeF(*area + 36,Objects()\xRot)
  PokeF(*area + 40,Objects()\yRot)
  PokeF(*area + 44,Objects()\zRot)
  PokeF(*area + 48,Objects()\xSp)
  PokeF(*area + 52,Objects()\ySp)
  PokeF(*area + 56,Objects()\zSp)
    
  num = num + 1
    
  ProcedureReturn *area
EndProcedure

ProcedureDLL.f dpAttachEntity(*entity,*area)
  FindMapElement(Objects(),Str(PeekI(*area)))
  
  PokeF(*area + 12,Objects()\xPos)
  PokeF(*area + 16,Objects()\yPos)
  PokeF(*area + 20,Objects()\zPos)
  
  PokeI(*entity + 44,-1)
  
  PokeF(*entity + 64,PeekF(*area + 12))
  PokeF(*entity + 68,PeekF(*area + 16))
  PokeF(*entity + 72,PeekF(*area + 20))
EndProcedure

ProcedureDLL.f dpUpdateAreas()
  ForEach Objects()
    Objects()\xPos = Objects()\xPos + Objects()\xSp
    Objects()\yPos = Objects()\yPos + Objects()\ySp
    Objects()\zPos = Objects()\zPos + Objects()\zSp
  Next
EndProcedure

ProcedureDLL.f dpMoveArea(*area,x.f,y.f,z.f)
  FindMapElement(Objects(),Str(PeekI(*area)))
  
  Objects()\xPos = Objects()\xPos + x
  Objects()\yPos = Objects()\yPos + y
  Objects()\zPos = Objects()\zPos + z
EndProcedure

ProcedureDLL.f dpPropelArea(*area,fx.f,fy.f,fz.f)
  FindMapElement(Objects(),Str(PeekI(*area)))
  Protected m.f = Objects()\mass * 1000
  
  Objects()\xSp = Objects()\xSp + fx / m
  Objects()\ySp = Objects()\ySp + fy / m
  Objects()\zSp = Objects()\zSp + fz / m
EndProcedure
__________________
(Offline)
 
Ответить с цитированием