Video: LIBGDX para Android - Tutorial 19 - Detectar Colisiones - How to make games Android 2024
När sprites börjar röra sig, finns det alltid möjlighet att de lämnar gränserna för skärmen. Vanligtvis svarar HTML5-spelutvecklare på ett av fem sätt: linda, studsa, stoppa, dö eller fortsätt. SimpleGame-biblioteket har en gränskontrollrutin som låter dig ange vilka av dessa standardbeteenden som ska användas. Spriteens boundAction-egenskap anger vilken åtgärd som ska användas. Du kan använda gränskontrollen för att göra följande:
-
Bestäm gränserna.
Gränserna bestäms av kanvasens bredd.
-
Kontrollera om användaren är borta från en gräns.
Därefter gjordes en annan serie variabler som innehåller booleska värden som indikerar huruvida sprite är av en av gränserna: OffRight, offLeft, offTop och offBottom. Använd grundläggande om-satser för att avgöra om sprite är borta på skärmen på något av följande sätt.
-
Bestäm gränsverkan.
Använd ett enkelt if-förklaring för att bestämma vilken gränshandling som för närvarande är inställd för sprite.
-
Om boundAction är WRAP:
Ändra x eller y-variabeln till motsatt sida, men lämna endast dx- och dy-värdena.
-
Om boundAction är BOUNCE:
Invertera dy om sprite studsade överst eller nedre, och dx om sprite studsade åt vänster eller höger. Det är inte nödvändigt att ändra x eller y direkt.
-
Om boundAction är STOPP:
Ställ in hastigheten till noll oavsett vilken gräns som avslutades.
-
Om boundAction är DIE:
Ställ hastigheten på noll och anropa sprite's hide () -metoden. Detta kommer att orsaka att sprite försvinner och inte längre beaktas vid kollisionsberäkningar.
-
En annan gräns anses vara FÖRTSÄTT.
Ingen åtgärd är nödvändig här eftersom sprite fortsätter att flytta trots att den inte är synlig. Om det här är önskad effekt, ska du på något sätt ange användaren där sprite är, eller ge något sätt för att sprite ska återvända.
Här ingår en del av koden för kollisionskontrollrutinen:
offRight = false; offLeft = false; offTop = false; offBottom = false; if (this. x> rightBorder) {offRight = true;} om (this.x bottomBorder) {offBottom = true;} om (this.y <0) {offTop = true;} om (denna. boundAction == WRAP) {if (offRight) {this. x = leftBorder;} // slut om om (offBottom) {this. y = topBorder;} // slut om om (offLeft) {this. x = rightBorder;} // slut om om (offTop) {this. y = bottomBorder;}} annars om (denna. boundAction == BOUNCE) {om (offTop || offBottom) {this.dy * = -1; detta. calcSpeedAngle (); detta. imgAngle = detta. moveAngle;} om (offLeft || offRight) {this. dx * = -1; detta. calcSpeedAngle (); detta. imgAngle = detta. moveAngle;}} annars om (denna. boundAction == STOP) {if (offLeft || offRight || offTop || offBottom) {this. setSpeed (0);}} annars om (denna. boundAction == DIE) {if (offLeft || offRight || offTop || offBottom) {this. Dölj(); detta. setSpeed (0);}} annat {// fortsätt för alltid}} // End checkbounds
Om du vill ändra en sprite gränsöversikt i simpleGame kan du använda metoden setBoundAction () för att göra det.
Observera att några situationer kan kräva olika beteenden. Till exempel kanske du vill vikla runt sidorna men stoppa längst upp eller ner. Om du behöver ett mer specifikt beteende, bygg bara en ny checkBounds () -metod för din sprite. Du måste dock kontrollera alla gränser eftersom din nya checkBounds () kommer att helt skriva över den som är inbyggd i simpleGame.