Pong på XGS bild (6 / 36 steg)
Steg 6: Spelet konstruktioner - spelet logik - kollision upptäckt
Bollen har nu ett sätt att flytta på ett förutsägbart sätt, men hur bollen övergången mellan de olika staterna? Ganska logiskt, vissa spel händelser kommer att diktera övergångarna, men nästa steg är att definiera när förändringarna hända och till exakt vilken stat. Med denna design av Pong, vad som ska hända när bollen träffar toppen, och, analogt, botten av skärmen av lek? Bryta detta ned ytterligare, att slå upp på skärmen, bollen måste vara på väg uppåt. För att simulera en studsande effekt, måste bollen flyttas till den nedåtgående riktningen. När de olika boll-staterna var ovan, bollen har två nedåtriktade stater: antingen vänster eller höger.
Analysen måste nu fortsätta i ett enskilt fall. Därför antar bollen är på väg uppåt och vänster strax före kollisionen. Flytta nedåt är nästa logiska steg, men ska det fortsätta röra vänster eller växla till flytta rätt? Om bollen skulle övergången till en höger-flytta stat, skulle bollen återföra dess riktning längs diagonalen som det kom ifrån, aldrig flytta till andra sidan av skärmen. Det enda sättet för att nå andra sidan av skärmen av lek är att fortsätta i en vänstervridning riktning. En liknande situation rymmer när bollen rör sig uppåt och höger: Fortsätt att flytta till höger och byta till en nedåtgående riktning. De nedåtgående fall hanteras symmetriskt.
Exakt när ändringarna övergången hända? Detta kommer att innebära att definitionen av en kollision: två objekt vid vissa tillstånd av korsningen sägs kolliderar. I detta spel fallet kommer att med objekten faktiskt skär med varandra leda till grafiska avvikelser; Därför blir den exakta delstaten korsningen när objekten är tangent till en annan, eller helt enkelt röra men inte överlappande.
En diskussion av samordna planet är nu i ordning. I många språk, plottning pixlar fungerar på ett liknande sätt. Varje enhet i ett ordnat par är en pixel med x-koordinaten av pixlar från den vänstra bunden av skärmen och y-koordinaten mäta avståndet från toppen av skärmen. Låt den aktuella resolutionen vara X x Y, där X, Y > = 0. X beskriver den maximala bredden på skärmen medan Y betecknar höjden på skärmen. Det övre vänstra hörnet av skärmen är (0, 0), medan nedre högra hörnet är (X, Y). Om du vill rita en punkt 40 pixlar kvar och 20 pixlar ner, Använd de ordnat par (40, 20). Därför, den översta raden av skärmen kan beskrivas som (x, 0), medan rad av skärmen kan vara betecknas (x, Y), där 0 < = x < = X (se figur 1).
Det visar sig att (x, 0) och (x, Y) är kollision punkter inom skärmen av lek. För förra, den översta delen av bollen kommer att tangenten till den övre kanten av skärmen, och bollen behov till ändra till rätt staten innan faktiskt skär med överkanten. Eftersom alla våra spel objekt beskrivs med övre vänstra hörn, representeras varje spel objekt i data med någon sorts koordinatparet. Då fungerar nedre kanten fallet på samma sätt men med ett litet problem. Om bollens läge är någonsin lika med (x, Y), måste sedan det redan skär den nedre kanten av skärmen av lek. Eftersom bollen är ett torg med en konstant längd s, kan exakt samma tangent punkt nu enkelt beräknas. Genom att subtrahera s från Y, ger höjden på skärmen den punkt där bollens nedre kant är tangent till den nedre kanten av skärmen av lek. Representerar detta i koordinatparet form, varje möjlig kollision punkt kan representeras av (x, Y - s).
En liknande uppsättning kollisioner uppstår från fallet när bollen och paddel inte kollidera; i huvudsak scoring skick. Med hjälp av definitionen av samordna planet, (0, y) och (X, y) måste vara vänster- och gränserna för skärmen på lek, där 0 < = y < = Y. Eftersom övre vänstra hörnen på objekt används för att definiera deras läge, definitionen av vänstra kant, (0, y), kan användas för att hitta de Tangerande punkterna. Precis som när att hitta kollision poäng för de övre och nedre kanterna, utnyttjas ett fall definition av en kant men en offset som behövs för att hitta den exakta Tangerande punkten. Om bollens läge skulle lika (X, y), bollen skulle har redan genomskuren med högra kant. Sedan bollen har en bredd på s, ger (X - s, y) alla Tangerande punkter med den högra kanten av skärmen av lek.
Alla skärm kanten kollisioner har nu uttryckligen hanterats. De två sista fallen är något svårare, eftersom det är då bollen kolliderar med paddlar på vänster och höger sida av skärmen. Beräkningen är lik när du arbetar med vägg-liknande övre och nedre kanterna på skärmen av lek, men väggen begränsas nu, eller har en mycket specifik längd. Där kan bollen faktiskt kolliderar med en paddel?
För det första anser vänster paddeln. Låt h anger höjden på paddeln och w beskriver bredden i bildpunkter. Antar att det (px, py) är platsen för paddel och (bx, by) beskriva platsen där bollen. (Kom ihåg, dessa övre vänstra hörn.) För att hitta den kollision punkten, bör den högra kanten av paddeln användas. Eftersom bredden på paddeln är en konstant, (px + w, py) kommer att ge det övre högra hörnet av paddeln. Detta är nu den övre gränsen av punkterna som möjligt kollision med paddeln. Att hitta det nedre högra hörnet kommer att ge den undre gränsen, och därmed skapa alla möjliga punkter där bollen kan krocka med paddeln. Eftersom höjden på paddeln är en konstant, kan det nedre högra hörnet hittas genom att kombinera högerkant beräkning och h, ger (px + b, py + h). För att faktiskt kontrollera för kollisionen, jämför läge (bx, by) med (px + b, py + h). Så när bx = px + w och py < = by < = py + h, en kollision inträffar (se figur 2).
Högra paddeln har en symmetrisk fråga med beräkningar. Eftersom det övre vänstra hörnet används för att representerar platser, den vänstra kanten ges praktiskt, så alla punkter mellan (px, py) och (px, py + h) är de möjligt Tangerande punkterna. Men nu behövs den högra kanten av bollen att hitta kollisionen. Eftersom s är längden på en sidan av bollen, ger bx+ s det övre högra hörnet av bollen. Resonemanget ovan kan nu arbeta, så kollisionen inträffar exakt när bx + s = px och py < = by < = py + h.
En sista sak kvar för att diskutera: vad ska hända när bollen kolliderar med paddlar? Om bollen kolliderar med paddeln, då det övergripande statligt behov växla, annars bollen skulle gå igenom paddeln. Nästa uppenbara fråga innebär vertikal delstaten bollen. Antar att bollen kommer upp; sedan om bollen skulle vända sitt vertikala läge, eller gå ner, skulle sedan bollen tillbaka längs samma diagonal vägen eftersom bollen vänder dess övergripande statligt. Den vertikala staten bör därför samma.
En intressant trend märks nu mellan relationer med kollisioner och bollen staterna. Om bollen kolliderar med den övre eller nedre kanten, vänd vertikala staten. Om bollen kolliderar med en av paddlarna, en vänster eller höger kant så att säga, vänd det övergripande statligt.