source: 2014/24/EemeliK/DigToChina/DigToChina/DigToChina/Kentta.cs @ 4965

Revision 4965, 4.3 KB checked in by taeekotr, 5 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6
7/// <summary>
8/// Tietorakenne pelikentän seinille.
9/// </summary>
10public class Kentta
11{
12    private GameObject[,] KentanOsat { get; set; }
13
14    private String ValeSeinienTag { get; set; }
15
16    /// <summary>
17    /// Luodaan uusi kentän tietorakenne.
18    /// </summary>
19    /// <param name="riveja">Kentän rivien määrä.</param>
20    /// <param name="sarakkeita">Kentän sarakkeiden määrä.</param>
21    public Kentta(int riveja, int sarakkeita, String valeSeinienTag)
22    {
23        KentanOsat = new GameObject[riveja, sarakkeita];
24        ValeSeinienTag = valeSeinienTag;
25    }
26
27    /// <summary>
28    /// Lisätään seinä tietorakenteeseen.
29    /// </summary>
30    /// <param name="rivi">Seinän rivi tietorakenteessa.</param>
31    /// <param name="sarake">Seinän sarake tietorakenteessa.</param>
32    /// <param name="lisattava">Lisättävä seinä.</param>
33    public void LisaaSeina(int rivi, int sarake, GameObject lisattava)
34    {
35        if (!TarkistaOlemassaolo(rivi, sarake, true)) return;
36            KentanOsat[rivi, sarake] = lisattava;
37    }
38
39    /// <summary>
40    /// Poistetaan seinän osa tietorakenteesta.
41    /// </summary>
42    /// <param name="x">Seinän rivi.</param>
43    /// <param name="y">Seinän sarake.</param>
44    public void TuhoaSeina(int rivi, int sarake)
45    {
46        if (!TarkistaOlemassaolo(rivi, sarake)) return; // ei tuhota olematonta
47        MuutaNaapuritKiinteiksi(rivi, sarake);
48
49        KentanOsat[rivi, sarake].Destroy();
50        KentanOsat[rivi, sarake] = null;
51    }
52
53    /// <summary>
54    /// Tarkistetaan, ettei jokin paikka ole null ja se on taulukon sisäpuolella.
55    /// </summary>
56    /// <param name="x">X taulukossa</param>
57    /// <param name="y">Y taulukossa</param>
58    /// <param name="saakoOllaVarattu">Jos true, ruutu saa olla jo varattu. Taulukon sisäpuolella olo tarkistetaan silti.</param>
59    /// <returns>True jos paikka on varattu ja taulukon sisäpuolella, muuten false.</returns>
60    private bool TarkistaOlemassaolo(int x, int y, bool saakoOllaVarattu = false)
61    {
62        if (x < 0 || x >= KentanOsat.GetLength(0)) return false;
63        if (y < 0 || y >= KentanOsat.GetLength(1)) return false;
64        if (!saakoOllaVarattu) // voidaan ohittaa vaatimus tyhjästä ruudusta
65            if (KentanOsat[x, y] == null) return false;
66        return true;
67    }
68
69    /// <summary>
70    /// Muutetaan tuhotun kentän osan naapurit kiinteiksi, jos ne eivät jo ole.
71    /// </summary>
72    /// <param name="x">Tuhotun osan X taulukossa</param>
73    /// <param name="y">Tuhotun osan Y taulukossa</param>
74    private void MuutaNaapuritKiinteiksi(int x, int y)
75    {
76        if (TarkistaOlemassaolo(x + 1, y))
77            if (KentanOsat[x + 1, y].Tag.ToString() == ValeSeinienTag) VaihdaSeinaKiinteaksi(x + 1, y);
78
79        if (TarkistaOlemassaolo(x - 1, y))
80            if (KentanOsat[x - 1, y].Tag.ToString() == ValeSeinienTag) VaihdaSeinaKiinteaksi(x - 1, y);
81
82        if (TarkistaOlemassaolo(x, y + 1))
83            if (KentanOsat[x, y + 1].Tag.ToString() == ValeSeinienTag) VaihdaSeinaKiinteaksi(x, y + 1);
84
85        if (TarkistaOlemassaolo(x, y - 1))
86            if (KentanOsat[x, y - 1].Tag.ToString() == ValeSeinienTag) VaihdaSeinaKiinteaksi(x, y - 1);
87    }
88
89    /// <summary>
90    /// Poistetaan läpi mentävä seinä ja laitetaan tilalle kiinteä kopio.
91    /// </summary>
92    /// <param name="x">Muutettavan X taulukossa</param>
93    /// <param name="y">Muutettavan Y taulukossa</param>
94    private void VaihdaSeinaKiinteaksi(int x, int y)
95    {
96        Kivi kiinteaseina = new Kivi(KentanOsat[x, y].Width, KentanOsat[x, y].Height, 1);
97        kiinteaseina.Position = KentanOsat[x, y].Position;
98        kiinteaseina.PosInLevel = KentanOsat[x, y].PosInLevel;
99        kiinteaseina.Image = KentanOsat[x, y].Image;
100        kiinteaseina.Color = KentanOsat[x, y].Color;
101        kiinteaseina.Kesto = (int)KentanOsat[x, y].Data[0];
102        kiinteaseina.Data = KentanOsat[x, y].Data;
103        kiinteaseina.CollisionIgnoreGroup = 1;
104        kiinteaseina.MakeStatic();
105        DigToChina.Peli.Add(kiinteaseina);
106        KentanOsat[x, y].Destroy();
107        KentanOsat[x, y] = kiinteaseina;
108    }
109}
Note: See TracBrowser for help on using the repository browser.