Gå til innhold

Pacman kollisjon i VB2005


Anbefalte innlegg

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
Videoannonse
Annonse

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
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 :D

Lenke til kommentar

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 av Degeim
Lenke til kommentar

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
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 :D

 

Edit:

Ja, den beveger seg rutevis, oppå et printscreen bilde

Endret av glucchip
Lenke til kommentar

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? :hmm:

Lenke til kommentar
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? :hmm:

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 av glucchip
Lenke til kommentar

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
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

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? :dontgetit::hmm:

Endret av chills
Lenke til kommentar
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
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

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 av chills
Lenke til kommentar
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 :D

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...