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 на координатной плоскости, подскажите в че тут казус? или альтернативный спосо выбора рандомного направления...
Заранее извиняюсь за быдлокод))) т.к. в Блитце сравнительно недавно...
|