04. december 2002 - 21:27Der er
60 kommentarer og 1 løsning
Hjælp til bilspil..
Jeg har altid drømt om at lave et bilspil, og er nu så endeligt gået igang. Men jeg har endel begynder problemer..
Jeg er ved at programmere banen, så når man støder ind i en bande, så rykker bilen baglæns. Det har jeg også lavet, men hvis man bliver ved med at trykke køre bilen bare langtsomt igennem. Jeg bruger variablan HitTest. Er der nogle der har en teori om hvordan man kan lave det. Og i det hele taget viden om hvordan man udvikler spil i flash ?
ja.... Den kommer her.. Men jeg eftersøgte sider der omhandler at lave Flash-SPil..
Alt kodning er lagt på bilens MC
----------------------- Kode -----------------------------
onClipEvent (enterFrame) { // This code will advance the car forward. if (Key.isDown(Key.UP)) { speed += 1; } // This will make the car go backwards if (Key.isDown(Key.DOWN)) { speed -= 2; } // The car will start to slow down after the speed of 25 if (Math.abs(speed)>25) { speed = 24; } // This will change the angle of the car if (Key.isDown(Key.LEFT)) { _rotation -= 10; } if (Key.isDown(Key.RIGHT)) { _rotation += 10; } // This will make the car move speed *= .98; x = Math.sin(_rotation*(Math.PI/180))*speed; y = Math.cos(_rotation*(Math.PI/180))*speed*-1; if (!_root.move.hitTest(_x+x, _y+y, true)) { _x += x; _y += y; } else { speed *= -.6; } // This is the collision test if (this.hitTest(_root.bane)) { speed *=-.50; } if (this.hitTest(_root.bane1)) { speed *=-.50; } if (this.hitTest(_root.bane2)) { speed *=-.50; } if (this.hitTest(_root.bane3)) { speed *=-.50; } if (this.hitTest(_root.bane4)) { speed *=-.50; } if (this.hitTest(_root.bane5)) { speed *=-.50; } if (this.hitTest(_root.bane6)) { speed *=-.50; } if (this.hitTest(_root.bane7)) { speed *=-.50; } }
Jeg har lavet et lignende spil, men her har jeg gjort det sådan at man bliver forhindret i at gå enten forlæns eller baglæns efter hvilken vej du peger mod muren. Nu kan jeg godt nok ikke se din .swf fil, da jeg sidder ved en åndsvag Imac, men jeg tro du kan lave banderne på en nemmere måde: Du laver et stor MC hvor du tegner banderne - kun banderne. Du ændre så bare lidt på dit script:
if (_root.bandeMC.hitTest (_x, _y-_height/2, true) ( speed *= -.50; ) if (_root.bandeMC.hitTest (_x, _y+_height/2, true) ( speed *= -.50; ) if (_root.bandeMC.hitTest (_x-_width/2, _Y, true) ( speed *= -.50; ) if (_root.bandeMC.hitTest (_x+_width/2, _Y, true) ( speed *= -.50; ) Jeg kan prøve at kigge på det script jeg har lavet til mit spil, men de bliver ikke lige nu. Ang det med udvikling af spil, så prøv klassikeren: htttp://www.flashkit.com - under tutorials
Det sikre måde er at lave fire punkter på bilen og lave hittest for hver af dem - hvis forenden kører ind i banden, skal den tilbage - hvis bagenden skal den frem...
Her består hver bil af noget grafik og inde i dette er der 6 movieclips, og der bliver så hele tiden kørt hittest på alle disse, for at se om bilerne er kørt ind i hinanden eller ind i banden... Tre af bilerne kører noget med noget dummy-"intelligens", mens den sidste styres af brugeren - de har alle samme engine for at se om de rammer hinanden...
Der er selvfølgelig 6 punkter, da en bil kan køre direkte ind i siden på en anden uden at røre hjørnerne, så de to sidste punkter ligger midt på hver langside...
Men det er jo ikke noget problem - blot en enterFrame der laver hitTest mellem alle bilens punkter og banden og bestemmer hvor mange punkter der er over banden og hvis den er, hvor bilen skal hoppe hen...
Jeg har fundet ud af hvordan man stopper bilen osv. Men når man så blvier hved med at trykke fremad, så køre den langsomt igennem?.. Hvorfor det i teorien?
Det skrev jeg engang en lang smøre om i dette spørgsmål, men så kom der en fejl, og jeg gad ikke igen, men okay:
Forestil dig at bilen holder stille lige foran banden, der er 0px derhen. Bruger trykker hele tiden fra nu af. Bilen bevæger sig på enterFrame som nedenfor:
Ser du, at bilen kommer længere og længere ind over banden, da du kun trækker halvdelen af hastigheden fra hver gang, men lægger "1" til alligevel?
Ideen er, at du først skal lave hittest, og hvis den ikke rammer banden, så lægger du en til speed og tilføjer speed, men hvis den gør, så skal du ikke tilføje speed... Fejl kan dog alligevel opstå:
Bilen er lige foran banden og har en hastighed på 20, der er 0px hen til banden, brugeren holder fremad nede, men der påvirker ikke, da der er hittest:
Kan du stadig se, at den nu kommer til at sidde fast inde over banden? Derfor ksal du også som foreslået af legende kun gøre speed negativ, hvis man er over banden:
hittest => speed = -0.5*Math.abs(speed)
Men så giver det fejl hvis man bakker ind i en bande... Derfor skal du vide, hvilken ende af bilen, der rammer banden...
Narj... heller putte en if(hittest) hele vejen udenom alle if (Key)-statements... og så ingenting i else...
Altså de fem if-udtryk efter de hinanden, der sætte hastigheden og rotationen... Og så ellers lade resten være ned til din speed *= -.6, som skal være speed = -.6*Math.abs(speed)
Banden? Når flash sammenligner to movieclips for hittest, så bruger den deres bounding box - altså de rektangel som de hver især udspænder... Den kigger ikke efter, om der rent faktisk er noget grafik inden under, så nej...
Og du har sat din else det forkerte sted... Den skal sidde efter den } der matcher if (!hitBande) og ikke efter den if der tester om højre-tasten er trykket ned som du har gjort...
Prøv at vis mig hele dit script... Og der er intet andet script overhovedet i din film? Og dine bander har KUN den størrelse, som hver enkelt streg udgør? Og din bil har også kun den størrelse, den er?
Næ... ikke helt... Og hvad mener du med siderne - kan man køre sidelænds ind i en bande?
Man kunne sige, at hvis man kører fremad (har en positiv speed), så er det nok forenden, der rammer en bande, og hvis speed er negativ, så er det bagenden... Men så opstår problemet jo, hvis man ryger ind over en bande og speed sættes til begativ, for at man ryger tilbage igen, men ikke kommer langt nok tilbage, til at man er uden for banden, så vil næste løkke jo igen opdage, at man er over banden samtidig med at speed er negativ og så tror scriptet, at det er bagenden, selvom det er en fejl...
Derfor er det smartere at køre som følger: I starten af scriptet beregnes den nye hastighed i forhold til forrige hastighed og hvilke knapper, der er trykket ned. Så undersøges det, om den nye hastighed vil medføre, at man er over banden. Hvis den gør, så skal bilen flyttes tilbage igen, og hastigheden sættes til negativt eller stopper vi:
onClipEvent (enterFrame) { if (Key.isDown(Key.UP) && speed < 25) { speed++; } if (Key.isDown(Key.DOWN) && speed > -25) { speed -= 2; } if (Key.isDown(Key.LEFT)) { _rotation -= 10; } else if (Key.isDown(Key.RIGHT)) { _rotation += 10; }
Vi er faktisk næsten helt tilbage til dit oprindelige script, forskellen er blot at hvis man er over banden, så annuleres positions-ændringen øjeblikkeligt...
Ja.. Nu fungere det.. Nu er jeg ved at designe banerne, så ka det jo altud være der kommer nogel fejl.. Men det går nok.. Og så har jeg et fedt eksempel, jeg kan gå udfra.. Mange tak....
tark for point... det blev også en lang proces... :o)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.