Hm... Ai jaa... Minä luulin korjanneeni ongelman... Ainakin tuon minun esimerkkini auton voi poistaa ilman mavia. Ei kun niin unohdin testata MAVaako sitten sen jälkeen cpUpdate tai cpPullAll... Olen nyt mökillä... Korjaan ongelman ensiviikolla.MetalRain wrote: Eipähän ainakaan tuo uusi versio sitä korjannut. MAVittaa kun koittaa jotakin shapea tai bodyä poistaa.
cbChipmunk 0.7.2 (Fysiikkakirjasto)
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
Minulle tulee ensimmäisenä mieleen, että DLL saattaa olla tarkoitettu 64-bittiselle Windowsille, jolloin se ei toimi, jos sinulla on 32-bittinen Windows.MaGetzUb wrote:Kuten edellisellä sivulla edittasin, niin: Sain ongelman ratkaistua paketissasi oleva MSVCR100.dll oli epäkelpo tietokoneeni kanssa. Se voi aiheuttaa muillakin ongelmia. Joten etsikää jostain vanhempi MSVCR.dll tiedosto.
Voitot: Viikkokisa XIII, Pikapelikisa 3, Pikapelikisa 13
http://www.sami345.tk/
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
Pöytäkoneellani valitti ettei ole kelvollinen Windows NT vedos tai jotain sinnepäin, läppärilläni on Windows 7 64, ja tällä ohjelma ilmoitti vain että MemCopy failed.Sami345 wrote:Minulle tulee ensimmäisenä mieleen, että DLL saattaa olla tarkoitettu 64-bittiselle Windowsille, jolloin se ei toimi, jos sinulla on 32-bittinen Windows.MaGetzUb wrote:Kuten edellisellä sivulla edittasin, niin: Sain ongelman ratkaistua paketissasi oleva MSVCR100.dll oli epäkelpo tietokoneeni kanssa. Se voi aiheuttaa muillakin ongelmia. Joten etsikää jostain vanhempi MSVCR.dll tiedosto.
Päivitetty aikaisempi esimerkkini, nyt voit grabata ja heitellä laatikoita (koodi oikeastaan kylmästi kopsattu Latexi:n esimerkistä, en jaksanut paneutua noihin funktioihin.) ja niitä voi myös poistaa. Mutta tämä "poistaminen" tuntuu vain poistavan loodilta törmäykset ja päästävän ne kentän laitojen lävitse. ;O
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)
mouseBody = cpBodyNewStatic()
Repeat
Text 10, 15, "Luo laatikko painamalla hiiren vasempaa nappia pohjassa, ja vetämällä hiirtä."
Text 10, 30, "Vedä laatikoita hiiren oikealla näppäimellä."
Text 10, 45, "Vie hiiri laatikon päälle ja paina D poistaaksesi sen."
If MouseHit(2) Then
shape = cpShapeUnderPoint(MouseWX(),MouseWY())
If (shape) Then
body = PeekInt(shape,CP_INDEX_SHAPE_OWNER)
cpBodyWorldToLocal(body,MouseWX(),MouseWY())
spring = cpPivotJointNew(mouseBody,body,0,0,CP_GLOBAL_X,CP_GLOBAL_Y)
EndIf
EndIf
cpBodySetPos(mouseBody,MouseWX(),MouseWY())
cpPush(mouseBody)
If MouseUp(2) Then
If spring Then
cpDelete(spring)
spring = 0
EndIf
EndIf
If KeyHit(cbkeyd) Then
shape = cpShapeUnderPoint(MouseWX(),MouseWY())
If shape Then
cpDelete(shape)
EndIf
EndIf
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,60,"Updating physics took "+updateTime+"ms"
For bx.Boxes = Each Boxes
cpPull(bx\body)
Next bx
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
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
Villi veikkaus... Johtuisiko tuo laatikoiden jääminen siitä että ainoastaan laatikoiden shape poistetaan, mutta kokoelman jäsen jää vielä kummittelemaan ja siksi piirretään?MaGetzUb wrote:EDIT:Päivitetty aikaisempi esimerkkini, nyt voit grabata ja heitellä laatikoita (koodi oikeastaan kylmästi kopsattu Latexi:n esimerkistä, en jaksanut paneutua noihin funktioihin.) ja niitä voi myös poistaa. Mutta tämä "poistaminen" tuntuu vain poistavan loodilta törmäykset ja päästävän ne kentän laitojen lävitse. ;O
[/edit]Code: Select all
KOODIA...
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
Niinpä tietysti, mutta nyt en kyllä jaksa korjata koodia. Ja turha kenenkään muunkaan on tuota koodia lähteä korjaamaan puolestani, haluan sen korjata sitten kun huvittaa.Kumiankka wrote:Villi veikkaus... Johtuisiko tuo laatikoiden jääminen siitä että ainoastaan laatikoiden shape poistetaan, mutta kokoelman jäsen jää vielä kummittelemaan ja siksi piirretään?MaGetzUb wrote:EDIT:Päivitetty aikaisempi esimerkkini, nyt voit grabata ja heitellä laatikoita (koodi oikeastaan kylmästi kopsattu Latexi:n esimerkistä, en jaksanut paneutua noihin funktioihin.) ja niitä voi myös poistaa. Mutta tämä "poistaminen" tuntuu vain poistavan loodilta törmäykset ja päästävän ne kentän laitojen lävitse. ;O
[/edit]Code: Select all
KOODIA...
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
No vaihdoin sen Chipmunkiin... Kiitos vain ideasta. C:llä tehty kirjasto onkin paljon helpompi tehdä cb:llä toimivaksi kuin c++:lla. Ei vaadi niin suurta muokkausta.JATothrim wrote:Wut. näin Projektit osiossa vain "cbChipmunk" ja ihmettelin mihin se Box2D oli jo syväjäätynyt.
MetalRain: Oletko varma, että virhe on cbChipmunkissa, kun kyllä muilla tuntuu cpDelete toimivan. Huomasithan, että ohjeissa mainitaan, että cpBodyn poistaminen poistaa kaikki siinä kiinni olevat shapet ja liitokset. Koitatko poistaa jo poistetun? Jos vika ei tunnu löytyvän niin laita vaikka yv:nä koodi minulle niin voin koittaa paikallistaa vian.
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
http://www.dll-files.com/pop.php?dll=msvcr100
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
Re: cbChipmunk 0.5 (Fysiikkakirjasto)
Juu. DLL poistaa kyllä kaiken itse minkä on varannutkin, ja cb hoitaa oman osuutensa. (en ole ainakaan itse löytänyt varsinaista vikaa koodissa) Minulla kyllä cpDelete tuntuu toimivan. Toiminta on tälläinen: cpDelete ilmoittaa dll:e mikä poistetaan. DLL tarkistaa mitkä asiat on sidottu siihen ja pitää poistaa sen kanssa (cpBodyn cpShapet ja cpConstraintit) ja tekee niistä listan. DLL poistaa kaikki listalla olevat ja laittaa sitten listan cb:n muistipalojen osoitteista joiden dll:n puoleiset osat on poistettu ja sitten cb poistaa kaikki muistipalat jotka dll sille ilmoitti.JATothrim wrote:Itselläni cpDelete tuntui toimivan satunnaisesti, välillä ei ongelmia, välillä MAVaa. Esim. "Wait 1" cpDelete:n jälkeen saattoi korjata MAVin. DLL:n kanssa pitää muistaa, että muistin varauset/vapautukset eivät saa ylittää DLL:n rajapintaa. (jos varataan DLL:n puolella, myös vapautetaan DLL:n puolella)
Re: cbChipmunk 0.5.1 (Fysiikkakirjasto)
Re: cbChipmunk 0.5.1 (Fysiikkakirjasto)
Re: cbChipmunk 0.5.1 (Fysiikkakirjasto)
Kiitos. Juuri tätä tarvitsinkin, että jaksoin uhrata muutaman tunnin inhottavan virheen etsintään. Nyt luulen (monennenkohan kerran), että virhe on vihdoin saatu paikattua. Säädin muutamaa asiaa ja lisäsin puuttuneen CP_DYNAMIC_BODY_COUNTin vähennyksen ja alkoi taas toimia. Lisäksi keksin mistä johtui mysteerinen PeekByte failed joka esiintyi silloin tällöin. Se johtui siitä, että jollakin funktiolla (yleensä cpShapeUnderPointilla) saatiin muoto, joka on staattinen ja näin ollen lisätty vakio staattiseen runkoon, mitä ei cb:n puolella ole olemassa(siis muistipalaa ei ole). Joten tein siten, että tälläisten staattisten muotojen omistajan osoite (CP_INDEX_SHAPE_OWNER) on CP_MAIN_STATIC_BODY (eli -1) tällä voit tarkistaa, että et muokkaa olematonta muistipalaa. Testi jota käytin toiminnan testaamiseen löytyy aloitusviestissä olevasta uudesta paketista. Testissä on myös koodinpätkä, josta selviää mitä tuo edellinen selitykseni staattisista muodoista käytännössä tarkoittaa.Substance wrote:Runkoja poistettaessa yksi cpDelete ei vielä anna virheilmoitusta, mutta näyttäisi sotkevan tai poistavan jonkun sen jälkeen luodun rungon tietoja, muutaman kerran jälkeen cpDelete antaa MemCopy failedin(epäsuorasti varmaankin, koska itse funktiossa ei käytetä MemCopyä) :[. btw, mahtava projekti, toivottavasti saat tämän korjattua .
Edit:Niin se PeekByte failed oli sen takia mysteerinen, että koko koodi ei käyttänyt kertaakaan PeekByteä...
Edit2:Niin muuten... Kellään mitään tietoa, kuinka chipmunkin Bodyjen nukkuminen saadaan toimintaan? Maaginen koodin pätkä "cpSpaceSetSleepTimeThreshold(&mSpace,0.5f);" on kyllä laitettuna, mutta se ei tunnu auttavan. Kuten huomaattekin tuosta samaisesta testikoodinpätkästä (sinne pitäisi tulle teksti "body is sleeping..." jos runko "nukkuu").
Edit3:Tein esimerkin siitä, kuinka on mahdollista tehdä partikkelivettä:
Code: Select all
Include "cbChipmunk.cb"
Const particleMass = 0.3
Const PARTICLE_HALF_SIZE = 1
Const PARTICLE_FULL_SIZE = 2
Type particles
Field body
Field shape
Field r
Field g
Field b
EndType
Global PCR As Float,PCG As Float,PCB As Float,particleGeometry,particleCount
particleGeometry = cpCircleGeometryNew(PARTICLE_HALF_SIZE,0)
SCREEN 800,600
cpSetGravity(0,-300)
borderGeometry = cpBoxGeometryNew(800,600)
cpBorderNew(borderGeometry,5)
segmentGeometry = cpSegmentGeometryNew(-200,-100,250,-50,5)
segmentShape = cpShapeNewStatic(segmentGeometry)
DrawToWorld ON
ClsColor cbWhite
lastUpdate = Timer()
Repeat
Color 0,0,0
updateTime# = cpWaitForUpdate()//Odotetaan fysiikan päivittymistä...
Text 10,0,"Particles:"+particlecount
Text 10,10,"FPS:"+FPS()
Text 10,30,"Updating physics took "+updateTime#+"ms"
cpPullAll()
If MouseDown(1) Then
AddParticle(MouseWX(),MouseWY())
ElseIf MouseDown(2)
RemoveParticlesInRadius(MouseWX(),MouseWY(),10)
ElseIf MouseHit(3)
Explosion(MouseWX(),MouseWY(),70)
EndIf
cpUpdate(Float(Timer()-lastUpdate)/1000.0) //Aloitetaan fysiikan päivitys. Päivitetään fysiikoita 1/60 sekuntia
//Tämän jälkeen ei muokkauksia fysiikkaan¨
lastUpdate = Timer()
cpDrawSegmentGeometry(segmentGeometry)
For particle.particles = Each particles
Color particle\r,particle\g,particle\b
Box PeekFloat(particle\body,CP_INDEX_BODY_POS_X)-PARTICLE_HALF_SIZE,PeekFloat(particle\body,CP_INDEX_BODY_POS_Y)-PARTICLE_HALF_SIZE,PARTICLE_FULL_SIZE,PARTICLE_FULL_SIZE
Next particle
DrawScreen
Forever
Function AddParticle(x,y)
For i = 1 To 10
particle.particles = New(particles)
particle\body = cpBodyNew(particleMass,0.0001,x+Rand(-2,2),y+Rand(-2,2))
particle\shape = cpShapeNew(particle\body,particleGeometry,-1,0,0,0,0.0000001,0.3)
particle\r = PCR
particle\g = PCG
particle\b = PCB
PCR + 0.3
PCG + 0.2
PCB + 0.1
If PCR > 255 Then PCR = 30
If PCG > 255 Then PCG = 30
If PCB > 255 Then PCB = 30
particleCount + 1
Next i
EndFunction
Function RemoveParticlesInRadius(x,y,r#)
For particle.particles = Each particles
If Distance(PeekFloat(particle\body,CP_INDEX_BODY_POS_X),PeekFloat(particle\body,CP_INDEX_BODY_POS_Y),x,y) < r# Then
cpDelete(particle\body)
Delete particle
particleCOunt - 1
EndIf
Next particle
EndFunction
Function Explosion(x#,y#,power#)
For particle.particles = Each particles
px# = PeekFloat(particle\body,CP_INDEX_BODY_POS_X)
py# = PeekFloat(particle\body,CP_INDEX_BODY_POS_Y)
dist# = Distance(px#,py#,x,y)
If dist < power#*2 Then
angle# = GetAngle(x#,-y#,px,-py)
ip# = Min(power,(power/dist#)^2)
cpApplyImpulse(particle\body,Cos(angle#)*ip#,Sin(angle#)*ip,0,0)
EndIf
Next particle
EndFunction
Re: cbChipmunk 0.6 (Fysiikkakirjasto)
Nyt kaikki törmäykset on mahdollista hakea. Eli siis nyt voit tarkistaa onko vaikka kuskin pää osunut mihinkään. Törmäysten rekisteröinnin saa päälle komennolla cpEnableContactGraph(True). Oletuksena se on poissa päältä. Listan rungon törmäyksistä voi hakea komennolla cpBodyGetArbiters. Päivitin autoesimerkkin näyttämään missä kohtaa auton kori törmää johonkin. Lisäsin myös aloitusviestiin tiedot uusista funktioista ja sieltä löytyy myös latauslinkki.
Kaikki ehdotukset uusista ominaisuuksista ja muutoksista otetaan vastaan.
Re: cbChipmunk 0.6 (Fysiikkakirjasto)
Re: cbChipmunk 0.6 (Fysiikkakirjasto)
Re: cbChipmunk 0.6.2 (Fysiikkakirjasto)
Re: cbChipmunk 0.6.3 (Fysiikkakirjasto)
Tein myös uuden esimerkin joka löytyy paketista. Se esittelee raycasting systeemin käyttömahdollisuuden räiskintäpelin laserina.
Re: cbChipmunk 0.6.3 (Fysiikkakirjasto)
Edit: Keksin, että jonkinlaiset siiven (lue lentokoneen) fysiikat voisivat olla kiva lisä...
Edit2: Jos saan koodia vähän siistimmäksi, niin voi olla, että siirrän kehityksen GitHubiin kaikkien näkyville ja muokattavaksi.