Bluebeard Skrevet 6. november 2009 Del Skrevet 6. november 2009 (endret) Hei jeg driver og koder litt i XNA, og lager ett program der en sprite skal sprette av kantene på skjermen. Jeg har da følgende kode if (Position.Y < mViewport.Y) { mDirection.Y = -mDirection.Y; } if (Position.X < mViewport.X) { mDirection.X = -mDirection.X; } if (Position.Y > mViewport.Y + mViewport.Height) { mDirection.Y = -mDirection.Y; } if (Position.X > mViewport.X + mViewport.Width) { mDirection.X = -mDirection.X; } De 2 øverste fungerer fint, (hvis jeg kommenterer vekk de 2 nederste vil den sprette av venstre og øvre kant av skjermen) men de 2 nederste fungerer bare hvis jeg hardkoder inn en verdi isteden for mViewport.Width/Height, f.eks. 400 og da vil bildet sprette tilbake når det kommer til 400, men hvis jeg bruker skjermverdien bare rister hele bildet og rører seg ikke?? Endret 9. november 2009 av Bluebeard Lenke til kommentar
HDSoftware Skrevet 9. november 2009 Del Skrevet 9. november 2009 Morsomt å høre (lese) ordet SPRITE. Tror ikke jeg har hørt det begrepet siden de gamle Commodore64 dagene :-D Se litt på IF testene dine. Jeg tror nemlig at < og > har større prioritet en + og -. Jeg tror din kode blir tolket noe slikt runtime if (True + mViewport.Width) // hvis pos.X er større en Viewport.X if (False + mViewport.Width) // hvis pos.x er mindre en Viewport.X Prøv å legge paranteser rundt: if (Position.X > (mViewport.X + mViewport.Width)) .... Vet ikke om det virker, men det er i hvertfdall mitt tips Lenke til kommentar
Degeim Skrevet 9. november 2009 Del Skrevet 9. november 2009 (endret) Kan ikke sjekke det nå, men jeg synes det høres merkelig ut at <> har høyere prioritet enn +-. Prøv med dette: if (Position.Y < mViewport.Y) { mDirection.Y = -mDirection.Y; } if (Position.X < mViewport.X) { mDirection.X = -mDirection.X; } if (Position.Y > mViewport.Y + mViewport.Height) { Position.Y-=5; mDirection.Y = -mDirection.Y; } if (Position.X > mViewport.X + mViewport.Width) { Position.X-=5; mDirection.X = -mDirection.X; } Jeg kan tenke meg at problemet er det at når P.X er større enn mV.X + mV.Width, så forblir den det selv om retningen skiftes. Dermed vil det bare gå inn i den nederste blokken om og om igjen, og skifte retning. Endret 9. november 2009 av Degeim Lenke til kommentar
HDSoftware Skrevet 9. november 2009 Del Skrevet 9. november 2009 (endret) Og jeg som alltid har vært av den oppfatning at + og - ligger på bunn av prioriterings listen, men jeg har tatt feil før jeg ;-) Men jeg har for vane å bruke paranteser uansett for å være sikker, t.o.m. når det gjelder noe så simpelt som multiplikasjon 1 + 2 * 3 = 7 (1 + 2) * 3 = 9 Det vil si at 1 + 2 * 3 er det samme som 1 + (2 * 3) Trodde dermed også at 1 > 2 + 3 var det samme som (1 > 2) + 3 Endret 9. november 2009 av HDSoftware Lenke til kommentar
GeirGrusom Skrevet 9. november 2009 Del Skrevet 9. november 2009 (endret) Aritmetikk kommer før sammenligninger. Rekkefølgen er slik: ., (), [], x++, x--, new, typeof, checked, unchecked (Primary) +, -, !, ~, ++x, --y, (T)x (Unary, matematiske operasjoner med kun én operand) *, /, % (Multiplicative) +, - (Additive) <<, >> (Shift) <, >, <=, >=, is, as (Relational and type testing) ==, != (Equality) &, ^, | (Bitwise logical) &&, || (Logical) ?: (Conditional) =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= (Assignment) kilde Endret 9. november 2009 av GeirGrusom Lenke til kommentar
GeirGrusom Skrevet 9. november 2009 Del Skrevet 9. november 2009 Jeg ville laget en egen funksjon av dette, som for eksempel tar imot Rectangle. public void DoCollide(Rectangle bounds) { if(Position.X > bounds.Right || Position.X < bounds.Left) Direction.X = -Direction.X; if(Position.Y > bounds.Bottom || Position.Y < bounds.Top) Direction.Y = -Direction.Y; } Så kan du jo se om verdiene er riktige under debugging. Lenke til kommentar
HDSoftware Skrevet 9. november 2009 Del Skrevet 9. november 2009 Bare en liten ting. Når du først har fått dette til, så pass på at du trekker fra høyden og bredden på spriten når du sjekker. Men dette hadde du sikkert allerede tenkt på ;-) Lenke til kommentar
Bluebeard Skrevet 9. november 2009 Forfatter Del Skrevet 9. november 2009 Ja... Hehe, var en ganske flau feil: Viewport var tydeligvis ikke "satt". Altså alle verdiene var 0. Har fått det til nå ved å bruke: if(Position.X > GraphicsDeviceManager.DefaultBackBufferWidth) (Satte det selvfølgelig i en variabel) Her er "GraphicsDeviceManager.DefaultBackBufferWidth" bredden på skjermen... Noen som vet om noen bedre måte å få tilgang til skjermverdiene på? Og til HDSoftware: Ja, har tenkt på dette Ellers hadde den gått utenfor med hele bildet før øverste høyre hjørne var utenfor Takker for alle som prøvde å hjelpe til Lenke til kommentar
GeirGrusom Skrevet 9. november 2009 Del Skrevet 9. november 2009 GraphicsDevice.PresentationParameters.BackBufferWidth og Height. Lenke til kommentar
Bluebeard Skrevet 9. november 2009 Forfatter Del Skrevet 9. november 2009 Er det bedre? På hvilken måte? Lenke til kommentar
GeirGrusom Skrevet 9. november 2009 Del Skrevet 9. november 2009 Fordi den bruker størrelsen som devicen er laget med, og ikke defaultverdiene. Ellers har du Screen klassen for å hente størrelsen på skjermen, men det er vel ikke så interessant. Lenke til kommentar
Bluebeard Skrevet 9. november 2009 Forfatter Del Skrevet 9. november 2009 Screen klassen?? xD Lenke til kommentar
GeirGrusom Skrevet 9. november 2009 Del Skrevet 9. november 2009 Screen.PrimaryScreen.Bounds for eksempel. Lenke til kommentar
Bluebeard Skrevet 10. november 2009 Forfatter Del Skrevet 10. november 2009 hva må jeg "use" for å bruke det? Kommer ikke opp på meg Lenke til kommentar
GeirGrusom Skrevet 10. november 2009 Del Skrevet 10. november 2009 Ah, trodde det var i System, men det ligger i System.Windows.Forms, så da er den kanskje ikke så aktuell... 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å