Page 1 of 1

Aikamatkustussysteemi

Posted: Tue Jan 06, 2009 9:36 pm
by Mickey
Littlegreenin luoman ajankelausesimerkin (ei julkaistu) pohjalta loin tällaisen järjestelmän. Tähän kun lisätään vielä historian kulun muuttaminen (jonka olen jo suunnitellut) pitäisi saada aikaan varsin mielenkiintoisia pelejä. Itse olen ainakin suunnitellut sellaisia vielä tekeväni :mrgreen:

Code: Select all

 FrameLimit 50

players=1
Const x=1 'Sijainti X-akselilla
Const y=2 'Sijainti Y-akselilla
Const t=3 'sijainti kotihetkestä menneisyyteen

//TAULUKOINTI
Dim player(players,3,1500) As Float
in_past = 0 'nykyinen aika, jossa menneisyydessä ollaan
past_travel = 3 'aikamatkustusnopeus

Repeat
    
//LÄPIKÄYNTI
    For i=1 To players
    
//MÄÄRITETÄÄN MENNEISYYTTÄ
    For a=1500 To 1 Step -1
    player(i,x,a)=player(i,x,a-1)
    player(i,y,a)=player(i,y,a-1)
    player(i,t,a)=player(i,t,a-1)
    Next a
    
    
    player(i,x,0)=player(i,x,0)+((RightKey()-LeftKey())*2)
    player(i,y,0)=player(i,y,0)+((DownKey()-UpKey())*2)
    player(i,t,0)=in_past
    
    If KeyDown(cbKeyQ)=1 And KeyDown(cbKeyA)=0 Then past_travel + 1 
    If KeyDown(cbKeyA)=1 And KeyDown(cbKeyQ)=0 Then past_travel - 1
    If KeyDown(cbKeyS)=1 And KeyDown(cbKeyW)=0 Then in_past = in_past + past_travel 
    If KeyDown(cbKeyW)=1 And KeyDown(cbKeyS)=0 Then in_past = in_past - past_travel
    
    in_past - 1
    If KeyDown(cbKeyE) = 1 Then in_past + 2 'Hetkeen pysähtyminen
    If in_past > 1500 Then in_past = 1500
    If in_past < 0 Then in_past = 0
    If past_travel < 3 Then past_travel = 3

//MINÄSI
    Color cbWhite
    Box player(i,x,0)-5,player(i,y,0)-5,10,10
//Entiset minäsi
    For j = 1 To 1500
        If player (i,t,j) = in_past - j Then Box player(i,x,j)-5,player(i,y,j)-5,10,10
    Next j
    Next i
    
    
    
    Text 0,20,FPS() + "     " + in_past + "     " + past_travel
    
    DrawScreen
Forever 
Näppäimet:
Liikkuminen: nuolet
Ajassa liikkuminen: W & S
Aikamatkustusnopeuden säätö: Q & A
Ajassa pysähtyminen: E
EDIT:

Miksikähän kukaan ei kommentoi? :(

EDIT:

Yleisön pyynnöstä hieman lisäselvennystä:
Tässä esimerkissä voit liikuttaa valkoista neliötä tilan lisäksi myös ajassa (aikakone-periaatteella, ei siis kelausta) ja nähdä samassa hetkessä oleskelleet aiemmat minäsi. Historia tallentuu puolen minuutin ajalta.


Re: Aikamatkustussysteemi

Posted: Wed Jan 07, 2009 8:46 pm
by axu
Aika mielenkiintoinen systeemi, pitää vähän syventyä että ymmärtää sen. En näe tästä ainakaan itselleni hyötyä, mutta jatka tämän kehittämistä ja hyvä tulee :D

Mickey wrote:Miksikähän kukaan ei kommentoi? :(
Sen jos keksit kerro mullekkin, sama ongelma :/

Re: Aikamatkustussysteemi

Posted: Thu Jan 08, 2009 2:28 pm
by KankiKalle
Sitten kun älysin miten tämä toimii, älysin että tämähän on hieno systeemi! :lol: Mukavan erilainen idea, täytyy myöntää. Jos olisit selventänyt hieman mitä tässä tapahtuisi jne. niin moni varmasti ymmärtäisi paremmin mitä olet yrittänyt kertoa tällä systeemillä. Minulta kesti aika kauan (10 min :shock: ) ymmärtää mitä tässä piti tehdä.
Ja kärsivällisyydellä pääse pitkälle. Ei kaiken täydy tapahtua heti. Odota. Se ei vie kun hetken aikaa. Ja sinä itse määrät kuinka paljon se hetki on ;) Ja sitten kun joku on kommentoinut, se hetki on ohi. Nuoren, ei niin viisaan ja hieman oudon tyypin opetuksia osa1.

Re: Aikamatkustussysteemi

Posted: Fri Jan 09, 2009 3:09 pm
by Mickey
Kiitos rohkaisevista kommenteistanne (ne ovat ensimmäisen esimerkkinsä julkaisseelle tärkeitä ;) ). Jatkan toki tämän kehittelyä, sanoinhan aikovani tehdä tähän pohjautuvia pelejä. Saatanpa vielä julkaista jotain esimerkkiä siitä historian kulun muuttamisesta.
axu wrote: En näe tästä ainakaan itselleni hyötyä...
Tjep, tämä ei ole mikään kovin yleishyödyllinen esimerkki... :roll:

