TDDE04 Introduktion till programmering och datalogiskt tänkande
Ht1-2
För vår spelkaraktär (en boll) i vårt plattformsspel måste vi tänka på många egenskaper för att den ska bete sig rätt. Dessa egenskaper måste passa bra ihop med banans egenskaper så att spelaren kan klara hinder och nå målet utan att göra konstiga saker, som att hoppa över hinder som vi inte vill att spelaren ska kunna hoppa över. De olika egenskaperna bildar ett system, till exempel kan bollens maximala hastighet påverka hur högt den kan hoppa om banan inte är helt platt. Vi måste balansera både funktionalitet och utseende för att spelet ska vara roligt, precis som med fysiska produkter där både funktion och utseende påverkar köpbeslutet.
Statisk kropp (`StaticBody2D`), kropp med fysik (`RigidBody2D`) och kollisionsform (`CollisionShape2D`/`CollisionPolygon2D`) är viktiga komponenter för speldesign i Godot, särskilt för att hantera kollisioner och fysikssimuleringar. Här är en förklaring av hur de används:
1. **Statisk kropp (`StaticBody2D`)**:
- Används för scenens fasta delar som inte rör sig
- Vanligtvis används för plattformar, väggar, mark och andra fasta objekt.
2. **Kropp med fysik (`RigidBody2D`)**:
- Används för objekt som påverkas av fysiklagar, som gravitation, kollisioner och krafter.
- Används vanligtvis för spelare, fiender, projektiler och andra objekt som ska interagera med fysikvärlden.
3. **Kollisionsform (`CollisionShape2D`/`CollisionPolygon2D`)**:
- Används för att definiera en form för kollisionsdetektion, som kan vara anorlund och t.ex. enklare än den grafiska form en fysikkrop ska ha.
- Kan vara cirkulär, rektangulär, trianlglar, eller polygoner, beroende på objektets form.
- Används tillsammans med statisk kropp eller kropp med fysik för att detektera kollisioner och hantera kollisionsrespons.
4. **Visuell form**:
- Den vanligaste metoden är att lägga till en `Sprite`-nod som ett barn till `RigidBody2D` eller `StaticBody2D`.
- En Sprite-node har en Textur, bild som sin form.
- En AnimatedSprite kan ha flera bilder för olika tillstånd för att animera dess form.
5. **Scala inte fysiska objekt**
- Att förändra en fysikalisk kropp med scalning kan orsaka oväntade och oförutsägbara beteenden inom fysiksimuleringen. För att undvika dessa problem är det bättre att direkt ändra storleken för hand. Den fysiska kroppens visuell form, dess Sprite, kan dock skalas för att förmnska eller förstora så länge scalan på den fysisk kroppen förbli ofärndrad.
## TileMap för fysik
En TileMap är en vanlig teknik för att skapa nivåer i plattformsspel. Den består av en layout där varje cell representerar en del av spelvärlden, såsom mark, väggar, hinder och andra objekt och där bilder i givna storlekar kan kombineras men även ha fysisk förmåga som en StaticBody2D.
I kursen kommer vi bygga banor med TileMaps för att med mer kontroll kunna skapa mer intresanta hinderbanor.
## Rörelse genom kraft
I Godot kan krafter användas för att påverka rörelsen hos en `RigidBody2D`-nod på olika sätt. Krafter kan tillämpas på ett objekt för att simulera påverkan av externa krafter, såsom gravitation, explosioner eller spelarens inmatning. Här är några sätt hur krafter kan användas:
2. **Punktvis kraft (`apply_central_impulse`)**:
- Med `apply_central_impulse` kan du tillämpa en impuls på ett `RigidBody2D`-objekt i en specifik riktning, oberoende av objektets nuvarande riktning.
- Till skillnad från central kraft tillämpas en impuls bara en gång och resulterar i en enstaka acceleration i den specificerade riktningen.
- Exempelvis kan en punktvis kraft användas för att simulera effekten av en spelares hopp eller när en projektil avfyras.
3. **Momentkraft (`apply_torque_impulse`)**:
- Momentkraft kan användas för att ge ett objekt en rotation eller en rotationsacceleration.
- Detta kan användas för att simulera effekter som roterande plattformar, spinnande objekt eller dynamisk rörelse av objekt som kastas eller kolliderar med andra.
Genom att använda krafter kan du skapa realistiska fysikbaserade rörelser i ditt spel och ge en känsla av interaktivitet och dynamik. Det är viktigt att experimentera och justera kraftens styrka och riktning för att uppnå önskad effekt och spelkänsla.
I Godot kan en RigidBody2D-objekts rörelse styras av spelaren genom att tillämpa krafter, impulser eller ändra dess hastighet beroende på spelarens inmatning. Här är en översikt över hur detta kan göras:
I Godot kan en `RigidBody2D`-objekts rörelse styras av spelaren genom att tillämpa krafter, impulser eller ändra dess hastighet beroende på spelarens inmatning. Här är en översikt över hur detta kan göras:
## Spelar-input
1. **Hantera spelarinput**:
- Först måste du hantera spelarens inmatning, vanligtvis från tangentbordet, musen eller en annan inmatningsenhet.
- Du kan använda Godots inbyggda inmatningshanteringssystem för att lyssna på spelarens tangenttryckningar eller musrörelser och reagera på dem i ditt spelarskript.
2. **Tillämpa krafter eller impulser**:
- När spelaren utför en handling, som att trycka på en riktningstangent för att flytta, kan du tillämpa en kraft eller impuls på `RigidBody2D`-objektet i den motsatta riktningen.
- Till exempel kan du använda `add_central_force()` för att tillämpa en kraft i en viss riktning från spelarens inmatning.
- Du kan också använda `apply_impulse()` för att tillämpa en enkel impuls när spelaren utför en handling, som att hoppa eller skjuta.
4. **Begränsa rörelsen**:
- För att undvika överdriven rörelse eller otillåtna positioner kan du använda kollisionshantering för att begränsa spelarens rörelse till områden som tillåts av spelets design.
- Detta kan uppnås genom att använda `Area2D`-noder med kollisionsformer för att definiera områden där spelaren kan röra sig fritt och tillåta eller förhindra rörelse beroende på träff på kollisioner.
Genom att implementera spelarstyrning på detta sätt kan du ge spelaren responsiv och kontrollerad rörelse över `RigidBody2D`-objektet, vilket är användbart för att skapa olika typer av spel, som plattformsspel, arkadspel och äventyrsspel.
## Ständig kollision
Continuous collision detection (CCD) är en teknik som används för att förbättra kollisionshantering i fysikmotorer. Istället för att bara upptäcka kollisioner när två objekt redan kolliderar, försöker CCD förhindra att objekt penetrerar varandra genom att spåra deras rörelse mellan två fysiksteg och upptäcka en kollision innan den inträffar.
I fallet med RigidBody2D-noder i Godot är CCD inte standardaktiverat av flera anledningar:
1. **Prestanda**: CCD är mer beräkningsintensivt eftersom det innebär att flera kontrollsteg måste utföras för varje fysikuppdatering. För spel med stora mängder rörliga objekt kan detta påverka prestandan negativt.
2. **Standardanvändning**: Många spel kräver inte CCD eftersom de inte har höga hastigheter där genomträngning är ett problem. För de flesta spel är den vanliga kollisionssimuleringen tillräcklig.
3. **Flexibilitet**: CCD kan vara överflödigt eller oönskat i vissa situationer, som t.ex. spel där fysikreglerna är mindre realistiska eller där manuellt finjusterad kollision hanteras.
Om du har en situation där CCD är nödvändigt eller önskvärt, kan du aktivera det för specifika RigidBody2D-noder i Godot. Detta görs genom att helt enkelt ställa in egenskapen `continuous_cd` till `true` i nodinställningarna eller med kod. Här är ett exempel på hur du kan aktivera CCD för en RigidBody2D-nod i GDScript:
```gdscript
extends RigidBody2D
func _ready():
# Aktivera continuous collision detection
continuous_cd = true
```
Genom att aktivera CCD på specifika noder där det behövs kan du använda den extra noggrannheten för att hantera höghastighetskollisioner på ett tillförlitligt sätt utan att påverka prestandan för hela spelet.
## Begränsa ett hopp
För att begränsa hoppet så att det bara kan ske när karaktären är nära marken kan du använda en RayCast i Godot. En RayCast är ett nodverktyg som skjuter ut en osynlig linje i en viss riktning för att upptäcka kollisioner med andra objekt. I detta fall kommer vi att använda en RayCast som skjuter nedåt från karaktären för att kontrollera om den befinner sig nära marken.
Här är hur du kan göra det:
1. **Skapa en RayCast-nod**: Lägg till en RayCast-nod som ett barn till din karaktärs nod i din Godot-scen.
2. **Justera RayCast-inställningarna**: Konfigurera RayCast-noden så att den strålar neråt från karaktärens position. Du vill att strålen ska vara tillräckligt lång för att nå marken från karaktärens aktuella position.
3. **Kontrollera RayCast-kollision**: I din skriptfil för karaktären, kontrollera RayCast-noden för kollision. Om strålen träffar marken betyder det att karaktären är nära marken och därmed kan hoppa.
Här är ett exempel på hur detta kan implementeras i GDScript:
```gdscript
extends RigidBody2D
onready var raycast = $RayCast2D
var jump_impulse = 500
var can_jump = false
func _physics_process(delta):
# Kontrollera om RayCast träffar marken
if raycast.is_colliding():
can_jump = true
else:
can_jump = false
# Hantera hopp
if Input.is_action_pressed("jump") and can_jump:
apply_impulse(Vector2.UP * jump_impulse)
can_jump = false
```
I det här exemplet, när karaktären trycker på hoppknappen ("jump") och RayCast träffar marken, appliceras en impuls uppåt för att utföra ett hopp. Variabeln `can_jump` används för att hålla reda på om karaktären är nära marken. RayCast-noden måste vara ordentligt placerad och justerad så att den strålar från karaktären ned mot marken. Du kan också justera längden på strålen för att passa din spelvärld.
##Upptäcka saker
En `Area2D` är en nodtyp i Godot som representerar ett område i två dimensioner, vanligtvis definierat av en geometrisk form såsom en kvadrat, cirkel eller polygon. `Area2D` används främst för att detektera överlappningar och kollisioner med andra objekt i spelet utan att påverka deras fysik eller rörelse direkt.
Huvudsakligen används `Area2D` för:
![](https://docs.godotengine.org/en/stable/_images/area2d_coin_nodes.webp)
OBS, en Area2D behveör inte ha en Sprite, den kan vara t.ex. osynlig
1. **Överlappningsdetektion**: Du kan placera en `Area2D` över ett område av intresse och sedan kontrollera om andra objekt överlappar med detta område. Det är användbart för att aktivera händelser eller utföra åtgärder när andra objekt kommer in i eller lämnar ett visst område, såsom att aktivera en trigger när en spelare går igenom en dörr.
2. **Kollisionsdetektion utan fysik**: Till skillnad från `CollisionShape2D` och `RigidBody2D`, påverkar inte `Area2D` andra objekts fysik eller rörelse. Det är användbart för situationer där du bara vill veta när objekt överlappar utan att orsaka en fysikalisk respons, som att upptäcka när en spelare går in i ett område utan att förhindra deras rörelse.
3. **Sensorer och utlösare**: `Area2D` fungerar bra som sensorer och utlösare i spelet. Du kan använda dem för att upptäcka när spelare eller andra objekt kommer in i eller lämnar vissa områden för att utlösa händelser eller skapa komplexa spellogiker.
`Area2D` ger stor flexibilitet när det gäller att skapa interaktioner och händelser i ditt spel utan att kräva komplicerade fysikberäkningar eller direkt påverkan på objektens rörelse.
## Friktion och annat
I Godot hanteras friktionen för olika ytor genom användning av fysikmaterial och ytkonfigurationer. Här är hur det vanligtvis görs:
[**Fysikmaterial**](https://docs.godotengine.org/en/stable/classes/class_physicsmaterial.html#class-physicsmaterial):
- I Godot kan du skapa och konfigurera fysikmaterial för att definiera egenskaper såsom friktion, återställningsförmåga och elasticitet för olika ytor.
- Du kan skapa flera olika fysikmaterial och tilldela dem till specifika kroppar eller ytor i din spelvärld.
[Area2Ds som fysikmaterial.](https://docs.godotengine.org/en/stable/tutorials/physics/using_area_2d.html)
- En Area2D kan användas för att inom areans område överskrida genrella egenskaper som gravitation, linear och angular damp, för att t.ex. vädns på gravitation, skapa ett svart hål, sakta ner en rigidbody vid passage genom ett område.
`linear_damp` och `angular_damp` är egenskaper på en `RigidBody2D`. Genom att justera dessa värden kan du kontrollera hur snabbt och smidigt objektet bromsar eller slutar rotera när inga externa krafter appliceras. Här är hur de kan användas för att beskriva friktion:
1. **linear_damp**:
- `linear_damp` styr objektets förmåga att sakta ner sin linjära hastighet över tid när inga krafter appliceras på det.
- Genom att öka `linear_damp`-värdet kan du simulera högre friktionskrafter, vilket resulterar i att objektet bromsar snabbare när det inte påverkas av externa krafter.
- En hög `linear_damp`-nivå kan återskapa effekterna av kraftigare friktion på ytor som exempelvis golv eller väggar.
2. **angular_damp**:
- `angular_damp` styr objektets förmåga att sakta ner sin rotationshastighet över tid när inga kraftmoment appliceras på det.
- Genom att öka `angular_damp`-värdet kan du simulera högre friktionskrafter som motverkar objektets rotation, vilket resulterar i att det snabbare stannar att rotera.
- Användning av höga `angular_damp`-värden kan återskapa effekten av friktion som bromsar rotationen av ett objekt, såsom en boll som rullar över ett grovt underlag.
## Skapa markkomponenter i form av statisk kropper för återanvändning
## Skapar en `RigidBody2D`-spelarnod.
## Koppla en Area2D till Spelar-scriptet
## Skapa och lägg till fysikmaterial
## Skapa en utanför-Area2D som start
## Skapa en start-scne med meny som sedan startar en spel-scen.
Sidansvarig: infomaster
Senast uppdaterad: 2024-04-23