Показать сообщение отдельно
Старый 23.10.2010, 06:39   #1058
KOPCAP
AnyKey`щик
 
Регистрация: 26.05.2009
Сообщений: 15
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Вопрос-Ответ (для новичков)

Народ, у меня проблема с рандомом, короче вот код:
в офтопе, по тому что большой..
Graphics3D 800,600,16, 1
SetBuffer BackBuffer()

MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
camera=CreateCamera()
CameraViewport camera,0,0,800,600
MoveEntity camera, 0, 10,-10
TurnEntity camera, 50,0,0
light=CreateLight()
RotateEntity light, 23,127,98
plane=CreatePlane()
cur=LoadImage("cursor.png")

Global unid#=1

Type unit
	Field tip$, team, dmg, range, mesh, state, oldx#, oldz#, speed#, rel#, rx#, rz#, sel, id
End Type
; type of insect, team of ins., damage of ins., model of ins., state(0=stay, 1=run, 2=attack, 3=death),
; last position of ins(x,z), reload speed, real position of ins(x,z), select of unit 0/1
Type mur
  Field team, tip, mesh, dmg, rel#, range, sel, id
End Type

Function make_mur(x#, z#, ty, te, id)
  m.mur = New mur
  m\team=te
  m\id=id
  If (ty=1) Then
    m\mesh=LoadMesh("mur_01.3ds")
    PositionEntity m\mesh, x,0,z
    m\dmg=10
    m\range=7
    m\rel=0.5
  EndIf
  If (te=1) Then
    EntityColor m\mesh, 255,0,0
  EndIf
End Function

Function make_unit(x#, z#, te, ty, tx#, tz#, id)
  unid=unid+1
  un.unit = New unit
  un\tip=ty
  un\id=id
  un\team=te
  un\mesh=CreateCube()
  PositionEntity un\mesh, x, 0, z
  un\oldx=x
  un\oldz=z
  un\rx=tx
  un\rz=tz
  If(ty=1) Then
    ScaleEntity un\mesh, 1,0.5,0.25
    un\dmg=2
    un\range=3
    un\speed=0.2
    un\rel=0.5
  EndIf
  If(te=1) Then
    EntityColor un\mesh, 255,0,0
  EndIf
  If x<>tx Or z<>tz Then
  un\state=1
  Else
  un\state=0
  EndIf
End Function

Function move_unit()
  For un.unit = Each unit
    pivot=CreatePivot()
    MoveEntity pivot, un\rx,0,un\rz
    If (EntityDistance(un\mesh, pivot)>1) Then
       If (un\rx-un\oldx)<0 Then
         ang=180
       Else
         ang=0
       EndIf
       sn#=un\rz-un\oldz
       cn#=un\rx-un\oldx
       RotateEntity un\mesh, EntityPitch(un\mesh),ATan(sn/cn)+ang,EntityRoll(un\mesh)
       MoveEntity un\mesh, un\speed, 0,0 
       un\oldx=EntityX(un\mesh)
       un\oldz=EntityZ(un\mesh)
    Else 
      un\oldx=un\rx
      un\oldz=un\rz
      un\state=0
    EndIf
    FreeEntity pivot
  Next
End Function

Function produse_unit(id, ty)
  For m.mur = Each mur
    If (m\id=id) Then
      make_unit(EntityX(m\mesh),EntityZ(m\mesh), m\team, ty, EntityX(m\mesh)-5, EntityZ(m\mesh), unid)
    EndIf
  Next
End Function

While Not KeyHit(1)

SeedRnd MilliSecs()

If (MouseX()<5) Then
  MoveEntity camera, -0.2,0,0
  MoveMouse 4, MouseY() 
EndIf

If (MouseX()>GraphicsWidth()-5) Then
  MoveEntity camera, 0.2,0,0
  MoveMouse GraphicsWidth()-4, MouseY() 
EndIf

If (MouseY()<5) Then
  PositionEntity camera, EntityX(camera),EntityY(camera),EntityZ(camera)+0.2
  MoveMouse MouseX(), 4
EndIf

If (MouseY()>GraphicsHeight()-5) Then
  PositionEntity camera, EntityX(camera),EntityY(camera),EntityZ(camera)-0.2
  MoveMouse MouseX(), GraphicsHeight()-4
EndIf

If KeyDown(17) Then
  PositionEntity camera, EntityX(camera),EntityY(camera),EntityZ(camera)+0.1
EndIf

If KeyDown(30) Then
  MoveEntity camera, -0.1,0,0
EndIf

If KeyDown(31) Then
  PositionEntity camera, EntityX(camera),EntityY(camera),EntityZ(camera)-0.1
EndIf

If KeyDown(32) Then
  MoveEntity camera, 0.1,0,0
EndIf

If KeyHit(18) Then
  make_mur(0,0,1,1,1)
EndIf

If KeyHit(16) Then
  produse_unit(1,1)
EndIf

move_unit()

For un.unit = Each unit
 If(Rnd(1,1000)<=2)  And (un\state=0) Then
  If un\state=0 Then
   un\rx=un\oldx+Rnd(-5,5)
   un\rz=un\oldx+Rnd(-5,5)
   If (un\rx+un\rz)*(un\rx*un\rz)<>0 Then
    un\state=1
   EndIf
  EndIf
 EndIf
Next

For un.unit = Each unit
  For un2.unit= Each unit
    If EntityDistance(un\mesh, un2\mesh)<1 And un\id<>un2\id And un\state=0 Then
      un\rx=un\oldx+Rnd(-2,2)
      un\rz=un\oldx+Rnd(-2,2)
      un\state=1
    EndIf
  Next
  For m.mur = Each mur
    If EntityDistance(un\mesh, m\mesh)<2 And un\state=0 Then
      un\rx=un\oldx+Rnd(-5,5)
      un\rz=un\oldx+Rnd(-5,5)
      un\state=1
    EndIf
  Next
Next

Cls
UpdateWorld
RenderWorld
DrawImage cur,MouseX(),MouseY()
Flip
Wend
End

В чем вообще суть, пока что есть немного, нужно нажать "У" , создастся новый типа муравейник, нажать "Й" из него выйдет юнит. Если юниты слижком близко друг к другу то передвигаться в в рандомную точку области 4х4 с центром где находится юнит, короче юнит в центре этой области. суть в чем, когда я закликиваю "й" то юниты толкаются, стараются распредилиться равномрно, только вот распределяются они почему-то по линии ну примерно по линии под 45 градусов, линия проходит через 0,0 на координатной плоскости, подскажите в че тут казус? или альтернативный спосо выбора рандомного направления...
Заранее извиняюсь за быдлокод))) т.к. в Блитце сравнительно недавно...
(Offline)
 
Ответить с цитированием