Kohde ei vaihda suuntaa

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
verihyypp
Newcomer
Posts: 7
Joined: Sun Jun 05, 2011 9:43 pm

Kohde ei vaihda suuntaa

Post by verihyypp »

Eli tässä olisi koodin pätkä joka vähän kusee.
FrameLimit 40

Map= LoadMap("media/cdm2.til", "media/tileset.bmp")

Kohde=LoadObject("media/soldier.bmp",360)
SetupCollision kohde,map,2,4,2
temp=MakeObject()
temp2=MakeObject()
CameraFollow kohde, 1, 20
Liike = 0
Repeat

If MouseHit(1) And Liike = 0
temp=MakeObject()
PositionObject temp,MouseWX(),MouseWY()

Liike = 1
EndIf

If MouseHit(1) And Liike = 1
PositionObject temp,MouseWX(),MouseWY()
Liike = 1
EndIf

If Liike = 1 Then
PointObject temp2,temp
kulma# = CurveAngle(ObjectAngle(temp2),ObjectAngle(kohde), 2)
RotateObject kohde,kulma
MoveObject kohde,1
EndIf

If liike = 1
If Distance2(kohde,temp)<5 Then
DeleteObject temp
Liike = 0
EndIf
EndIf

DrawScreen

Forever
temp2 pitäs poistaa ja laittaa takas oikeassa kohtaa. En nyt enään saa sitä toimimaan. Ohjaus nääs kärsii kun menet liian kauas keskipisteestä.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Kohde ei vaihda suuntaa

Post by koodaaja »

On hieman turhaa käyttää ylimääräistä objektia vain näyttämään kulmaa johon ollaan menossa, kun kahden objektin välisen kulman saa PointObjectia ja ObjectAnglea helpommin GetAngle2 -funktiolla, joka kertoo kahden objektin välisen kulman. Kahdellakin objektilla pitäisin toisen uudelleenluontia ja poistelua hieman epävarmana, sinne jää yllättävän helposti joku pieni aukko jonka jälkeen yritetään liikuttaa olematonta objektia tai luodaan turhaan useita kappaleita. Lisäksi sinulla on tuolla melkoinen läjä if-lauseita, joista suurimman osan saa yhdisteltyä. Pienten muokkausten jälkeen koodi näyttäisi tältä:

Code: Select all

FrameLimit 40

Map= LoadMap("media/cdm2.til", "media/tileset.bmp")

Kohde=LoadObject("media/soldier.bmp",360)
SetupCollision kohde,map,2,4,2
temp=MakeObject()
CameraFollow kohde, 1, 20
Liike = 0

Repeat
    
    If MouseHit(1) Then
        PositionObject temp,MouseWX(),MouseWY()
        Liike = 1
    EndIf
    
    If Liike = 1 Then
        RotateObject kohde, CurveAngle(GetAngle2(kohde,temp),ObjectAngle(kohde), 2)
        MoveObject kohde,1
        If Distance2(kohde,temp)<5 Then Liike = 0 
    EndIf
    
    DrawScreen

Forever
Kaksi ensimmäistä if-lausettasihan tekevät saman asian, oli liike = 0 tai liike = 1, joten sitä on turha tarkistaa. Kaksi jälkimmäistä taas tarkistavat saman asian (Liike = 1), joten ne voi laittaa yhteenkin. CurveAnglen ensimmäiseksi kulmaksi voi tosiaan laskea suoraan kohteen ja tempin välisen kulman, jolloin temp2 -objektia ei tarvita ollenkaan.

EDIT: Niin, ja alkuperäinen ongelmasihan johtuu siitä että temp2 pysyy origossa, ennen "PointObject temp2, temp" -riviä lisää "CloneObjectPosition temp2, kohde" niin koodi toimii, kun temp2 pysyy kohteessa kiinni niin kulmakin lasketaan kohteesta eikä maailman keskipisteestä.
Post Reply