Gå til innhold

C#: [Løst]Problemer med Viewport.Height & Width


Anbefalte innlegg

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 av Bluebeard
Lenke til kommentar
Videoannonse
Annonse

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

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

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

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

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

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 :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å
×
×
  • Opprett ny...