Ongelma auton liikutuksen kanssa

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
User avatar
-Z-
Devoted Member
Posts: 682
Joined: Tue Aug 28, 2007 3:33 pm
Location: In ur danmaku, grazin ur bullets

Ongelma auton liikutuksen kanssa

Post by -Z- »

Olen tekemässä gta-kloonia, joten tarkoitus olisi saada kaupunkiin liikkumaan autoja varastettavaksi ja tuhottavaksi. Toteuttelen tässä nyt jonkinlaista waypoint-systeemiä, jossa waypointit eivät ole objekteja vaan datakerroksen numeroita. Ongelmana on nyt kuitenkin se, ettei systeemi yksinkertaisesti toimi. Olen kokeillut jos jonkinlaista viritystä, mutta auto vain tekee pehmeän käännöksen näennäisen mielivaltaiseen suuntaan, ja lähtee vaeltamaan. Tässä on koodia:

Code: Select all

    MoveObject car,3
    
    For y=1 To MapHeight()
    For x=1 To MapWidth()
        If GetMap2(3,x,y)=point Then
            x2=16*x
            y2=16*y
            curvepointobject2(car,x2,y2,10)
        EndIf
        If GetMap(3,ObjectX(ukko),ObjectY(ukko))=point Then point+1
    Next x
    Next y
    
    

    If point>4 Then point=1

Function CurvePointObject2(_obj, x, y, _smoothness = 10)
    angle#      = ObjectAngle(_obj)
    newangle#   = GetAngle(ObjectX(_obj),ObjectY(_obj),x,y )
    angle#      = CurveAngle(newangle, angle, _smoothness)
    RotateObject _obj, angle
EndFunction
Ideana on siis, että auto käännetään kohti datakerroksen numeroa 1, kun ollaan sen kohdalla käännetään numeroon 2 ja niin edelleen. Kun ollaan numeron neljä kohdalla mennään taas kohti ykköstä. Tarve avulle on suuri, toivottavasti joku osaa sitä tarjota.

edit: 123. Posti :>
"Fallout 3 (#10) marked a shift in the industry, a move that saw the western RPG begin to surpass its Japanese counterparts." -IGN top 100 RPGs of all time
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Ongelma auton liikutuksen kanssa

Post by Jonez »

En tekisi noin sitä waypoint-systeemiä... Itse tallentaisin waypointit joko tyyppilohkoon ja hakisin sieltä aina seuraavan kohteen. Itse lohkoon waypointtien koordinaatit saataisiin, kun pelin käynnistäessä kartan datakerros skannattaisiin vain kerran. Itse asiassa pelkkään data-kerrokseen turvautuminen olisi mielestäni erittäin tyhmää.

Kuitenkin:

Code: Select all

If ObjectX( auto\obj ) = auto\targetX And ObjectY( auto\obj ) = auto\targetY Then
    For id.tData = Each tData
        If id\wp = auto\wp Then
        
            If id <> Last( tData ) Then
                ad.tWaypoints = After( id )
                auto\wp = ad\wp
            Else
                ad.tWaypoints = First( tData )
                auto\wp = ad\wp
            EndIf
        
        EndIf
    Next id
EndIf

Käännä_ja_liikuta_auto(j)a
Suunnilleen näin tekisin. Koodissa saattaa olla virheitä, mutta tajuat ehkä idean.

Edit. Tässähän menee ikä ja terveys virheitä korjaillessa...
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
-Z-
Devoted Member
Posts: 682
Joined: Tue Aug 28, 2007 3:33 pm
Location: In ur danmaku, grazin ur bullets

Re: Ongelma auton liikutuksen kanssa

Post by -Z- »

Kiitos avusta, mutta hommahan on nyt näin, etten tajunnut tuosta koodista yhtään mitään. Olen oikeasti ihan aloittelija, ja noin kehittynyt koodi on minulle täyttä hepreaa. Voisitko yksinkertaistaa tuota systeemiä, tai esitellä minulle vaihtoehtoisen ratkaisumallin ongelmaani?
"Fallout 3 (#10) marked a shift in the industry, a move that saw the western RPG begin to surpass its Japanese counterparts." -IGN top 100 RPGs of all time
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Ongelma auton liikutuksen kanssa

Post by Jonez »

Tein tällaisen koodin. Jos et osaa taulukoita, kannattaa nyt opetella (katso ensin vaikka manuaalin selitys ja yritä sitten ymmärtää tämä. Yritin tehdä mahdollisimman yksinkertaisesti.)

Ensin ajattelin tehdä aivan yksinkertaisen mallin, mutta se soti luontoani vastaan. En yksinketaisesti voi tehdä esimerkkejä jotka ovat käytännössä hyödyttömiä.
Jouduin muuttamaan hiukan tota CurvePointObject2-funkkariakin.

Edit: no kerron nopeasti miten tässä taulukot toimivat:
wp( target, 0 ) pitää sisällään x-koordinaatit. Tämä voi olla esim: wp( 0, 0 ), tai wp( 42, 0 ). Toi nolla tarkoittaa että kyseessä on x-koordinaatti. Jos nollan sijalla on 1, kyseessä on y-koordinaatti. Miksi? Koska koodasin niin: Jokainen y-koordinaattit tallennetaan soluun: wp( wpCount, 1 ).

Se auto seuraa valmiiksi tehtyjä waypointteja, mutta hiiren 1-nappulalla voit luoda lisää.

Code: Select all

SCREEN 1024, 768
FrameLimit 40