Re: Aikamatkustussysteemi

Posted: Fri Jan 09, 2009 4:58 pm
by kaneli2000
Nyt meni yli hilseen. En tajunnut tosta mitään.

...mutta jos sinä Mickey tajuat, niin saadan nähdä vielä hienoja pelejä.

Re: Aikamatkustussysteemi

Posted: Sat Jan 10, 2009 7:24 pm
by MaGetzUb
Helpompihan olisi tehdä typeillä tuollainen systeemi.. (Helpompi ja helpompi -.-) Mutta siitä saisi silti paljon kaistakkaamman, kuin taulukoilla.

Re: Aikamatkustussysteemi

Posted: Sun Jan 11, 2009 12:21 pm
by nevssons
programmer of DSG wrote:Helpompihan olisi tehdä typeillä tuollainen systeemi.. (Helpompi ja helpompi -.-) Mutta siitä saisi silti paljon kaistakkaamman, kuin taulukoilla.
Yhdellä objektilla kyllä, mutta jos olisi useampi object joutuisit määrittämään jokaiselle oman tyypin. Ja kyllä minä oisin tämänkin hoitanut taulukoilla.

Re: Aikamatkustussysteemi

Posted: Sun Jan 11, 2009 12:27 pm
by KilledWhale
Yksi mahdollisuus olisivat myös muistipalat jolloin tyyppimäärityksiä ei tarvittaisi. Muistipalan osoitteen voisi puskea talteen objektiin ojbectintegerin avulla

Re: Aikamatkustussysteemi

Posted: Sun Jan 11, 2009 1:23 pm
by Mickey
Taulukko on tuon edellämainitun Littlegreenin esimerkin peruja. Muistipaloja en tajua ( :oops: ) eikä objectintegeristä olisi hyötyä ainakaan seuraavassa projektissani, koska teen sen piirtokomennoilla.
kaneli2000 wrote:Nyt meni yli hilseen. En tajunnut tosta mitään.

...mutta jos sinä Mickey tajuat, niin saadan nähdä vielä hienoja pelejä.
Jos siis oikein ymmärsin, tajuat kyllä aikamatkustuksen ja kenties tuon ohjelmanikin, muttet sen koodia etkä sen tarjoamaa esimerkkiä. Korjaa jos olen väärässä. :)

Re: Aikamatkustussysteemi

Posted: Thu Sep 29, 2011 4:11 pm
by mrZalli
Woo. Hieno systeemi. Voisin kokeilla käyttää tätä jos vain löydän idean ja innostuksen. :)

Re: Aikamatkustussysteemi

Posted: Thu Sep 29, 2011 5:19 pm
by Frozen
mrZalli wrote:Woo. Hieno systeemi. Voisin kokeilla käyttää tätä jos vain löydän idean ja innostuksen. :)
Ja tuon takia piti nostaa näin vanha topikki?
EDIT:

Mutta kyllä tälläistä systeemiä käyttämällä voisi luoda pienen Braidia muistuttavan pelin.


Re: Aikamatkustussysteemi

Posted: Sat Oct 22, 2011 12:12 pm
by Mickey
mrZalli wrote:Woo. Hieno systeemi. Voisin kokeilla käyttää tätä jos vain löydän idean ja innostuksen. :)
Kiitos kehuista. On oikeastaan ihan kiva, että nostit tämän topikin ylös, niin muistin itsekin, mitä minun pitäisi ohjelmoida. :D

Re: Aikamatkustussysteemi

Posted: Sat Jun 23, 2012 2:04 pm
by MrMonday
Tein itsekkin pienen aikamatkustus-systeemin, mutta postaan sen tänne, kun kerta aiheesta jo ketju on pistetty pystyyn.

Code: Select all

SCREEN 800,600,32,0

Const _TIME = 500

obj = LoadObject("car.bmp",360)

floor = MakeObjectFloor()

floor_img = MakeImage(50,50)

    DrawToImage floor_img

    For x = 0 To ImageWidth(floor_img)
    For y = 0 To ImageHeight(floor_img)
        gray = Rand(100,200)
        Color gray,gray,gray
        Dot x,y
    Next y
    Next x
    
    DrawToScreen

PaintObject floor, floor_img

Type PATH
    Field x
    Field y
    Field ang
    Field mm#
    Field tt#
End Type

        frame.PATH = New(PATH)
        frame\x   = ObjectX(obj) 
        frame\y   = ObjectY(obj)
        frame\ang = ObjectAngle(obj)
        frame\mm# = m#
        frame\tt# = t#
        
        frames = frames + 1

Repeat

    If KeyDown(57) And Before(frame) <> NULL And frames > 0 Then
        
        frame = Before(frame)
        
        RotateObject obj, frame\ang
        PositionObject obj, frame\x, frame\y

        m# = frame\mm#
        t# = frame\tt#

        frames - 1

    ElseIf Not KeyDown(57)
        
        If KeyDown(200) Then m# = m# + 0.05
        If KeyDown(208) Then m# = m# - 0.05
        If KeyDown(205) Then t# = t# - 0.05
        If KeyDown(203) Then t# = t# + 0.05
        
        If m# < -5.00 Then m# = -5.00
        If m# >  5.00 Then m# =  5.00
        
        If t# < -3.00 Then t# = -3.00
        If t# >  3.00 Then t# =  3.00
        
        If Not KeyDown(200) Or KeyDown(208) Then m# = CurveValue(0.00,m#,100)
        If Not KeyDown(205) Or KeyDown(203) Then t# = CurveValue(0.00,t#,10)
        
        If ObjectX(obj) < -400 Then PositionObject obj, 400, ObjectY(obj)
        If ObjectX(obj) > 400 Then PositionObject obj, -400, ObjectY(obj)
    
        If ObjectY(obj) < -300 Then PositionObject obj, ObjectX(obj), 300
        If ObjectY(obj) >  300 Then PositionObject obj, ObjectX(obj), -300

        MoveObject obj, m#
        TurnObject obj, t#

        frame.PATH = New(PATH)
        frame\x   = ObjectX(obj) 
        frame\y   = ObjectY(obj)
        frame\ang = ObjectAngle(obj)
        frame\mm# = m#
        frame\tt# = t#
        
        frames = frames + 1
        
        If frames => _TIME Then 
            Delete First(PATH)
            frames = frames - 1
        EndIf
        
    EndIf
    
    DrawGame
    
    Color 255,0,0
    Text 0,0,"Time: "+frames
    
    DrawScreen
    
Until KeyHit(1)
Mikään täydellinen tämä ei ole, mutta parannuksia tähän olisi tarkoitus tehdäkkin.

Ohjaus - Nuolinäppäimet.
Ajan kelaus - Välilyönti.
EDIT:

Vaihdoin taulukoista tyyppeihin, nyt toimii todella nätisti :D


Re: Aikamatkustussysteemi

Posted: Tue Jun 26, 2012 1:40 pm
by valscion
MrMonday wrote:Tein itsekkin pienen aikamatkustus-systeemin, mutta postaan sen tänne, kun kerta aiheesta jo ketju on pistetty pystyyn.
Muuten hyvä mutta bugailee vähän jos ei kelaa täysin alkuun ja jatkaa liikkumista. Liikkumisen jälkeen kun kelaa taaksepäin niin siinä kohtaa jossa jäi kelaus kesken, niin tapahtuu jänniä bugeja ja auto hyppää väärään paikkaan.

Re: Aikamatkustussysteemi

Posted: Thu Jul 05, 2012 12:50 pm
by Combatti
Hieno systeemi. Itse en huomannut bugia? Tällä voisi pienellä muokkauksella tehdä replaysysteeminkin. Tiedä häntä, tuleeko itselläni koskaan käyttöön(Toden näköisesti, koska en täällä ole tähän asti muuta tehnyt, kuin testannut pelejä ja funktioita jajoistakin tehdä oman versioni tai muokkaukseni :lol: )

Re: Aikamatkustussysteemi

Posted: Thu Jul 05, 2012 6:52 pm
by MrMonday
Oli näköjään pieni virhe tosiaan päässyt sekaan, mutta tässä siis korjattuna ;) Enää puuttuisi, että saisi nuo systeemit tungettua funktioon, ja kelaus monelle (= kaikille) kuvalle/objektille kerrallaan, mutta oma mielenkiinto ei riitä tällä hetkellä moiseen :P

Code: Select all

SCREEN 800,600,32,0

Const _TIME = 500

obj = LoadObject("media/car.bmp",360)

floor = MakeObjectFloor()

floor_img = MakeImage(50,50)

    DrawToImage floor_img

    For x = 0 To ImageWidth(floor_img)
    For y = 0 To ImageHeight(floor_img)
        gray = Rand(100,200)
        Color gray,gray,gray
        Dot x,y
    Next y
    Next x
    
    DrawToScreen

PaintObject floor, floor_img

Type PATH
    Field x
    Field y
    Field ang
    Field mm#
    Field tt#
End Type

        frame.PATH = New(PATH)
        frame\x   = ObjectX(obj) 
        frame\y   = ObjectY(obj)
        frame\ang = ObjectAngle(obj)
        frame\mm# = m#
        frame\tt# = t#
        
        frames = frames + 1

Repeat

    If KeyDown(57) And Before(frame) <> NULL And frames > 0 Then
        
        frame = Last(PATH)
        
        RotateObject obj, frame\ang
        PositionObject obj, frame\x, frame\y

        m# = frame\mm#
        t# = frame\tt#

        frames - 1
        
        Delete frame

    ElseIf Not KeyDown(57)
        
        If KeyDown(200) Then m# = m# + 0.05
        If KeyDown(208) Then m# = m# - 0.05
        If KeyDown(205) Then t# = t# - 0.05
        If KeyDown(203) Then t# = t# + 0.05
        
        If m# < -5.00 Then m# = -5.00
        If m# >  5.00 Then m# =  5.00
        
        If t# < -3.00 Then t# = -3.00
        If t# >  3.00 Then t# =  3.00
        
        If Not KeyDown(200) Or KeyDown(208) Then m# = CurveValue(0.00,m#,100)
        If Not KeyDown(205) Or KeyDown(203) Then t# = CurveValue(0.00,t#,10)
        
        If ObjectX(obj) < -400 Then PositionObject obj, 400, ObjectY(obj)
        If ObjectX(obj) > 400 Then PositionObject obj, -400, ObjectY(obj)
    
        If ObjectY(obj) < -300 Then PositionObject obj, ObjectX(obj), 300
        If ObjectY(obj) >  300 Then PositionObject obj, ObjectX(obj), -300

        MoveObject obj, m#
        TurnObject obj, t#

        frame.PATH = New(PATH)
        frame\x   = ObjectX(obj) 
        frame\y   = ObjectY(obj)
        frame\ang = ObjectAngle(obj)
        frame\mm# = m#
        frame\tt# = t#
        
        frames = frames + 1
        
        If frames => _TIME Then 
            Delete First(PATH)
            frames = frames - 1
        EndIf
        
    EndIf
    
    DrawGame
    
    Color 255,0,0
    Text 0,0,"Time: "+frames
    
    DrawScreen
    
Until KeyHit(1)