glucchip Skrevet 26. august 2006 Del Skrevet 26. august 2006 Jeg har begynt på et Pacman spill i VB2005. Jeg har et bilde av en Pacmanbakgrunn, som bakgrunn Bilde av pacman som jeg kan flytte rundt med piltastene, men jeg lurer nå på: Hvordan er koden for at Pacman stopper mot veggen, og ikke bare lper igjennom? Om det er en kode for at den skal stoppe mot visse koordinater eller noe sånt? Lenke til kommentar
Harald Staff Skrevet 26. august 2006 Del Skrevet 26. august 2006 Ja, du må vurdere om bildet har lov til å bli flyttet til høyre før du flytter det til høyre. Vegger står oftest ganske stille, så den vet du hvor er. Litt mer komplisert er det når fler ting flyttes rundt samtidig, da må du sjekke om det står noe hvasomhelst i veien før du flytter. Det kalles "collision detection" og kan være nokså komplisert. HTH. Beste hilsen Harald Lenke til kommentar
glucchip Skrevet 26. august 2006 Forfatter Del Skrevet 26. august 2006 Ja, du må vurdere om bildet har lov til å bli flyttet til høyre før du flytter det til høyre. Vegger står oftest ganske stille, så den vet du hvor er. Litt mer komplisert er det når fler ting flyttes rundt samtidig, da må du sjekke om det står noe hvasomhelst i veien før du flytter. Det kalles "collision detection" og kan være nokså komplisert. HTH. Beste hilsen Harald 6745471[/snapback] Joda, men er det mulig å få en kode til dette? Hvordan nekter jeg "pacman" å gå igjennom veggen, dette er første prioritet. Monstrene og sånt bryr jeg meg ikke om . Er det mulig å få en kode? Tusen takk Lenke til kommentar
Degeim Skrevet 26. august 2006 Del Skrevet 26. august 2006 (endret) Hvordan beveger du PacMan? Hvis vi sier at han beveger seg "rutevis", og at banen også er delt opp i ruter, la oss si 10*20 ruter (da vil jo PacMan se ut som om han lagger en del, men bare et eksempel). I så fall, så lager du en array ( Dim Bane(0 to 9, 0 to 19) ), som representerer banen. Du velger hvilke ruter som skal være vegger, og hvor PacMan skal starte. Så har du en loop som kjører X ganger i sekundet/minuttet (der X bestemmer hvor raskt det vil oppdatere seg), som arbeider som følger: for i as integer=0 to 9 for a as integer=0 to 19 'Her vil du da loope gjennom bane-arrayen, i denne rekkefølgen: 'Bane(0,0) 'Bane(0,1) 'Bane(0,2) 'Bane(0,3) '... 'Bane(9,19) 'Og så sjekker du med arrayen (If Bane(9,19) = Vegg Then) og tegner det som skal tegnes i denne ruten (hver rute må jo nødvendigvis være X * Y pixsler, der X = skjermbredde / 20, og Y = skjermhøyde / 10). next next Og dermed kan du også bruke arrayen til å sjekke om PacMan kan bevege seg en gitt retning: Private sub MotVenstre(X as integer, Y as integer) If Bane(X-1,Y) <> Vegg then 'Beveg PacMan mot venstre end if End Sub Dette var kanskje dårlig forklart, og kanskje en dårlig fremgangsmåte. Men slik ville jeg ha startet, og så heller videreutviklet det til mer flytende bevegelser senere. 'EDIT: og hvis du da passer på å lagre PacMan og eventuelle monstere sine posisjoner i Bane-arrayen, så blir det jo det samme med sjekking av monstere, som med vegger. Degeim Endret 26. august 2006 av Degeim Lenke til kommentar
Harald Staff Skrevet 26. august 2006 Del Skrevet 26. august 2006 Hvis bildet Pacman beveger seg i steg av 30 og høyre vegg står X enheter fra banestart: If Pacman.Left < (X-30) Then Pacman.Left = Pacman.Left + 30 Når du skjønner det, legg inn bredden på Pacman i regnestykkene. Degeims metode er forøvrig aldeles utmerket. Men før alt det må du beherske IF i programmeringsspråket ditt, det går ikke an å lage noe uten. HTH. Beste hilsen Harald Lenke til kommentar
glucchip Skrevet 26. august 2006 Forfatter Del Skrevet 26. august 2006 (endret) Hvordan beveger du PacMan? Hvis vi sier at han beveger seg "rutevis", og at banen også er delt opp i ruter, la oss si 10*20 ruter (da vil jo PacMan se ut som om han lagger en del, men bare et eksempel). I så fall, så lager du en array ( Dim Bane(0 to 9, 0 to 19) ), som representerer banen. Du velger hvilke ruter som skal være vegger, og hvor PacMan skal starte. Så har du en loop som kjører X ganger i sekundet/minuttet (der X bestemmer hvor raskt det vil oppdatere seg), som arbeider som følger: for i as integer=0 to 9 for a as integer=0 to 19 'Her vil du da loope gjennom bane-arrayen, i denne rekkefølgen: 'Bane(0,0) 'Bane(0,1) 'Bane(0,2) 'Bane(0,3) '... 'Bane(9,19) 'Og så sjekker du med arrayen (If Bane(9,19) = Vegg Then) og tegner det som skal tegnes i denne ruten (hver rute må jo nødvendigvis være X * Y pixsler, der X = skjermbredde / 20, og Y = skjermhøyde / 10). next next Og dermed kan du også bruke arrayen til å sjekke om PacMan kan bevege seg en gitt retning: Private sub MotVenstre(X as integer, Y as integer) If Bane(X-1,Y) <> Vegg then 'Beveg PacMan mot venstre end if End Sub Dette var kanskje dårlig forklart, og kanskje en dårlig fremgangsmåte. Men slik ville jeg ha startet, og så heller videreutviklet det til mer flytende bevegelser senere. 'EDIT: og hvis du da passer på å lagre PacMan og eventuelle monstere sine posisjoner i Bane-arrayen, så blir det jo det samme med sjekking av monstere, som med vegger. Degeim 6745895[/snapback] Skjønte jeg ingenting av:S Array? Jeg er helt ny, men har beveget meg ut på et dristig forsøk, så om du kan forklare hvor hvilken kode skal stå? Takk Harald Edit: Ja, den beveger seg rutevis, oppå et printscreen bilde Endret 26. august 2006 av glucchip Lenke til kommentar
Gjakmarrja Skrevet 26. august 2006 Del Skrevet 26. august 2006 Hvorfor rutvis? Ta heller og ligg inn i en array kordinatene, bredde og høyde. Til hver av veggene. Så lager du en IF baser funksjon til høyre, venstre, opp og ned. Som looper gjennom array og sjekker at verdiene er mindre/større slik at den kan passere trygt. Jeg vet dette funker, da jeg har sett det fungere. En i klassen lagde dette i fjor. Det burde funke? Lenke til kommentar
glucchip Skrevet 26. august 2006 Forfatter Del Skrevet 26. august 2006 (endret) Hvorfor rutvis? Ta heller og ligg inn i en array kordinatene, bredde og høyde. Til hver av veggene. Så lager du en IF baser funksjon til høyre, venstre, opp og ned. Som looper gjennom array og sjekker at verdiene er mindre/større slik at den kan passere trygt. Jeg vet dette funker, da jeg har sett det fungere. En i klassen lagde dette i fjor. Det burde funke? 6747421[/snapback] OK, da gjør jeg det da! Jeg veit ikke hvordan man gjør det!! 'Derfor spør jeg om koden til det. En FULL forklaring på hvordan det fungere TAkker så meget Edit: Er det noen her som er intressert i å gi meg MSN adresse? Det hadde vært så utrolig mye lettere:) ikke ment som spam altså, men dette tar så lang tid =/ Endret 26. august 2006 av glucchip Lenke til kommentar
Harald Staff Skrevet 26. august 2006 Del Skrevet 26. august 2006 Kjære venn Det er mange veldig forskjellige og veldig gode måter å gjøre dette på. Derfor er det ikke noe som heter "koden" -den avhenger av hvordan alt det anre er bygget. Men du behersker tydeligvis ikke IF . Det må du. Glem pacman, bilder, arrayer og prosjekter, og konsentrer seg helt om å lære og forstå IF, som er kanskje den aller viktigste byggeklossen i ethvert dataprogram og programmeringsspråk. Når du så har gjort det, har du ingen problemer med å legge det inn i flytte-koden din helt uten hjelp fra noen. HTH. Beste hilsen Harald Lenke til kommentar
glucchip Skrevet 26. august 2006 Forfatter Del Skrevet 26. august 2006 Kjære venn Det er mange veldig forskjellige og veldig gode måter å gjøre dette på. Derfor er det ikke noe som heter "koden" -den avhenger av hvordan alt det anre er bygget. Men du behersker tydeligvis ikke IF . Det må du. Glem pacman, bilder, arrayer og prosjekter, og konsentrer seg helt om å lære og forstå IF, som er kanskje den aller viktigste byggeklossen i ethvert dataprogram og programmeringsspråk. Når du så har gjort det, har du ingen problemer med å legge det inn i flytte-koden din helt uten hjelp fra noen. HTH. Beste hilsen Harald 6748230[/snapback] OkOK. Men jeg må få til _en_ kode som stopper et objekt mot et annet objekt! Ikke bare til Pacman, men ellers og. Jeg fikk til dette med IF, som du la ut, men den stopper. og når jeg trykker igjen går den videre. Er det ikke mulig å få et eksempel på en måte å gjøre dette på? Takk for alle svar ejg har fått Lenke til kommentar
Gjakmarrja Skrevet 26. august 2006 Del Skrevet 26. august 2006 (endret) Du har vel ikke lyst til å ligge ut koden? Som .zip fil? Edit: La oss ta for oss at du skal gå til høyre sant? De verdiene som da har betydning for oss er da x og y kordinatene til alle veggene. Skal vi gå klar "nedre" delen av veggen til høyre må vi sjekke gjennom alle Y verdiene til veggene at de er større enn ( vegger + høyde). Så må vi sjekke at den går klar "over", det gjør vi med å loope gjennom alle y verdiene en gang til eller samtidig. (pacman.y + høyde > vegg.y) Hvis en vegg registeres som ikke "godkjent" endrer du en bool, hvis alle veggene går klar.. så kan den gå der? Er det noe fornuft i det jeg skrev over? Endret 26. august 2006 av chills Lenke til kommentar
Harald Staff Skrevet 26. august 2006 Del Skrevet 26. august 2006 Kan du poste koden du bruker for å flytte pacman mot høyre ? Lenke til kommentar
glucchip Skrevet 27. august 2006 Forfatter Del Skrevet 27. august 2006 Kan du poste koden du bruker for å flytte pacman mot høyre ? 6748830[/snapback] Det kan jeg Jeg har en textbox nederst som ejg trykker iførst da, hvis det betyr noe? Jeg har kalt Pacman for "chara" Men koden jeg har lagt i textbox1.text: if e.keycode = Key.Right Then chara.Left = chara.Left + 20 SÅnn? Lenke til kommentar
Harald Staff Skrevet 27. august 2006 Del Skrevet 27. august 2006 Sånn. Så setter du inn det jeg viste deg første gang, slik if e.keycode = Key.Right Then If chara.Left < (X-20) Then chara.Left = chara.Left + 20 der tallet x enten er en variabel som forteller hvor høyre vegg står, eller er erstattet med selve tallet. HTH. Beste hilsen Harald Lenke til kommentar
glucchip Skrevet 27. august 2006 Forfatter Del Skrevet 27. august 2006 Sånn.Så setter du inn det jeg viste deg første gang, slik if e.keycode = Key.Right Then If chara.Left < (X-20) Then chara.Left = chara.Left + 20 der tallet x enten er en variabel som forteller hvor høyre vegg står, eller er erstattet med selve tallet. HTH. Beste hilsen Harald 6750279[/snapback] Kan jeg la X stå der? eller må jeg finne koordinatene til veggen da? Skal dette da, stoppe chara i å gå den veien, eller på det punktet? Takk, Harald:D Lenke til kommentar
Gjakmarrja Skrevet 27. august 2006 Del Skrevet 27. august 2006 (endret) Jeg lagde et program som forhåpentligvis vil hjelpe deg. Veggene finnes generisk av kode, så du kan ligge til flere vegger i form av labels så lenge de inneholder "vegg" i navnet skal de finnes og inkluderes automatisk. For å test prinsippe kan du prøve endre navnen på noen av lablene. Dette gjelder kun høyre Du burde fint klare resten selv, samt tilpasse "veggloaderen" til å passe dine egne vegger. Håper dette hjalp. Et lite uttdrag fra programkoden: 'KOLLISJON Public Function gåhøyre() As Boolean Dim obsvegg As Boolean Dim i As Integer For i = 0 To vegger.LongLength - 1 'før må vi være nær en vegg før vi tester If pacman.Location.X + pacman.Width = vegger(i).Location.X Then 'går den over? If vegger(i).Location.Y < pacman.Location.Y + pacman.Height Then 'den går ikke over, går den da under? If Not pacman.Location.Y > vegger(i).Location.Y + vegger(i).Height Then obsvegg = True End If 'ElseIf vegger(i).Location.Y > pacman.Location.Y + pacman.Height Then End If End If Next If obsvegg = True Then Return False Else Return True End If End Function Hele koden kan lastes ned her: Link (Dårlig kommentert, noe kode som er gjort om kommentar den ikke var nødvendig osv. Beklager det, dårlig tid. ) Endret 27. august 2006 av chills Lenke til kommentar
glucchip Skrevet 27. august 2006 Forfatter Del Skrevet 27. august 2006 Jeg lagde et program som forhåpentligvis vil hjelpe deg. Veggene finnes generisk av kode, så du kan ligge til flere vegger i form av labels så lenge de inneholder "vegg" i navnet skal de finnes og inkluderes automatisk. For å test prinsippe kan du prøve endre navnen på noen av lablene. Dette gjelder kun høyre Du burde fint klare resten selv, samt tilpasse "veggloaderen" til å passe dine egne vegger. Håper dette hjalp. Et lite uttdrag fra programkoden: 'KOLLISJON Public Function gåhøyre() As Boolean Dim obsvegg As Boolean Dim i As Integer For i = 0 To vegger.LongLength - 1 'før må vi være nær en vegg før vi tester If pacman.Location.X + pacman.Width = vegger(i).Location.X Then 'går den over? If vegger(i).Location.Y < pacman.Location.Y + pacman.Height Then 'den går ikke over, går den da under? If Not pacman.Location.Y > vegger(i).Location.Y + vegger(i).Height Then obsvegg = True End If 'ElseIf vegger(i).Location.Y > pacman.Location.Y + pacman.Height Then End If End If Next If obsvegg = True Then Return False Else Return True End If End Function Hele koden kan lastes ned her: Link (Dårlig kommentert, noe kode som er gjort om kommentar den ikke var nødvendig osv. Beklager det, dårlig tid. ) 6750390[/snapback] Hjertlig Lenke til kommentar
Harald Staff Skrevet 27. august 2006 Del Skrevet 27. august 2006 Kan jeg la X stå der? eller må jeg finne koordinatene til veggen da?(...) Skal dette da, stoppe chara i å gå den veien, eller på det punktet? Ok, lurte oss vellykket. Artig en stund, men ikke i dagevis. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå