Labirynt 2.0 14011 33

O temacie

Autor RafalBudzis

Zaczęty 15.08.2012 roku

Wyświetleń 14011

Odpowiedzi 33

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy

RafalBudzis

Labirynt 2.0
2012-08-15, 15:05(Ostatnia zmiana: 2012-08-20, 12:25)
Spoiler
Siemka mam 2 problemy można powiedzieć ze jestem początkującym w programowaniu obiektowym a wiec proszę o wyjaśnienie jak najprościej ;d

rozwiązany !
Spoiler
1) zderzenia obiektów mi działają tylko na 1 obiekcie ściany pozostałe się rysują prawidłowo lecz nie zatrzymują postaci gracza.

klasa

Public Class sciana
    Dim Texture As Texture2D
    Dim Rectangle_s As Microsoft.Xna.Framework.Rectangle
    Public Sub New(ByVal Texture2 As Texture2D, ByVal Rectangle2 As Microsoft.Xna.Framework.Rectangle)
        Texture = Texture2
        Rectangle_s = Rectangle2
    End Sub
    Public Sub Draw(ByRef SpriteBatch As SpriteBatch)
        SpriteBatch.Draw(Texture, Rectangle_s, Microsoft.Xna.Framework.Color.White)
    End Sub
    Public Sub zderzenia(ByRef rec As Microsoft.Xna.Framework.Rectangle, ByRef rec2 As Microsoft.Xna.Framework.Rectangle)
        If Rectangle_s.Intersects(rec2) Then
            rec2 = rec
        Else
            rec = rec2
        End If
    End Sub
End Class

LoadContent()

       sciany = New List(Of sciana)
        Dim a As sciana = New sciana(sciany_tex, New Rectangle(100, 100, 64, 64))
        sciany.Add(a)
        Dim b As sciana = New sciana(sciany_tex, New Rectangle(164, 100, 64, 64))
        sciany.Add(b)
        Dim c As sciana = New sciana(sciany_tex, New Rectangle(228, 100, 64, 64))
        sciany.Add(c)

Update()

       If (Keyboard.GetState().IsKeyDown(Keys.D)) Then
            prostakat3.X += 3
        End If
        If (Keyboard.GetState().IsKeyDown(Keys.A)) Then
            prostakat3.X -= 3
        End If
        If (Keyboard.GetState().IsKeyDown(Keys.S)) Then
            prostakat3.Y += 3
        End If
        If (Keyboard.GetState().IsKeyDown(Keys.W)) Then
            prostakat3.Y -= 3
        End If

        For Each sciana In sciany
            sciana.zderzenia(prostakat, prostakat3)
        Next
prostakat - obecne położenie gracza
prostakat3 - pozycja gracza po wykonaniu ruchu

Jeśli prostakat3 nie zachodzi na żadna ścianę to jego wartość otrzymuje pozycja gracza (prostokat) Jeśli zachodzi na ścianę otrzymuje swoją poprzednią pozycje (pozycje gracza). Ale nie wiem dlaczego działa to tylko przy pierwszej ścianie (100, 100, 64, 64) reszta ma pozycja gracza w dupie ;d


2) Mam pomysł ale nie mam dobrego optymalnego rozwiązania. Chciał bym zrobić światło tak jak w poprzedniej wersji mojej gry ale tym razem chciał bym aby było okrągłe oraz zatrzymywało się na ścianach nie mam pomysłu jak to sprawdzać i jak ograniczać obszar widoczności.

W 18 i 19 poście jeszcze w pełni nie działająca gra ale można się pobawić :)

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy

Ezzam

Labirynt 2.0
#1 2012-08-15, 15:12(Ostatnia zmiana: 2012-08-15, 16:01)
Do takiej gry będzie potrzebny bardziej skomplikowany system wykrywania kolizji. W edicie wszystko wytłumaczę.

Edit: Do rzeczy. Jeśli zachodzi kolizja między ścianą i graczem, obliczasz głębokość przecięcia i kierunek, z którego nastąpiło zderzenie. Później przesuwasz prostokąt gracza o głębokość przecięcia w obliczonym wcześniej kierunku i voilá. Nie mam teraz możliwości udostępnienia kodu, więc pokombinuj chwilę sam :P
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
nienawidzę zderzeń ;d  w poprzedniej wersji labiryntu zderzenia były w całości na samych if`ach ;d

Wiec gdy zobaczyłem

Rectangle.Intersects
to w twoim tutku zachciało mi znów coś porobić w grach ;d

Z resztą po co inne zderzenia skoro te działają idealnie lecz tylko na jednej ścianie jak zrobię te inne to nagle zacznie działać to na innych ścianach ? Bo mi się zdaje ze ten for coś źle działa albo coś z klasą nie ogarnąłem i źle coś dałem.

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy

Ezzam

Labirynt 2.0
#3 2012-08-15, 16:09(Ostatnia zmiana: 2012-08-15, 16:12)
Chyba znalazłem powód. Jeśli następuje kolizja z pierwszą ścianą, to kolizja jest rozwiązywana poprawnie. Dla drugiej i trzeciej ściany jest tak: sprawdzasz kolizję dla wszystkich ścian po kolei, więc brak kolizji ze ścianą nr. 1 powoduje przemieszczenie prostokąta gracza, przez co następuje brak poprawnego rozwiązania kolizji.

Edit: Można to rozwiązać za pomocą booleana - jeśli jest kolizja z którąkolwiek ścianą, boolean jest true. Dopiero po wykonaniu pętelki foreach przemieszczasz gracza.
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Aha czyli muszę przemieścić dopiero po pętli for dzięki już sobie poradzę ;) masz racje jesteś wielki ;d

A jakiś pomysł co do 2 problemu ? Bo się zastanawiam i nie wiem jak to wykonać. Nie chce kodu tylko jakąś wskazówkę

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy

Ezzam

Labirynt 2.0
#5 2012-08-15, 16:22(Ostatnia zmiana: 2012-08-15, 16:38)
Światło bazowane na tilesach mógłbyś symulować umieszczeniem czarnego tła za grą i modyfikowaniem przezroczystości obiektów. From the top of my head: teoretycznie powinno być możliwe zrobienie światła w postaci kaskady (każdy oświetlony tile oświetla sąsiednie, ze zmniejszającą się siłą). W takim przypadku ściany mogłyby wcale nie otrzymywać światła, dzięki czemu nie byłoby ono przekazywane dalej.

Edit: Z taką implementacją światła niemożliwe byłoby widzenie przez ściany, ale oświetlany byłby teren wokół krawędzi ścian.
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Miał byś może jakiś tutek ? Napisałeś to tak jak bym wiedział o co chodzi a ja narazie przeczytałem tylko 1 część twojego tutka Mógł byś powiedzieć coś więcej co do tej przeźroczystości ? bo nie widziałem parametru w draw odpowiadającego za przezroczystość.

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy

Ezzam

Labirynt 2.0
#7 2012-08-15, 17:05(Ostatnia zmiana: 2012-08-15, 17:07)
Za przezroczystość odpowiada Color. Działanie wygląda tak:
spriteBatch.Draw(tekstura, rectangle, Color.Jakikolwiek * alpha);Gdzie alpha to float o wartości od 0 do 1.
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
ha ha ha udało się ładnie działa :D

http://www.sendspace.com/file/l5jdcx

tam u góry są 4 klocki i pojawiają się przy podjechaniu :D

Teraz jak można by to przerobić żeby działało dal 2 graczy ?? Nie chodzi mi ani o ściany ani o zderzenia ale o "światło" bo światłem jest.



Więc jedno "światło" będzie nachodzić na 2 jakieś pomysły ?

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy
Spróbuj wywołać spriteBatch.Begin tak:
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive);Może nie wyglądać najlepiej, ale powinno działać ;)
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy

RafalBudzis

Labirynt 2.0
#10 2012-08-15, 21:12(Ostatnia zmiana: 2012-08-15, 22:08)
To by było dobre ale gdyby móc łączyć tylko 2 drawy bo przy takim czymś kulki na kolorze tracą bo są osobnymi warstwami nie łączonymi z "światłem" oraz ściany zyskują inny kolor od tego niebieskiego.

EDIT: Dobra rozwiązałem to inaczej nie dałem półprzeźroczystości i widać krawędzie no ale trudno przynajmniej działa fajnie ;d

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Okej jestem już przy końcu wiec mam nadzieje ze ostatnie pytanie Jak zapisać do XML`a listę klasy ? A potem ją odczytać ? Chodzi mi tu o plansze pobrałem kod funkcji eksportu i importu z XML`a ale nie umiem ich zastosować :/

klasa

   public class sciana_cut
    {
        int x;
        int y;
        public sciana_cut() {
            x = 0;
            y = 0;
        }
        public sciana_cut(int x1,int y1)
        {
            x = x1;
            y = y1;
        }
    }

kod export/import
       public static T FromXML<T>(string xml)
        {
            using (StringReader stringReader = new StringReader(xml))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                return (T)serializer.Deserialize(stringReader);
            }
        }

        public string ToXML<T>(T obj)
        {
            using (StringWriter stringWriter = new StringWriter(new StringBuilder()))
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
                xmlSerializer.Serialize(stringWriter, obj);
                return stringWriter.ToString();
            }
        }


eksportowanie

               StreamWriter sw = new StreamWriter("I:\\all\\Moje domumenty\\Visual Studio 2010\\Projects\\WindowsGame3\\WindowsGame3\\WindowsGame3\\plik.xml");
                sw.WriteLine(ToXML<List<sciana_cut>>(sciany_zapis));
                sw.Close();


wynik działania jest taki ze zapisuje mi tylko ilość elementów bez współrzędnych


<?xml version="1.0" encoding="utf-16"?>
<ArrayOfSciana_cut xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <sciana_cut />
  <sciana_cut />
  <sciana_cut />
  <sciana_cut />
  <sciana_cut />
  <sciana_cut />
  <sciana_cut />
  <sciana_cut />
  <sciana_cut />
  <sciana_cut />
  <sciana_cut />
</ArrayOfSciana_cut>

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy
Wybrałeś zły sposób serializacji (tzn. ten jest najlepszy, jeśli masz np. edytor map wbudowany w grę, ale kompletnie nie nadaje się do dostarczania gotowych map razem z grą). Content XNA jest przystosowany do odczytywania plików xml zapisanych poprzez IntermediateSerializer.
znowu proponuję rozwiązanie inne od twojego :lol:

Do projektu trzeba dodać dwa 'usingi':
using System.Xml;
using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate;
Drugi powinien być podkreślony. Trzeba zmienić target framework projektu na pełny .NET (project, properties, application, target framework). Jeśli nie można zmienić tego przez program, należy zmienić ręcznie - edytować w notatniku plik .csproj projektu i opróżnić tag <TargetFrameworkProfile> </TargetFrameworkProfile>Później do references gry trzeba dodaćMicrosoft.Xna.Framework.Content.PipelineNajbardziej męcząca część już za nami. Oto mój kod serializacji:
void Serialize()
        {
            Tile[][] tiles = this.tiles;

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;

            using (XmlWriter writer = XmlWriter.Create(derp.xml, settings))
            {
                IntermediateSerializer.Serialize(writer, tiles, null);
            }
        }
Deklarujesz zmienną lokalną (w tym przypadku Tile[][] tiles) równą mapie, którą chcesz zapisać. Do zmiany jest tu tylko nazwa pliku xml, oraz oczywiście ta zmienna.

Otrzymany plik xml zwyczajnie dodajesz do Content i wczytujesz go jak każdą inną rzecz:
tiles = Content.Load<Tile[][]>(derp);
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy

RafalBudzis

Labirynt 2.0
#13 2012-08-17, 12:34(Ostatnia zmiana: 2012-08-17, 13:28)
Okej zrobiłem na razie 1 plansze gdzie można sobie pochodzić bez celu ;)

EDIT: http://www.sendspace.com/file/gghppi
link podmieniony na grę z słabszymi ustawieniami graficznymi teraz pójdzie każdemu.

Co myślicie jak wam się podoba sterowanie ? czego byście oczekiwali jeszcze ?

tymczasowo zrobiłem taki eksport do pliku  :lol:  

                   temp2 = "sciany.Add(new sciana(sciany_tex, new Rectangle(" + (temp.X) + ", " + (temp.Y) + ", 32, 32)));";
                    sw.WriteLine(temp2);

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Oznacz w swojej klasie atrybuty:
  public class sciana_cut
   {
        [XmlAttribute("Sciana")]
        public string sciana;
        [XmlElement("X")]
        int x;
        [XmlElement("Y")]
        int y;
        public sciana_cut() {
            x = 0;
            y = 0;
        }
        public sciana_cut(int x1,int y1)
        {
            x = x1;
            y = y1;
        }
    }

Później jak utworzysz swoje obiekty, to wywołasz metodę:
public void zapisz_do_xml()
{
   List<Sciana> lista_scian = new List<Sciana>();

   XmlRootAttribute korzen_atrybuty = new XmlRootAttribute();
   korzen_atrybuty.ElementName = "dane_sciany";
   korzen_atrybuty.IsNullable = true;
   XmlSerializer serializator = new XmlSerializer(typeof(List<Sciana>), korzen_atrybuty);
   StreamWriter strumien_zapisu = null;

   try
   {
       strumien_zapisu = new StreamWriter("sciany_serializacja.xml");
       serializator.Serialize(strumien_zapisu, lista_scian);
   }
   catch (Exception oException)
   {
       Console.WriteLine("Aplikacja wygenerowała następujący wyjątek: " + oException.Message);
   }
   finally
   {
      if (null != strumien_zapisu)
      {
         strumien_zapisu.Dispose();
      }
   }
}

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy

Ezzam

Labirynt 2.0
#15 2012-08-17, 14:05(Ostatnia zmiana: 2012-08-17, 14:12)
Z tego co wiem, oznaczanie XmlAttribute jest niepotrzebne. Przykładowo mój plik xml (zrobiony IntermediateSerializerem) wygląda tak:
<?xml version="1.0" encoding="utf-8"?>
<XnaContent>
  <Asset Type="EzzTile.Tile[][]">
    <Item>
      <Item>
        <Rectangle>0 0 16 16</Rectangle>
        <IsVisible>false</IsVisible>
        <CanCollideLeft>true</CanCollideLeft>
        <CanCollideRight>true</CanCollideRight>
        <CanCollideUp>true</CanCollideUp>
        <CanCollideDown>true</CanCollideDown>
      </Item>
      <Item>
        <Rectangle>16 0 16 16</Rectangle>
        <IsVisible>false</IsVisible>
        <CanCollideLeft>true</CanCollideLeft>
        <CanCollideRight>true</CanCollideRight>
        <CanCollideUp>true</CanCollideUp>
        <CanCollideDown>true</CanCollideDown>
      </Item>
I tak dalej, przez 1500 elementów.

Edit: tutorial na ten temat:
http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Tak, można tak zrobić, ale lepiej jest wiedzieć, co oznacza dany znacznik, czym się różni atrybut xml od elementu xml.

Atrybut jest czymś samodzielnym, np. kolor, ID, nazwa, służy do zapisywania meta-informacji. Atrybuty mogą przyjmować tylko wartości w postaci ciągu znaków.
Natomiast element jest czymś, co ma lub może mieć atrybuty własne lub zawierać inne elementy oraz nie może mieć dwóch lub więcej atrybutów o tej samej nazwie.

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
http://www.sendspace.com/file/b8wubw

Malusieńka wersja do pogrania trochę ma 6 lvl do przejścia.

6 lvl zrobił paser  :lol:  

I teraz takie ogłoszenie był by ktoś zainteresowany zrobić ładniejszą graficzkę dla gry  :lol:  ?

Jak by ktoś chciał zobaczyć swoją plansze w grze też jest taka opcja piszcie na PW ;d

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy

RafalBudzis

Labirynt 2.0
#18 2012-08-20, 12:32(Ostatnia zmiana: 2012-08-20, 13:00)
Obyło się bez grafika ;d  jakoś ogarnąłem nie jest to jakiś szczyt grafiki ale lepiej wygląda ;d

http://www.sendspace.com/file/cel6qn

Zmiany:
- zmieniono grafiki tła menu, ścian, teleportu
- dodano "animacje" przejścia lvl
- dodano opcje w menu nowa gra (wcześniej nowa gra zamieniała się na powrót)
- dodano wskaźniki teleportu i gracza 2 jeśli obiekty będą poza ekranem
- lekko zoptymalizowano wyświetlanie ścian
- launcher wymaga frameworka 2.0 (wcześniej wymagał 4.0)

Niebieskooki

Niebieskooki

Użytkownicy
posty276
Propsy30
ProfesjaGracz
  • Użytkownicy
ze sie tak zapytam :D  Co to Framework 2.0 :D  

I czy to sa labirynty takie labiryntowe? I jest jakas nagroda za przejscie ? :D


Btw. Robiles to 4 fun ? Czy uczysz sie na tym  ?
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry