cbChipmunk 0.7.2 (Fysiikkakirjasto)

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

cbChipmunk 0.7.2 (Fysiikkakirjasto)

Post by Latexi95 »

cbChipmunk on 2d-fysiikkakirjasto. Se on dll:n avulla tehty Coolbasic versio Chipmunk-Physics kirjastosta.

29.5.2013
Pitkästä aikaa päivytystä. Lisätty cpApplyGravitation, jolla voidaan luoda painovoima tietyn rungon kohdalle, niin että se vetää kaikkia toisia runkoja puoleensa. Korjattu muistipalasta ylikirjoitus cpShapeNewStaticissa. Päivitetty samalla chipmunk-physics versioon 6.1.4.

15.12.2011
Uusi versio julkaistu. Nyt mukana on (liian) kauan kaivattu manuaali, joka integroituu mukavasti CB:n editoriin. Muutama hyödyllinen funktio liitosten ominaisuuksien tarkistamiseen ja muuttamiseen mahdollistava mm. hajoavien liitosten tekemisen. Muutamat muutokset lähinnä dll:n kääntämisasetuksissa voivat tuoda (hyvin) vähän lisää vauhtia.
Muutoksena aikaisempaa tällä versiolla ennen cbChipmunkin includettamista täytyy määritellä chipmunkin käyttämän dll:n polku:

Code: Select all

Const CP_DLL_PATH = "cbChipmunk.dll"
Tämä lähinnä esimerkkien tekemisen helpottamiseksi (toimivat suoraan examples kansiosta).

12.1.2011
Pieniä päivityksiä aiempaan versioon. Lisätty mahdollisuus hakea törmäysten aiheuttama impulssi.
Isompana uudistuksena cpDebugDraw funktio, jonka avulla yhdellä funktion kutsulla saa piirrettyä koko fysiikkamaailman. Liitoksia ei vielä piirretä, mutta törmäysmuodot ja törmäyskohdat ainakin. Liitosten piirtäminen on tulossa cpDebugDrawiin seuraavassa päivityksessä.

Todo:
-Inertian laskenta funktiot [TEHTY] 3.8.2011
-Liitokset (Joint) [TEHTY (osittain)] 3.8.2011
-Polygonit [TEHTY] 5.8.2011
-Törmäysten hallinta [TEHTY] 24.9.2011
-Raycasting [TEHTY] 25.9.2011
-Lisää esimerkkejä (haluaako joku auttaa?)
-dokumentointi [TEHTY] 15.12.2011
-Fysiikkamaailman piirtäminen [tehty osittain] 12.1.2012

Projekti on nyt kaikkien nähtävillä GitHubissa. Jos joku halua auttaa, niin manuaalin teossa riittää hommaa. Editori sitä varten löytyy myös gitistä.


Kiitos JATothrimille ideasta käyttää Box2D:n sijasta Chipmunkia.

Vanha viesti:
Tälläistä on varmaan kaivattu jo pitkään, joten enemmittä puheitta esittelen teille cbChipmunk fysiikkakirjaston.
Se on tarkoitettu pelien 2d fysiikkan simulointiin. Tämä on kohtuullisen kesken eräinen, mutta kun vihdoin sain sen toimimaan jonkunlailla, niin oli heti pakko päästä esittelemään.

Perus rakenne
Kaikki fysiikka oliot perustuvat runkoihin. Rungoilla on sijainti, kulma ja nopeus, paino, inertia, sekä erilaisia voimia. Runkoihin kiinnitetään muotoja, jotka sitten voivat törmätä keskenään. Runko voi olla staattinen tai dynaaminen. Staattisiin runkoihin voi törmätä, mutta ne eivät liiku. Dynaamiset taas ovat tavallisia runkoja jotka voivat törmätä ja myös liikkuvat niiden vaikutuksesta.
Fysiikkamoottori on tehty pyörimään omassa säikeessään. Joten toiminta on tälläinen: Ensin kutsutaan cpUpdatea, se aloittaa fysiikan päivityksen. Kutsuttuasi sitä älä muuta runkoja. Tässä välissä kannattaa hoitaa vaikka piirtäminen. Sitten kutsutaan cpWaitForUpdatea, se odottaa kunnes fysiikat ovat päivitetty (yleensä ovat jo ennen kuin edes kutsutaan...).
Lopuksi pyydetään fysiikkamoottorilta uudet runkojen sijainnit, kulmat, nopeudet ja yms. Se tapahtuu kutsumalla cpPullAll. Eli pelin pääsilmukka kannattaisi olla suurinpiirtein tälläinen:

Code: Select all

Repeat
    cpUpdate(1.0/60.0)
    
    //Kaikki piirtäminen tähän...
    DrawScreen
    
    cpWaitForUpdate()
    cpPullAll()
Forever
    
Kerrokset ja ryhmät
cbChipmunkissa törmäykset karsitaan kerrosten(layer) ja ryhmien(group) avulla. Kerrokset esitetään kokonaislukuna, jonka jokainen bitti tarkoitta yhtä kerrosta. Yksi muoto(cpShape) voi olla useammalla kerroksella yhtäaikaa (oletuksena kaikilla). Vain samalla kerroksella olevat muodot(cpShape) voivat törmätä.
Samaan ryhmään kuuluvat muodot eivät voi törmätä keskenään. Oletuksena muodolla ei ole ryhmää (ryhmä on 0:lla).

Polygonit
Chipmunk vaatii, että polygonit ovat kuperia, joten polygonin yksikään verteksi ei saa olla "kuopalla". Ja sitten verteksien täytyy olla myötäpäiväisessä järjestyksessä polygonissa. Jos ehdot eivät toteudu, niin luotaessa muotoa(cpShape) ohjelma herjaa "Invalid polygonia".

"Luokat"
Tällä hetkellä cbChipmunkissa on 7 "luokkaa" (muistipaloilla toimivat...) cpBody, cpShape, cpBoxGeometry, cpSegmentGeometry, cpCircleGeometry, cpArbiter ja cpArbiterList.
-*Geometry luokat pitävät sisällään tiedon muotojen geometrista. Niitä käytetään varsinaisen cpShapen luomiseen.
-cpShape on varsinainen muoto. Sillä on suhteellinen sijainti runkoonsa(cbBody) nähden. Sillä on kitka ja kimmoisuus.
-cpBody on fysiikka olioiden runko. Siihen liitetään muodot (cpShape).
-cpArbiter edustaa yhtä törmäystä. Siitä voidaan hakea törmäyksen toinen osapuoli(runko), sekä törmänneet muodot(cpShape) ja törmäyspisteet.
-cpArbiterList on lista törmäyksistä. Se on cpBodyGetArbiters funktion palautusarvo. Siitä voidaan hakea cpArbiterit.

Luokan jäsen luodaan [luokannimi]New funktiolla. Esim. cbBoxGeometryNew. cbBodyllä ja cpShapella on myös konstruktori funktiot staattisia jäseniä varten: cbBodyNewStatic ja cbShapeNewStatic. cbBodyStatic luo uuden staattisen rungon, ja cbShapeStatic luo uuden muodon ja kiinnittää sen cbChipmunkin päästaattiseen runkoon(se luodaan automaattisesti). Muodot ovat aina staattisia, kun ne kiinnitetään staattiseen runkoon.

Tällä hetkellä en ole vielä ehtinyt tehdä funktioita kaikkien luokkien ominaisuuksien muuttamiseen ja noutamiseen, joten ne täytyy tällä hetkellä hakea muistipalojen komennoilla. Ominaisuuksien hakemisen helpottamiseksi olen tehnyt kasan vakioita jotka kertovat missä kohdassa muistipalaa mikäkin tieto on. esim.

Code: Select all

rungonX = PeekFloat(runko,CP_INDEX_BODY_POS_X)
En ole ihan varma kannattaako edes funktioita tehdä, kun ylimääräisiä funktiokutsuja tulee aika paljon. (Kommentteja tästä kiitos)


Funktiot
(Tässä ei ole lähellekkään kaikki, mutta ehkä tärkeimmät)
Kaikki funktiot alkavat cp kirjainyhdistelmällä.

Yleiset
cpSetGravity(gravX#,gravY#)
-asettaa painovoiman.

cpSetIterations(iterations%)
-Asettaa montako kertaa fysiikat päivitetään per cpUpdate. Mikäli palikat tuntuvat menevän läpi muista palikoista, lisää tätä. Oletuksena 200.

cpDelete(var)
-Poistaa var:in. Tällä voidaan poistaa, mikä tahansa cp****New:llä luotu muuttuja. Huom. Jos poistat rungon, niin poistat samalla kaikki liitokset ja muodot jotka siihen on kiinnitetty. cpShapen poistaminen ei poista cb****Geometryä.

cpPush(var)
-Tyrkkää var:iin tehdyt muutokset takaisin fysiikkamoottorille. Käytä tätä sen jälkeen, kun olet muuttanut vaikka rungon sijaintia. Toimii cpBodyllä ja cpShapella. Huom. jos tyrkkäät cpShapen, niin ainoastaan kitka, kimmoisuus, ryhmä ja kerrokset päivittyvät.

cpUpdate(step#)
-aloittaa fysiikoiden päivittämisen ja päivittäää fysiikoita step# sekuntia. Kannattaa käyttää aina samaa lukua. Se kuuluisi olla sama kuin FPS joten step# kannattaa olla 1.0/FrameLimit.

cpWaitForUpdate()
-odottaa kunnes fysiikat ovat päivittyneet tai palaa suoraan mikäli ovat jo. Palauttaa nyt, montako millisekuntia kului varsinaiseen fysiikan päivitykseen.

cpPullAll()
-hakee kaikkien runkojen(cpBody) päivitetyt tiedot. Kutsu tätä cbWaitForUpdaten jälkeen.

cpUseSpatialHash(width#,size)
-Tällä saat chipmunkin käyttämään ruudukkoa puun sijaan törmäysten järjestelemiseen. Jos kentässä on paljon saman kokoisia muotoja niin tätä kannattaa ehdottomasti käyttää. Ruudunleveys(width#) kannattaa olla lähellä keskimääräistä muodon kokoa ja taulukon solujen määrä(size) kannattaa olla noin 10*runkojen määrä. (Nuo suositukset ovat Chipmunkin dokumentaatiosta otettuja...)

cpSetSleepTimeThreshold(t#)
-Tällä voi asettaa ajan, jonka rungon täytyy pysyä paikallaan, että se nukahtaa.

cpIdleSpeedThreshold(s#)
-Tällä voit asettaa paljonko runko saa liikkua, että se tulkitaa paikallaan olevaksi(katso ylempi).

cpSetDamping(v#)
-Tällä voit asettaa paljonko runkojen liike hidastuu.


Geometriset muodot
cpBoxGeometryNew(w#,h#)
-luo uuden laatikon jonka koko on w# x h#

cpCircleGeometryNew(r#,r2# = 0)
-luo uuden ympyrän jonka säde on r#. Jos haluat tehdä kehän ympyrän sijasta muuta r2:n arvoa, mutta se vaikuttaa vain inertian ja massan laskentaan.

cpSegmentGeometryNew(x1#,y1#,x2#,y2#,w#)
-luo uuden viivan pisteiden (x1#,y1#) ja (x2#,y2#) välille. Viivan paksuus on w#. Käytä viivoja mieluusti vain staattisissa rungoissa.

cpPolyGeometryNew(size)
-luo uuden polygonin "size" määrällä pisteitä

cpPolyGeometrySetVertex(polygon,index,x#,y#)
-asettaa polygonin "polygon" verteksin indeksistä (index) sijainniksi (x#,y#). Indeksi alkaa 0:llasta ja päättyy koko-1:een.

cpPolyGeometryRecenter(polygon)
-keskittää polygonin painopisteeseensä. Käytä tätä, kun olet saannut polygonin muodon valmiiksi.

cpMomentForGeometry(geometry,mass#,offsetX# = 0,offsetY# = 0)
-Laskee inertian muodolle geometry(mikätahansa cpGeometry* (circle/segment/box))

cpAreaForGeometry(geometry)
-Laskee pinta-alan muodolle geometry(mikätahansa cpGeometry* (circle/segment/box))


Rungot

cpBodyNew(mass#,inertia#,x# = 0,y# = 0)
-luo uuden rungon jonka massa on mass# ja inertia on inertia# ja asettaa sen paikkaan (x#,y#)

cpBodyNewStatic(x# = 0,y# = 0)
-luo uuden staattisen rungon ja asettaa sen paikkaan (x#,y#)

cpApplyForce(body,fx#,fx#,px#,py#)
-Lisää rungolle (fx#,fy#) voiman, pisteestä rungon suhteen suhteellisesta pisteestä (px#,py#).

cpApplyImpulse(body,fx#,fx#,px#,py#)
-Lisää rungolle (fx#,fy#) impulssin, pisteestä rungon suhteen suhteellisesta pisteestä (px#,py#).

cpApplyTorque(body,torque#)
-Kääntää runkoa väännöllä torque#. Positiivinen torque# pyörittää myötäpäivään ja negatiivinen vastapäivään.


cpBodySetPos(body,x#,y#)
-Siirtää rungon body pisteeseen (x#,y#). Kutsu tämän jälkeen cpPushia, että muutokset päivittyvät fysiikkamoottorille.

cpBodySetAngle(body,ang#)
-Kääntää rungon body kulmaan ang#. Kutsu tämän jälkeen cpPushia, että muutokset päivittyvät fysiikkamoottorille.

cpBodyWorldToLocal(body,x#,y#)
-muuttaa maailmakoordinaatit rungon suhteellisiksi koordinaateiksi. Tallentaa muunnetut koordinaatit muuttujiin CP_GLOBAL_X ja CP_GLOBAL_Y

cpBodyLocalToWorld(body,x#,y#)
-muuttaa rungon suhteelliset koordinaatit maailmakoordinaateiksi. Tallentaa muunnetut koordinaatit muuttujiin CP_GLOBAL_X ja CP_GLOBAL_Y


Törmäysmuodot
cpShapeNew(body,geometry,layers = CP_LAYER_ALL,group = CP_NO_GROUP,offsetVecX# = 0,offsetVecY# = 0,friction# = 0.7,restitution# = 0.3)
-luo uuden muodon rungolle body. Käyttää muotona geometryä (kats. esim. cpCircleGeometry). Asettaa muodon kerrokselle layer ja omaan ryhmään group (Oletuksena omaan ryhmäänsä). Asettaa suhteelliseksi sijainniksi rungosta (offsetVecx#,offsetVecY#). Asettaa kitkaksi friction ja kimmoisuudeksi restitution.

cpShapeNewStatic(geometry,layers = CP_LAYER_ALL,group = CP_NO_GROUP,offsetVecX# = 0,offsetVecY# = 0,friction# = 0.7,restitution# = 0.3)
-luo uuden muodon ja liittää sen päästaattiseen runkoon. Kats. cpShapeNew.

cpShapeUnderPoint(x#,y#,layers = CP_LAYER_ALL,group = CP_NO_GROUP)
-Palautaa muodon (cpShape), joka on pisteen(x#,y#) alla. Etsintä suoritetaan kerroksilla layers ja ryhmässä group.


Liitokset

cpSlideJointNew(body1,body2,mimD#,maxD#,p1x#,p1y#,p2x#,p2y#
Luo uuden "sylinterin" body1 ja body2:n välille. Sen maksimipituus on maxD# ja minimi minD#. "Sylinteri" on liitetty body1:een kohdasta (p1x#,p1y#) (suhteellinen body1:n sijaintiin).

cpRotaryLimitJointNew(body1,body2,minR#,maxR#)
Luo rajoittimen kahden rungon kulmien erotukselle. Eli body1:n kulman ja body2:n kulman erotus pitää olla suurempi kuin minR ja pienempi kuin maxR#

cpPinJointNew(body1,body2,p1x#,p1y#,p2x#,p2y#)
Luo "tangon" body1:n ja body2:n välille, pisteestä (p1x#,p1y#) pisteeseen (p2x#,p2y#). Huomaa, että tagon pituus riippuu runkojen paikasta liitoksen teko hetkellä.


Törmäysten hakeminen

cpEnableContactGraph(enable)
-Valitsee tallennetaanko törmäyksiä. Oletuksena ei.

cpBodyGetArbiters(body)
-Palauttaa listan törmäyksistä. Mikäli törmäyksiä ei ole palautetaan nolla.

cpArbiterListSize(arbiterList)
-Palauttaa törmäyslistan koon eli montako törmäystä se sisältää.

cpArbiterListGet(arbiterList,i)
-Palauttaa törmäyslistasta i:nen törmäyksen(cpArbiter). Ensimmäisen jäsenen sijainti on 0, toisen 1 jne.

cpArbiterCountCollisionPoints(arbiter)
-Laskee montako törmäyspistettä törmäys sisältää ja palauttaa sen.

cpArbiterGetCollisionPointX(arbiter,i)
-Palauttaa törmäyksen arbiter i:nen törmäyspisteen x-sijainnin maailmakoordinaateissa.

cpArbiterGetCollisionPointY(arbiter,i)
-Palauttaa törmäyksen arbiter i:nen törmäyspisteen y-sijainnin maailmakoordinaateissa.

cpArbiterGetBody1(arbiter)
-Palauttaa rungon, joka törmäsi. Sama runko, mikä annettiin cpBodyGetArbiters funktiolle.


cpArbiterGetBody2(arbiter)
-Palauttaa rungon, johon cpBodyGetArbiters funktiolle annettu runko törmäsi.

cpArbiterGetShape1(arbiter)
-Palauttaa cpBodyGetArbiters funktiolle annetun rungon muodon, joka törmäsi.

cpArbiterGetShape2(arbiter)
-Palauttaa muodon johon cpBodyGetArbiters funktiolle annettu runko törmäsi.

cpDeleteArbiterList(arbiterlist)
-Poistaa törmäyslistan ja kaikki sen jäsenet. Muista tehdä tämä!!!

Raycasting

cpShapeUnderSegment(shape,x1,y1,x2,y2)
-Tarkistaa onko shape liivan (x1,y1):stä (x2,y2):een alla. Palauttaa 1 mikäli on ja 0 mikäli ei. Osuman normaalivektorin saa CP_GLOBAL_NORMAL_X:n ja CP_GLOBAL_NORMAL_Y:n avulla. Osumakohdan etäisyyden viivan alkupisteestä saa CP_GLOBAL_DISTANCE:sesta, jonka arvo on väliltä 0.0-1.0

cpSegmentQueryFirst(x1,y1,x2,y2,layers = -1,group = 0)
-Palauttaa ensimmäisen muodon(cpShape), johon viiva osuu. Mikäli yhtää muotoa ei ole viivalla palautetaan 0:lla. Osuman normaalivektorin saa CP_GLOBAL_NORMAL_X:n ja CP_GLOBAL_NORMAL_Y:n avulla. Osumakohdan etäisyyden viivan alkupisteestä saa CP_GLOBAL_DISTANCE:sesta, jonka arvo on väliltä 0.0-1.0

cpSegmentQuery(x1,y1,x2,y2,layers = CP_LAYERS_ALL,group = CP_NO_GROUP)
-Etsii kaikki muodot jotka ovat viivan (x1,y1):stä (x2,y2):een välillä. Palauttaa 0, jos yhtää muotoa ei ollut liivalla, muulloin palauttaa cpSegmentQueryResultin.

cpSegmentQueryResult
cpQueryCountHits(query)
-Palauttaa montako osumaa.

cpQueryGetShape(query,i)
-Palauttaa i:nen osutun muodon

cpQueryGetDistance(query,i)
-Palauttaa i:nen osuman osumakohdan etäisyyden viivan alkupisteestä. Palautettu luku on väliltä 0.0-1.0

cpQueryGetNormalX(query,i)
-Palauttaa i:nen osuman normaalivektorin x arvon.

cpQueryGetNormalY(query,i)
-Palauttaa i:nen osuman normaalivektorin y arvon.
Tarvitset modatun cb:n version, että tämä toimii. (Funktioraja...)
Attachments
cbChipmunk.zip
0.7.2
(199.19 KiB) Downloaded 731 times
Last edited by Latexi95 on Wed May 29, 2013 10:55 pm, edited 29 times in total.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbChipmunk 0.2 (Fysiikkakirjasto)

Post by MaGetzUb »

Härpäke pyörii läppärilläni ~20Fps.. Eipä tuosta yhdestä esimerkistä paljoa saa irti. Pitääpä kattoo jos itsekkin jaksaisi väsätä yhden. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
Peltsi
Active Member
Posts: 121
Joined: Thu Sep 30, 2010 12:16 pm

Re: cbChipmunk 0.2 (Fysiikkakirjasto)

Post by Peltsi »

Itellä FPS siinä n. 30. Hyvin näyttää toimivan ainakin tuon esimerkin perusteella. :D
User avatar
ukkeli
Active Member
Posts: 123
Joined: Thu Jan 28, 2010 9:01 pm

Re: cbChipmunk 0.2 (Fysiikkakirjasto)

Post by ukkeli »

Ehkä vähän epäselvä esimerkki, FPS oli 15-17. Mutta tämä on hyvä.
Tästä saa hyvän viikkokisan :D
...
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbChipmunk 0.2 (Fysiikkakirjasto)

Post by Latexi95 »

Juu... Jos fps on liian hidas koittakaa laittaa cpSetIterationsin avulla fysiikan päivitys kertoja vähän vähemmäksi se on nimittäin nyt 200(mikä on aivan liikaa...). Jos sen laittaa liian pieneksi palikat tahtovat mennä viivojen läpi...
EDIT:

Laitan seuraavaan versioon oletuksena iteraatioiden määrän 20:een.

EDIT:

Johtuiko heikko FPS varmasti fysiikkamoottorista? Minä tein tarkan päivitysajan laskennan, mutta en onnistunut saamaan varsinaiseen fysiikan päivitykseen kulumaan kuin 1ms (silloin kun törmätään, muuten (0.01ms)) vaikka silloinkin iteraatioiden määrä oli 10000.

EDIT:

Jaahah cb ei poistakkaan muistipaloja jotka luodaan funktiossa. Eli muistia vuotaa reippaasti. (Joskin cb taitaa kuitenkin poistaa ne ohjelman sammuessa.)

EDIT:

Tein kaikki dll:n kutsunnat käyttämään samoja muistipaloja. Niin muistia ei vuoda, ja muutenkin säästytään monelta MakeMemBlockilta. Toivottavasti se myös nopeuttaa toimintaa.

Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbChipmunk 0.3 (Fysiikkakirjasto)

Post by Latexi95 »

Uusi versio julkaistu. Nyt mukana ovat liitokset. Esimerkiksi vaihtui sivulta kuvattu auto.
EDIT:

Ensimmäisten tietojen mukaan nopeuteen tullut iso muutos. (parempaan suuntaa :D )

MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbChipmunk 0.3 (Fysiikkakirjasto)

Post by MaGetzUb »

Latexi95 wrote:Uusi versio julkaistu. Nyt mukana ovat liitokset. Esimerkiksi vaihtui sivulta kuvattu auto.
EDIT:

Ensimmäisten tietojen mukaan nopeuteen tullut iso muutos. (parempaan suuntaa :D )

Juu eli 60Fps pyörii nyt läppärilläni. Voisipa periaatteessa tehdä ny pienen 2D pelimoottorin.. :D
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: cbChipmunk 0.3 (Fysiikkakirjasto)

Post by MetalRain »

Hieno juttu että keksit käyttää samoja muistipaloja kokoajan! Nyt tällä saa todella mainioita pelejä aikaiseksi, kun vain jaksaisi tehdä. :D Tuo cpDrawSegmentinGeometry on muuten törkeän hidas. viivoja käyttämällä saisi paljon nopsemman. Tuhoaminen on aina niin kivaa niin tässäpä pientä esimakua tulevasta:

Code: Select all

Include "cbChipmunk.cb"

SCREEN 1024,768

Global SW, SH

SW = ScreenWidth()
SH = ScreenHeight()

Global tileGeometry, smalltileGeometry

tileGeometry = cpBoxGeometryNew(20,10)
smalltileGeometry = cpBoxGeometryNew(10,5)

Type tile  
    Field body
    Field shape
    Field broken
    Field w
    Field h
End Type

DrawToWorld ON

//Asetetaan painovoima
cpSetGravity(0,-200.0)

//20 fysiikan päivitystä per cpUpdate
cpSetIterations(20)

//Tehdään reunat
borderGeometry = cpBoxGeometryNew(SW,SH) //Ruudun koko
cpBorderNew(borderGeometry,10) //Tehdään reunat

alku:

h = (SH/12)

//luodaan tiilikasa
For y=0 To h
    r = RoundDown((h-y)/7)
    xp = ((y Mod 2) =0)*5
    For x=-r To r
        newTile(x*20.0001+xp,-(SH/2.0)+10+y*10.0001)
    Next x
    cpUpdate(1.0/60.0)
    cpWaitForUpdate()
    cpPullAll()
Next y


mang#=180.0

Repeat

    Text 10,10,"FPS:"+FPS()
    Text 10,50,"Ammu hiiren vasemmalla näppäimellä tiiliä ja räjäytä pommi oikealla."

    //päivitetään esineitä ennen cpUpdatea
    
    //ampuminen
    If MouseDown(1) And Timer()>shootTimer Then 
        t.tile = ConvertToType(newTile(mx#,my#,mang#))
        
        f# = 2500.0
        
        cpApplyImpulse(t\body,Cos(mang#)*f#,Sin(mang#)*f#,0,0)
        shootTimer = Timer()+100
    EndIf
    
    //pommi
    If MouseHit(2) Then 
    
        f# = 2000.0
    
        For t.Tile=Each Tile
        
            ang# = GetAngle(mx#,my#,PeekFloat(t\body,CP_INDEX_BODY_POS_X),PeekFloat(t\body,CP_INDEX_BODY_POS_Y))
            dis# = distance(mx#,my#,PeekFloat(t\body,CP_INDEX_BODY_POS_X),PeekFloat(t\body,CP_INDEX_BODY_POS_Y))
        
            If dis#<300 And dis# > 0.0 Then 
                f2# = Min((f#/dis#)^2,5000)
                cpApplyImpulse(t\body,Cos(ang#)*f2#,Sin(ang#)*f2#,0,0)
                If  (f2#>3000) And t\broken=0 Then t\broken=1 
            EndIf 

        Next t
        
        For t.Tile=Each Tile
            If t\broken=1 Then breakTile(ConvertToInteger(t))
        
        Next t
        
    EndIf

    cpUpdate(1.0/60.0) //Aloitetaan fysiikan päivitys. Päivitetään fysiikoita 1/60 sekuntia
    //Tämän jälkeen ei muokkauksia fysiikkaan
    
    mang# = mang# + MouseMoveZ()*15.0
    
    mx# = MouseWX()
    my# = MouseWY()
    
    Lock()
    
    Line mx#,my#,mx#+Cos(mang#)*30.0,my#+Sin(mang#)*30.0
    
    //piirretään tiilet
    For t.Tile=Each Tile
        
        cpBox2(PeekFloat(t\body,CP_INDEX_BODY_POS_X),PeekFloat(t\body,CP_INDEX_BODY_POS_Y),t\w,t\h,PeekFloat(t\body,CP_INDEX_BODY_ANGLE))
    
    Next t
    
    Unlock() 

    DrawScreen
    
    updateTime# = cpWaitForUpdate()//Odotetaan fysiikan päivittymistä...
    Text 10,30,"Updating physics took "+updateTime+"ms"
    
    cpPullAll() //Päivitetään sijainnit
Forever

Function breakTile(pointer)
    t.tile = ConvertToType(pointer)
    
    x#=PeekFloat(t\body,CP_INDEX_BODY_POS_X)
    y#=PeekFloat(t\body,CP_INDEX_BODY_POS_Y)
    a#=PeekFloat(t\body,CP_INDEX_BODY_ANGLE)
    
    For i=0 To 3
        newTile(x#+Cos(a#+45+i*90)*15.0,y#+Sin(a#+45+i*90)*15.0,a#,1)
    Next i
    
    //"poistetaan" body
    
    cpBodySetPos(t\body,SW,0)
    
    cpPush(t\body)
    
    Delete t

End Function 


Function newTile(x#,y#,a#=0.0,small=0)
    t.Tile = New (Tile)
    weight# = 3.0
    
    If small Then 
        geo = smalltileGeometry 
        t\broken=2 
        t\w=10
        t\h=5
    Else 
        geo = tileGeometry
        t\w=20
        t\h=10
    EndIf 
    
    t\body = cpBodyNew(weight#,cpMomentForGeometry(geo,weight#),x#,y#)

    t\shape = cpShapeNew(t\body,geo,-1,0,0,0,0.7,0.3)
    
    cpBodySetAngle(t\body,a#)
    cpPush(t\body)
    
    Return ConvertToInteger(t)
End Function 

Function Box2(x#,y#,w#,h#,ang#)
    p1x# = x#+Cos(ang#)*w*0.5+Cos(ang#+90)*h*0.5
    p1y# = y#+Sin(ang#)*w*0.5+Sin(ang#+90)*h*0.5
    
    p2x# = p1x-Cos(ang#)*w
    p2y# = p1y-Sin(ang#)*w
    
    p3x# = p2x+Cos(ang#+270)*h
    p3y# = p2y+Sin(ang#+270)*h
    
    p4x# = p3x+Cos(ang#)*w
    p4y# = p3y+Sin(ang#)*w
    
    Line p1x,p1y,p2x,p2y
    Line p2x,p2y,p3x,p3y
    Line p3x,p3y,p4x,p4y
    Line p4x,p4y,p1x,p1y
EndFunction
Mutta mikä tästä kirjastosta vielä selkeästi puuttuu on mahdollisuus ottaa tilanne alusta. Bodyjä ja Shapeja ei saa poistettua dll:n päivityslistalta joten fysiikka esineiden poisto ei onnistu. Joissakin tilanteissa voisi myös ajatella että esinettä päivitetään vain hetkittäin. Esimerkiksi kauas ruudun ulkopuolelle jääviä esineitä ei kannata päivittää fysiikoiden suhteen (tai muutenkaan) etenkin jos ne ovat suht levossa.

EDIT: Päivitin esimerkin versiolle 0.4
Last edited by MetalRain on Thu Aug 04, 2011 7:52 am, edited 8 times in total.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbChipmunk 0.3 (Fysiikkakirjasto)

Post by Latexi95 »

MetalRain wrote:Hieno juttu että keksit käyttää samoja muistipaloja kokoajan! Nyt tällä saa todella mainioita pelejä aikaiseksi, kun vain jaksaisi tehdä. :D

Tuo cpDrawSegmentinGeometry on muuten törkeän hidas. Tämä huomattiin ensimmäisessä esimerkissäsi, joten päätin tehdä siitä nopeamman.

Code: Select all

Function cpDrawSegmentGeometry(segment,offsetX# = 0,offsetY# = 0)
    h# = PeekFloat(segment,17)
    x# = PeekFloat(segment,1)+offsetX
    y# = PeekFloat(segment,5)+offsetY
    x2# = PeekFloat(segment,9)+offsetX
    y2# = PeekFloat(segment,13)+offsetY
    
    ang# = GetAngle(x1#,-y1#,x2#,-y2#)

    cyh# = Cos(ang#+90.0)* h# 
    syh# = Sin(ang#+90.0)* h#

    p1x# = x#+cyh#
    p1y# = y#+syh#
    
    p2x# = x2#+cyh#
    p2y# = y2#+syh#

    p3x# = x2#-cyh#
    p3y# = y2#-syh#
    
    p4x# = x#-cyh#
    p4y# = y#-syh#

    trifiller(p1x,p1y,p2x,p2y,p3x,p3y)
    trifiller(p1x,p1y,p4x,p4y,p3x,p3y)

    Circle x#-h#, y#+h#,h#*2.0,1
   
    Circle x2#-h#,y2#+h#,h#*2.0,1

EndFunction

Function trifiller(x1,y1,x2,y2,x3,y3) 'kolmion kärkipisteet p1, p2, p3
   'järjestetään pisteet y koordinaatin perusteella
   If y2<y1 Then 'jos p2 on ylempänä kuin p1 vaihdetaan niiden paikkaa
       tmp=y1
       y1=y2
       y2=tmp
       
       tmp=x1
       x1=x2
       x2=tmp
   EndIf
   
   If y3<y1 Then 'jos p3 on ylempänä kuin p1 vaihdetaan niiden paikkaa
       tmp=y1
       y1=y3
       y3=tmp
       
       tmp=x1
       x1=x3
       x3=tmp
   EndIf
   
   If y3<y2 Then 'jos p3 on lempänä kuin p2 vaihdetaan niiden paikkaa
       tmp=y2
       y2=y3
       y3=tmp
       
       tmp=x2
       x2=x3
       x3=tmp
   EndIf
   
   'pisteet ovat nyt järjestyksessä
   'ylhäältä alas p1(x1,y1), p2(x2,y2), p3(x3,y3)
   
   dy1=y2-y1'pystysuora matka p1:sta p2:seen
   dx1=x2-x1'vaakasuora matka p1:sta p2:seen
   
   dy2=y3-y1'pystysuora matka p1:sta p3:meen
   dx2=x3-x1'vaakasuora matka p1:sta p3:meen
   
   If dy1 Then 'jos kolmion yläosa on pidempi kuin 0
       'käydään läpi kaikki vaakaviivat kolmion yläosassa(p1-p2)
       For i = y1 To y2
           'lasketaan seuraava x-koordinaatti p1:stä p2:seen
           ax=x1+((i-y1)*dx1)/dy1
           'lasketaan seuraava x-koordinaatti p1:stä p3:meen
           bx=x1+((i-y1)*dx2)/dy2
           
           Line ax,i,bx,i 'piirretään viiva kolmion reunojen välille
       Next i
   EndIf
   
   dy1=y3-y2'pystysuora matka p2:sta p3:meen
   dx1=x3-x2'vaakasuora matka p2:sta p3:meen
   
   If dy1 Then 'jos kolmion alaosa on pidempi kuin 0
       'käydään läpi kaikki vaakaviivat kolmion alaosassa(p2-p3)
       For i = y2 To y3
           'lasketaan seuraava x-koordinaatti p2:stä p3:meen
           ax=x2+((i-y2)*dx1)/dy1
           'lasketaan seuraava x-koordinaatti p1:stä p3:meen
           bx=x1+((i-y1)*dx2)/dy2
           
           Line ax,i,bx,i 'piirretään viiva kolmion reunojen välille
       Next i
   EndIf
End Function
Juu parannukset otetaan aina vastaan, mutta tämä ei tunnu toimivan maailmakoordinaateissa. Tästä varmaan pitäisi tehdä maailmakoordinaateissa toimiva versio.¨


MetalRain wrote:Ja koska tuhoaminen on aina niin kivaa niin tässäpä pientä esimakua tulevasta:

Code: Select all

Include "cbChipmunk.cb"

SCREEN 1024,768

Global SW, SH

SW = ScreenWidth()
SH = ScreenHeight()

Global tileGeometry

tileGeometry = cpBoxGeometryNew(20,10)

Type tile  
    Field body
    Field shape
End Type

DrawToWorld ON

//Asetetaan painovoima
cpSetGravity(0,-200.0)

//20 fysiikan päivitystä per cpUpdate
cpSetIterations(20)

//Tehdään reunat
borderGeometry = cpBoxGeometryNew(SW,SH) //Ruudun koko
cpBorderNew(borderGeometry,10) //Tehdään reunat

alku:

h = (SH/12)

//luodaan tiilikasa
For y=0 To h
    r = RoundDown((h-y)/7)
    xp = ((y Mod 2) =0)*5
    For x=-r To r
        newTile(x*20.0001+xp,-(SH/2.0)+10+y*10.0001)
    Next x
    cpUpdate(1.0/60.0)
    cpWaitForUpdate()
    cpPullAll()
Next y


mang#=180.0

Repeat

    Text 10,10,"FPS:"+FPS()
    Text 10,50,"Ammu hiiren vasemmalla näppäimellä tiiliä ja räjäytä pommi oikealla."

    //päivitetään esineitä ennen cpUpdatea
    
    //ampuminen
    If MouseDown(1) And Timer()>shootTimer Then 
        t.tile = ConvertToType(newTile(mx#,my#))
        
        f# = 2500.0
        
        cpApplyImpulse(t\body,Cos(mang#)*f#,Sin(mang#)*f#,0,0)
        shootTimer = Timer()+100
    EndIf
    
    //pommi
    If MouseHit(2) Then 
    
        f# = 2000.0
    
        For t.Tile=Each Tile
        
            ang# = GetAngle(mx#,my#,PeekFloat(t\body,CP_INDEX_BODY_POS_X),PeekFloat(t\body,CP_INDEX_BODY_POS_Y))
            dis# = distance(mx#,my#,PeekFloat(t\body,CP_INDEX_BODY_POS_X),PeekFloat(t\body,CP_INDEX_BODY_POS_Y))
        
            If dis#<300 And dis# > 0.0 Then 
                f2# = Min((f#/dis#)^2,5000)
                cpApplyImpulse(t\body,Cos(ang#)*f2#,Sin(ang#)*f2#,0,0)
            EndIf 

        Next t
        
    EndIf

    cpUpdate(1.0/60.0) //Aloitetaan fysiikan päivitys. Päivitetään fysiikoita 1/60 sekuntia
    //Tämän jälkeen ei muokkauksia fysiikkaan
    
    mang# = mang# + MouseMoveZ()*15.0
    
    mx# = MouseWX()
    my# = MouseWY()
    
    Lock()
    
    Line mx#,my#,mx#+Cos(mang#)*30.0,my#+Sin(mang#)*30.0
    
    //piirretään tiilet
    For t.Tile=Each Tile
        
        Box2(PeekFloat(t\body,CP_INDEX_BODY_POS_X),PeekFloat(t\body,CP_INDEX_BODY_POS_Y),20,10,PeekFloat(t\body,CP_INDEX_BODY_ANGLE))
    
    Next t
    
    Unlock() 

    DrawScreen
    
    updateTime# = cpWaitForUpdate()//Odotetaan fysiikan päivittymistä...
    Text 10,30,"Updating physics took "+updateTime+"ms"
    
    cpPullAll() //Päivitetään sijainnit
Forever


Function newTile(x#,y#)
    t.Tile = New (Tile)
    weight# = 3.0
    t\body = cpBodyNew(weight#,cpMomentForGeometry(tileGeometry,weight#),x#,y#)
    t\shape = cpShapeNew(t\body,tileGeometry,-1,0,0,0,0.7,0.3)
    Return ConvertToInteger(t)
End Function 

Function Box2(x#,y#,w#,h#,ang#)
    p1x# = x#+Cos(ang#)*w*0.5+Cos(ang#+90)*h*0.5
    p1y# = y#+Sin(ang#)*w*0.5+Sin(ang#+90)*h*0.5
    
    p2x# = p1x-Cos(ang#)*w
    p2y# = p1y-Sin(ang#)*w
    
    p3x# = p2x+Cos(ang#+270)*h
    p3y# = p2y+Sin(ang#+270)*h
    
    p4x# = p3x+Cos(ang#)*w
    p4y# = p3y+Sin(ang#)*w
    
    Line p1x,p1y,p2x,p2y
    Line p2x,p2y,p3x,p3y
    Line p3x,p3y,p4x,p4y
    Line p4x,p4y,p1x,p1y
EndFunction
Aivan upea tekele. :D En olekkaan itse vielä kunnolla ehtinyt kokeilla mihin kaikkeen tällä oikein pystyykään.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbChipmunk 0.3 (Fysiikkakirjasto)

Post by MaGetzUb »

Esimerkkini:

Code: Select all

Include "cbChipmunk.cb"

Const SW = 1024
Const SH = 768

Type Boxes
    Field Body
    Field Shape 
    Field BodyW
    Field BodyH
EndType 


DrawToWorld ON

SCREEN SW, SH

cpSetGravity(0,-230.0)


cpSetIterations(20)

borderGeometry = cpBoxGeometryNew(SW,SH)
cpBorderNew(borderGeometry,10)

Repeat 

   Text 10, 15, "Luo laatikko painamalla hiiren vasempaa nappia pohjassa, ja vetämällä hiirtä."
    If MouseHit(1) Then 
        dnewbox = True   
        sx = MouseWX()
        sy = MouseWY()
    EndIf 

    If dnewbox Then 
        Box2(sx+(MouseWX()-sx)/2, sy+(MouseWY()-sy)/2, MouseWX()-sx, MouseWY()-sy, 0)
    EndIf 
    
    If MouseUp(1) And dnewbox = True Then 
        dnewbox = False 
        BoxW = Abs(MouseWX() - sx)
        BoxH = Abs(MouseWY() - sy)
        centx# = sx + (MouseWX()-sx)/2
        centy# = sy + (MouseWY()-sy)/2
        NewBox(centx#, centy#, boxW, boxH)
    EndIf 
    
    
    cpUpdate(1.0/60.0)
    
    Lock 
    For bx.Boxes = Each Boxes
        Box2(PeekFloat(bx\body,CP_INDEX_BODY_POS_X),PeekFloat(bx\body,CP_INDEX_BODY_POS_Y),bx\bodyW,bx\bodyh,PeekFloat(bx\body,CP_INDEX_BODY_ANGLE))
    Next bx
    Unlock 
    
    updateTime# = cpWaitForUpdate()//Odotetaan fysiikan päivittymistä...
    Text 10,30,"Updating physics took "+updateTime+"ms"    
    cpPullAll()

DrawScreen
Forever 

Function NewBox(x#, y#, w, h)
    weight# = (w+h)/2
    bx.Boxes = New(Boxes)
    bx\BodyW = w
    bx\BodyH = h
    geom = cpBoxGeometryNew(w,h)
    bx\body = cpBodyNew(weight#,cpMomentForGeometry(geom,weight#), x#, y#)
    bx\shape = cpShapeNew(bx\body,geom,-1,0,0,0,0.7,0.3)
EndFunction 

Function Box2(x#,y#,w#,h#,ang#)
    p1x# = x#+Cos(ang#)*w*0.5+Cos(ang#+90)*h*0.5
    p1y# = y#+Sin(ang#)*w*0.5+Sin(ang#+90)*h*0.5
    
    p2x# = p1x-Cos(ang#)*w
    p2y# = p1y-Sin(ang#)*w
    
    p3x# = p2x+Cos(ang#+270)*h
    p3y# = p2y+Sin(ang#+270)*h
    
    p4x# = p3x+Cos(ang#)*w
    p4y# = p3y+Sin(ang#)*w
    
    Line p1x,p1y,p2x,p2y
    Line p2x,p2y,p3x,p3y
    Line p3x,p3y,p4x,p4y
    Line p4x,p4y,p1x,p1y
EndFunction
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbChipmunk 0.4 (Fysiikkakirjasto)

Post by Latexi95 »

Uutta versiota. Tällä kertaa tuli lisää hyödyllisiä funktioita. Kaikkeja en ole dokumentoinnut aloitusviestiin, koska A:en ehdi B: en jaksa, mutta jos jossain vaiheessa saisin kaikki ne kirjoiteltua. Jos mietityttää joku funktio niin saa kysyä.

Niin ja funktioraja tuli täyteen. Että modattu cb koneelle, ennen kuin kannattaa alkaa kokeilemaan. :D
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbChipmunk 0.4 (Fysiikkakirjasto)

Post by MaGetzUb »

Uusimman version koodi huutaa ilkeästi MemCopy failed!:ia, etkai ole vaihtanut mitään radikaalisti cbChipMunk.cbn sisällä?
EDIT:

MetalRain wrote:Hieno juttu että keksit käyttää samoja muistipaloja kokoajan!
Offtopic: Tällätavalla voisi varmaan saada boostattua kaikki nykyiset DLL härpäkkeet? cbNetwork, cbGl, cbSDL, ja sitten nämä uudemmat. :D[/edit]
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: cbChipmunk 0.4 (Fysiikkakirjasto)

Post by legend »

Tämä on avain käsittämättömän hieno :o Varsinkin MetalRainin ja MaGetzUbin esimerkit. Tämä pitäisi jo liittää coolbasicin etusivulle lisämateriaaliin.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbChipmunk 0.4 (Fysiikkakirjasto)

Post by Latexi95 »

legend wrote:Tämä on avain käsittämättömän hieno :o Varsinkin MetalRainin ja MaGetzUbin esimerkit. Tämä pitäisi jo liittää coolbasicin etusivulle lisämateriaaliin.
Kiitos.

MaGetzUb wrote:Uusimman version koodi huutaa ilkeästi MemCopy failed!:ia, etkai ole vaihtanut mitään radikaalisti cbChipMunk.cbn sisällä?
Missä tilanteessa tälläinen tapahtuu? Olen kyllä, muuttanut vaikka mitä... :D Niin, missä tilanteessa? Jossain MemCopylle annetaan väärät parametrit... Itselläni ainakaan esimerkit eivät aiheuta moista.
EDIT:

Juu nyt paikansin itsekkin virheen. cpPivotJointNew aiheuttaa sen. Pitää vaan nyt lähteä ostamaan kirjoja lukiota varten. Korjaan se kun palaan.
Edit2: Jaahah... Virhe olikin omassa testikoodissani. :oops:

EDIT:

MaGetzUbin ongelma vaikuttaa jonkunlaiselta laitteisto kohtaiselta ongelmalta.

User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: cbChipmunk 0.4 (Fysiikkakirjasto)

Post by MetalRain »

Nyt kun virheistä tuli puhe niin enpä saanut tuota poistoa (cpDeleteä) toimimaan esimerkissäni, enpä sitten tiedä miksi.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbChipmunk 0.5 (Fysiikkakirjasto)

Post by Latexi95 »

MetalRain wrote:Nyt kun virheistä tuli puhe niin enpä saanut tuota poistoa (cpDeleteä) toimimaan esimerkissäni, enpä sitten tiedä miksi.
Kiitos ilmoituksesta. Ongelma paikallistettu ja korjattu.

Joten uuden version julkaisun aika. Tällä kertaa mukaan tulivat polygonit. Sääli vaan, että Chipmunkissa polygonien täytyy olla kuperia, mikä rajoittaa aika lailla niiden käyttöä. No voihan tietysti aina käyttää useampaa. :D
Esimerkki sisältää nyt myös hiirellä tapahtuvan liikuttelun.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbChipmunk 0.5 (Fysiikkakirjasto)

Post by MaGetzUb »

Vaihdoin käsin MemCopy:n Poke & Peek funktioiksi, tämä valittaa nyt Memory Access Violationia. :D

Code: Select all

Function cpPullAll()
    CallDLL CP_DLL_PATH,"pullall",0,CP_IN_MEMBLOCK
    index = 0
    For i = 1 To CP_DYNAMIC_BODY_COUNT
        body = PeekInt(CP_IN_MEMBLOCK,index)
        Text 0, i*15, body
        PokeInt body, 5, PeekInt(CP_IN_MEMBLOCK, 5)
        PokeInt body, 9, PeekInt(CP_IN_MEMBLOCK, 9)
        PokeInt body, 13, PeekInt(CP_IN_MEMBLOCK, 13)
        PokeInt body, 17, PeekInt(CP_IN_MEMBLOCK, 17)
        PokeInt body, 21, PeekInt(CP_IN_MEMBLOCK, 21)
        PokeInt body, 25, PeekInt(CP_IN_MEMBLOCK, 25)
        index = index + 28
    Next i
    
EndFunction
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbChipmunk 0.5 (Fysiikkakirjasto)

Post by Latexi95 »

MaGetzUb wrote:Vaihdoin käsin MemCopy:n Poke & Peek funktioiksi, tämä valittaa nyt Memory Access Violationia. :D

Code: Select all

Function cpPullAll()
    CallDLL CP_DLL_PATH,"pullall",0,CP_IN_MEMBLOCK
    index = 0
    For i = 1 To CP_DYNAMIC_BODY_COUNT
        body = PeekInt(CP_IN_MEMBLOCK,index)
        Text 0, i*15, body
        PokeInt body, 5, PeekInt(CP_IN_MEMBLOCK, 5)
        PokeInt body, 9, PeekInt(CP_IN_MEMBLOCK, 9)
        PokeInt body, 13, PeekInt(CP_IN_MEMBLOCK, 13)
        PokeInt body, 17, PeekInt(CP_IN_MEMBLOCK, 17)
        PokeInt body, 21, PeekInt(CP_IN_MEMBLOCK, 21)
        PokeInt body, 25, PeekInt(CP_IN_MEMBLOCK, 25)
        index = index + 28
    Next i
    
EndFunction
Juu... Nimittäin tuossa on virhe... Tässä toimiva:

Code: Select all

Function cpPullAll()
    CallDLL CP_DLL_PATH,"pullall",0,CP_IN_MEMBLOCK
    index = 0
    For i = 1 To CP_DYNAMIC_BODY_COUNT
        body = PeekInt(CP_IN_MEMBLOCK,index)
        Text 0, i*15, body
        PokeFloat body, 5, PeekFloat(CP_IN_MEMBLOCK, index + 4)
        PokeFloat body, 9, PeekFloat(CP_IN_MEMBLOCK,index +  8)
        PokeFloat body, 13, PeekFloat(CP_IN_MEMBLOCK, index + 12)
        PokeFloat body, 17, PeekFloat(CP_IN_MEMBLOCK, index + 16)
        PokeFloat body, 21, PeekFloat(CP_IN_MEMBLOCK, index + 20)
        PokeFloat body, 25, PeekFloat(CP_IN_MEMBLOCK, index + 24)
        index = index + 28
    Next i
    
EndFunction

Siis MaGetzUb koittaa ratkaista outoa bugia, joka jostain syystä esiintyy vain hänelle. (tiedoksi vain muille, että tällä on turha vaihtaa cbChipmunkin vakio cpPullAllia...)
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: cbChipmunk 0.5 (Fysiikkakirjasto)

Post by MetalRain »

Latexi95 wrote:
MetalRain wrote:Nyt kun virheistä tuli puhe niin enpä saanut tuota poistoa (cpDeleteä) toimimaan esimerkissäni, enpä sitten tiedä miksi.
Kiitos ilmoituksesta. Ongelma paikallistettu ja korjattu.

Joten uuden version julkaisun aika. Tällä kertaa mukaan tulivat polygonit. Sääli vaan, että Chipmunkissa polygonien täytyy olla kuperia, mikä rajoittaa aika lailla niiden käyttöä. No voihan tietysti aina käyttää useampaa. :D
Esimerkki sisältää nyt myös hiirellä tapahtuvan liikuttelun.
Eipähän ainakaan tuo uusi versio sitä korjannut. MAVittaa kun koittaa jotakin shapea tai bodyä poistaa.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbChipmunk 0.5 (Fysiikkakirjasto)

Post by MaGetzUb »

Latexi95: Jos tuo Pokeiksi vaihto olisi toiminut edes väärällä tyylillä, niin tuo sinunki koodi olisi toiminut.. Mutta silti se heittää Mavia... God dang it! D:
EDIT:

Ongelma ratkaistu! Tuo sinun msvcr100.dll tiedosto oli epäkelpo! :)

Last edited by MaGetzUb on Sat Aug 06, 2011 12:06 pm, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Post Reply