Kyseinen systeemi on _lähes_ mahdotonta tehdä niin, että jokainen objekti on oma, erillinen systeeminsä. Tässä tapauksessa sinun täytyy käyttää esimerkiksi tyyppilohkoja hallitaksesi autoja.matti3 wrote:Tämä kävisi varmaan nopeammin kloonaamalla, mutta päätin nyt ensin koittaa niin, että autot ovat kaikki oma objectinsa. (20 tällä hetkellä)
...
Eli: teet yhden koodinpätkän joka liikuttaa autoja ja pitää ne ruudun sisällä tiettyjen sääntöjen mukaan, ja sitten yksinkertaisesti kloonaat autoja ja käsket jokaista (autoa) käyttämään tätä samaa koodinpätkää.
Tein tässä osaksi omaksi ilokseni ja osaksi esimerkkinä sinulle tällaisen pienen koodin, jossa liikkuu tietty määrä autoja. Jos auto tulee kohdallesi, se pysähtyy. Kun painat enteriä, ukko menee autoon ja sitä voi ajaa. Uudelleen enteriä ja ukko poistuu autosta (ja sinne taianomaisesti tulee uusi kuski, koska se jatkaa itsestään matkaansa).
En käyttänyt juuri ollenkaan vakioita, koska en vain jaksanut. En myöskään kommentoinut. Jos et mitenkään saa yhtään selvää koodista, suosittelen opettelemaan tyypit ihan alusta alkaen, ellet et jo ole opetellut. Samoin taulukot.
Tässä oli hiukan tarinaa ja turhaa turinaa. Toivottavasti opit jotain koodista.
Code: Select all
SCREEN 1024, 768
FrameLimit 40
Const WP_AMOUNT = 30
Dim dWaypoints( WP_AMOUNT - 1, 1 )
Type cars
Field obj
Field user
Field targetTimer
Field targetX
Field targetY
Field speed As Float
End Type
objCar = LoadObject( "media\car2.bmp", 72 )
ShowObject objCar, OFF
For i = 1 To WP_AMOUNT
dWaypoints( i, 0 ) = Rand( -ScreenWidth() / 2, ScreenWidth() / 2 ) //x
dWaypoints( i, 1 ) = Rand( -ScreenHeight() / 2, ScreenHeight() / 2 ) //y
Next i
For i = 1 To 10
nc.cars = New( cars )
nc\obj = CloneObject( objCar )
target = Rand( 0, WP_AMOUNT - 1 )
nc\targetX = dWaypoints( target, 0 )
nc\targetY = dWaypoints( target, 1 )
PositionObject nc\obj, Rand( -ScreenWidth() / 2, ScreenWidth() / 2 ), Rand( -ScreenHeight() / 2, ScreenHeight() / 2 )
Next i
ClsColor cbWhite
Color cbBlack
Repeat
If bInCar = False Then
plX = plX + ( RightKey() - LeftKey() ) * 5
plY = plY + ( UpKey() - DownKey() ) * 5
DrawToWorld ON, ON, ON
Box plX - 2, plY - 2, 5, 5
DrawToWorld OFF
EndIf
For ic.cars = Each cars
_angle# = ObjectAngle( ic\obj )
If ic\user = 0 Then
If Distance( ObjectX( ic\obj ), ObjectY( ic\obj ), plX, plY ) < 30 And bInCar = False Then
If ic\speed > 0 Then
ic\speed - 0.5
EndIf
If KeyHit( CbKeyReturn ) And bInCar = False Then
ic\user = 1
bInCar = True
ClearKeys()
EndIf
Else
If ic\speed < 5 Then
ic\speed + 0.5
EndIf
EndIf
ic\targetTimer - 1
If Distance( ObjectX( ic\obj ), ObjectY( ic\obj ), ic\targetX, ic\targetY ) < 10 Or ic\targetTimer <= 0 Then
ic\targetTimer = 300
While True
target = Rand( 0, WP_AMOUNT - 1 )
If dWaypoints( target, 0 ) <> ic\targetX Or dWaypoints( target, 1 ) <> ic\targetY Then
ic\targetX = dWaypoints( target, 0 )
ic\targetY = dWaypoints( target, 1 )
Exit
EndIf
Wend
EndIf
If ic\speed = 5 Then
_targetAngle# = GetAngle( ObjectX( ic\obj ), -ObjectY( ic\obj ), ic\targetX, -ic\targetY )
RotateObject ic\obj, CurveAngle( _targetAngle, _angle, 20 )
EndIf
Else
If KeyHit( CbKeyReturn ) Then
bInCar = False
ic\user = 0
plX = ObjectX( ic\obj ) - Cos( _angle + 90 ) * 20
plY = ObjectY( ic\obj ) - Sin( _angle + 90 ) * 20
EndIf
If UpKey() Then
ic\speed + 0.5
Else
ic\speed - 0.5
EndIf
TurnObject ic\obj, ( LeftKey() - RightKey() ) * 5
EndIf
If ic\speed < 0 Then ic\speed = 0
If ic\speed > 5 Then ic\speed = 5
MoveObject ic\obj, ic\speed
Next ic
DrawScreen
Forever