//----------------------------------------------------------------
//Tehdään nopeasti pieni tilemappi jossa auto voi ajaa.
//Tavallisesti näiden koodien rinnalla olisi vain yksinkeraisesti
//LoadMap().
//Älä välitä tästä mapin teosta. Riittää että tiedät, että siinä
//asetetaan tekstuurit ja datanumero 1 niiden ristien kohdalle.
//----------------------------------------------------------------
map = MakeMap( 21, 21, 32, 32 )
set = LoadImage("media\tileset.bmp")
PaintObject map, set

For x = 1 To MapWidth()
    For y = 1 To MapHeight()
        If x = 1 Or y = 1 Or x = MapWidth() Or y = MapHeight() Then
            EditMap map, 0, x, y, 144
        Else
            EditMap map, 0, x, y, 153
        EndIf
        
        //Asetetaan data
        If ( y = 5 Or y = MapHeight() - 5 ) And ( x = 5 Or x = MapWidth() - 5 )  Then
            EditMap map, 3, x, y, 1
            EditMap map, 0, x, y, 4
        EndIf
        
    Next y
Next x
//===================================================================================
//Mapin teko loppuu. Tästä eteenpäin sinun tulisi tajuta. HUOM niille jotka tajuavat:
//Tiedän että olisin voinut tehdä seuraavia asioita myös edellisessä silmukassa, missä
//loin mapin, mutta näin se on selvempää, koska mapin luominen ei ole olennaista
//tässä esimerkissä.
//====================================================================================

car = LoadObject( "media\car2.bmp", 72 )

//Taulukko waypointeille (koko 4. Tarkoittaa että waypointteja voi olla vain 4. ÄLÄ YRITÄ TEHDÄ ENEMPÄÄ KUIN 4, muutoin peli kaatuu.
//(ellet sitten uudelleenvenytä taulukkoa)
ClearArray OFF //Nyt voimme turvallisesti uudelleenvenyttää taulukkoa
Dim wp( 3, 1 )

For x = 1 To MapWidth()
    For y = 1 To MapHeight()
        If GetMap2( 3, x, y ) = 1 Then 
            //Jos löydetään data1, merkitään koordinaatit muistiin taulukkoon "wp"
            //Seuraavaa koodi muuttaa tilen koordinaatit maailmakoordinaateiksi.
            wp( wpCount, 0 ) = x * 32 - ObjectSizeX( map ) / 2 - 16
            wp( wpCount, 1 ) = y * 32 - ObjectSizeY( map ) / 2 + 16
            wpCount + 1
        EndIf
    Next y
Next x

PositionObject car, wp( 0, 0 ), wp( 0, 1 )

Repeat
    
    //Tarkastetaan onko auto tarpeeksi lähellä kohde-koordinaatteja (alle 20 pikselin päässä).
    //Jos on, vaihdetaan kohdetta.
    If Distance( ObjectX( car ), ObjectY( car ), wp( target, 0 ), wp( target, 1 ) ) < 32 Then
        target + 1
        If target > wpCount - 1 Then target = 0
    EndIf
    
    //Hiiren 1-nappula lisää uuden waypointin.
    If MouseHit(1) Then
        wpCount + 1
        ReDim wp( wpCount - 1, 1 )          //Uudelleenvenytetään taulukkoa
        wp( wpCount - 1, 0 ) = MouseWX()    //Asetetaan uusimpaan soluun koordinaatit
        wp( wpCount - 1, 1 ) = MouseWY()
    EndIf

    CurvePointObject2( car, wp( target, 0 ), wp( target, 1 ) )
    MoveObject car, 5
    
    DrawGame
    Text 20, 20, target + " / " + ( wpCount - 1 ) 
    
    Color cbWhite
    DrawToWorld ON
    For i = 0 To wpCount - 1
        Circle wp( i, 0 ), wp( i, 1 ), 5
    Next i
    
    Color cbRed
    Circle wp( target, 0 ), wp( target, 1 ), 5
    DrawToWorld OFF
    Color cbWhite
    
    DrawScreen
Forever

//HUOMAA muutokset jotka tein tähän funkkariin: ( -objectY() ja -y )
Function CurvePointObject2(_obj, x, y, _smoothness = 10)
    angle#      = ObjectAngle(_obj)
    newangle#   = GetAngle(ObjectX(_obj),-ObjectY(_obj),x,-y )
    angle#      = CurveAngle(newangle, angle, _smoothness)
    RotateObject _obj, angle
EndFunction
Edit.
Siitä piti sanoa, että älä omassa pelissäsi käytä noita piirtokomentoja näyttämään missä waypointit ovat. Ne ovat vain havainnollistamassa tässä esimerkissä, mutta todellisuudessa piirtokomennot ovat aivan liian hitaita jotta niitä olisi järkevä käyttää tässä.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
-Z-
Devoted Member
Posts: 682
Joined: Tue Aug 28, 2007 3:33 pm
Location: In ur danmaku, grazin ur bullets

Re: Ongelma auton liikutuksen kanssa

Post by -Z- »

Kiitos kovasti vaivannäöstäsi! Osaan toki taulukot(ainakin jotenkuten...), mutta noista after, first ja last komennoista en ymmärtänyt mitään. Kiitos vielä kerran, kun teit minulle noin hienon esimerkin ;-D
"Fallout 3 (#10) marked a shift in the industry, a move that saw the western RPG begin to surpass its Japanese counterparts." -IGN top 100 RPGs of all time
Post Reply