Permalänk

Spel! Fastnat på fysiken.

if (IntersectPixel(carRectangle, carTextureData, treeRectangle, treeTextureData)) { //Remove one life heartPosition = new Vector2(-1000, -1000); return; } if (IntersectPixel(carRectangle, carTextureData, treeRectangle, treeTextureData)) { //Crash again, one more life is removed heartPositionTwo = new Vector2(-1000, -1000); } base.Update(gameTime); } //Collision class static bool IntersectPixel(Rectangle rectangleA, Color[] dataA, Rectangle rectangleB, Color[] dataB) { //Find peices of rectangles that is overscreeding int top = Math.Max(rectangleA.Top, rectangleB.Top); int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom); int left = Math.Max(rectangleA.Left, rectangleB.Left); int right = Math.Min(rectangleA.Right, rectangleB.Right); //Checking every pixel for collision for (int y = top; y < bottom; y++) { for (int x = left; x < right; x++) { Color colorA = dataA[(x - rectangleA.Left) + (y - rectangleA.Top) * rectangleA.Width]; Color colorB = dataB[(x - rectangleB.Left) + (y - rectangleB.Top) * rectangleB.Width]; //Check if they match //If so, they are colliding if (colorA.A != 0 && colorB.A != 0) { return true; } } } return false; }

En kollision sker. En Sprite försvinner som symboliserar ett "liv" i spelet. Men när jag sedan kolliderar igen så försvinner inte Sprite nr2 (Andra livet).

Förstår inte riktigt varför. Tar jag bort return; från första så försvinner båda liven, men på samma gång.

tacksam för hjälp!

Visa signatur

Jaaa men just precis.

Permalänk
Medlem

Hmm, känns som det saknas kod för att det där ska ha en chans att funka?

för att kunna få bort andra hjärtat så måste du väl verkar som du antingen behöver ett kriterie som kollar om du redan har "tappat" första hjärtat?
Kan du tex kolla vid krock om heartPosition redan är -1000, -1000 och då sätta även heartposition2 till -1000, -1000?

Eller kan du lägga in en variabel som innehåller antal liv och räkna ner den och utnyttja det på något vis?

Dessutom:
Problemet är ju också att om du det enda du gör när du krockar är att räkna ner antalet liv, så lär du riskera att snabbt tappa flera liv i rad i samma "krock". Du bör väl tex låta spelaren dö och återställas på något ofarligt ställe vid träff?

...

Sen ska du ju kunna gå till ett "game over" state också när liven är slut..

Visa signatur

A modest man is usually admired, if people ever hear of him.

Permalänk
Skrivet av Roger W:

Hmm, känns som det saknas kod för att det där ska ha en chans att funka?

för att kunna få bort andra hjärtat så måste du väl verkar som du antingen behöver ett kriterie som kollar om du redan har "tappat" första hjärtat?
Kan du tex kolla vid krock om heartPosition redan är -1000, -1000 och då sätta även heartposition2 till -1000, -1000?

Eller kan du lägga in en variabel som innehåller antal liv och räkna ner den och utnyttja det på något vis?

Dessutom:
Problemet är ju också att om du det enda du gör när du krockar är att räkna ner antalet liv, så lär du riskera att snabbt tappa flera liv i rad i samma "krock". Du bör väl tex låta spelaren dö och återställas på något ofarligt ställe vid träff?

...

Sen ska du ju kunna gå till ett "game over" state också när liven är slut..

OKej , det var ett dumt tankesätt.

Jag ändrar min fråga till:
Om jag skulle vilja att en Sprite skulle dyka upp på skärmen varje gång jag kolliderar i Spriten. Då tänkte jag använda en for loop. Men... den ser ju ut såhär "for (int i = 0; < lenght; i++)" Men vad skulle jag skriva istället för int i tex?

Visa signatur

Jaaa men just precis.

Permalänk
Medlem
Skrivet av bossibula10:

if (IntersectPixel(carRectangle, carTextureData, treeRectangle, treeTextureData)) { //Remove one life heartPosition = new Vector2(-1000, -1000); return; } if (IntersectPixel(carRectangle, carTextureData, treeRectangle, treeTextureData)) { //Crash again, one more life is removed heartPositionTwo = new Vector2(-1000, -1000); } base.Update(gameTime); }

En kollision sker. En Sprite försvinner som symboliserar ett "liv" i spelet. Men när jag sedan kolliderar igen så försvinner inte Sprite nr2 (Andra livet).

Förstår inte riktigt varför. Tar jag bort return; från första så försvinner båda liven, men på samma gång.

tacksam för hjälp!

Du testar samma sak två gånger i rad. Första hjärtat tas alltid bort om det har blivit en kollision, och sedan hoppar du ut ur metoden med return.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av bossibula10:

Jag ändrar min fråga till:
Om jag skulle vilja att en Sprite skulle dyka upp på skärmen varje gång jag kolliderar i Spriten. Då tänkte jag använda en for loop. Men... den ser ju ut såhär "for (int i = 0; < lenght; i++)" Men vad skulle jag skriva istället för int i tex?

Nja, en for loop är nog inte optimalt för detta.. For loopar använder du för slutna loopar som ska köras genom x antal gånger utan att avbrytas, men du ska ju normalt bara bygga på en sprite åt gången antar jag?

Jag har ingen aning vilka möjligheter du har med det språk du kör med (jag kan inte ens syntaxen) men en fullösning skulle kanske vara att göra en sprite som har tex fem hjärtan utritade på rad, och sen förskjuta in den spriten från kanten, så man ser ett hjärta till (eller ett färre) för varje gång du blir träffad.

Visa signatur

A modest man is usually admired, if people ever hear of him.

Permalänk
Medlem

Nja, du har nog inte riktigt fastnat på fysiken, klippt & klistrat för mycket kanske. Den där kollisionsfunktionen är ju rätt fancy faktiskt.