[C#/XNA] Camera2DLib 5774 5

O temacie

Autor Remix

Zaczęty 3.07.2013 roku

Wyświetleń 5774

Odpowiedzi 5

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O

Remix

[C#/XNA] Camera2DLib
2013-07-03, 12:31(Ostatnia zmiana: 2013-07-04, 21:30)
Siemkia! Chciałbym przedstawić mam moje ostatnie "dziecko" napisane w C#/XNA ułatwiające (przynajmniej początkującym) tworzenie i obsługę kamery 2D w grach XNA bez wykorzystywania macierzy. Biblioteka opiera się na kilku prostych klasach.

Spis klas:
Spoiler
Camera(CreateObjectCenter cObj, Control controls) - Podstawowa klasa biblioteki inicjująca działanie kamery oraz klawiszy do operowania nią

Metody
Update(int step, Object2D[] objects) - Aktualizuje kamerę o daną wartość (step), przesuwając/oddalając obiekty (objects) w stronę centralnego obiektu

Zoom(Object2D[] objects, int action, int value) - Powiększa lub zmniejsza "pole widzenia" kamery o wartość parametru "value" w zależności od wartości parametru "action", jeśli parametr "action" ustawimy na 0 zmniejszamy punkt widzenia (przybliżamy kamerę do sceny), a jeśli na 1 zwiększamy punkt widzenia (oddalamy się od sceny)

MoveCamera(Object2D[] objects, int x, int y) - Zmienia położenie kamery o dane wartości, parametry x i y przemieszczają kamerę wzdłóż osi x i y.


Spoiler
CreateObjectCenter(int x, int y, int w, int h, Texture2D tex) - tworzy obiekt centralny o podanych danych, pozycji x, y, wielkości, wysokości obiektu oraz danej teksturze

Metody
DrawObject(SpriteBatch sprite) - rysuje obiekt centralny

Spoiler
Control(Keys key_up_camera, Keys key_down_camera, Keys key_left_camera, Keys key_right_camera) - definiuje klawisze do obsługi kamery, kolejno: klawisz zmieniający położenie kamery w górę, dół, lewo i prawo

Metody
BRAK

Spoiler
Object2D(Texture2D tex, Rectangle rec) - definuje obiekt w przestrzeni 2D o podanej teksturze i Rectangle

Metody
Draw(SpriteBatch sprite) -- rysuje obiekt

Spoiler
DrawAllObjects(Object2D[] objects, SpriteBatch sprite) - Rysuje wszystkie obiekty (prócz obiektu centralnego)

Metody
BRAK

Przykład użycia biblioteki w aplikacji:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Camera2DLib;

namespace TestCam
{

    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        Texture2D[] tex = new Texture2D[2];

        CreateObjectCenter center;
        Camera cam;
        Control controlkey;
        Object2D[] array_objects = new Object2D[3];
       
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {

            tex[0] = Content.Load<Texture2D>("IMG_0001O");
            tex[1] = Content.Load<Texture2D>("IMG_0006");

            center = new CreateObjectCenter(150, 150, 30, 30, tex[0]);
            controlkey = new Control(Keys.Up, Keys.Down, Keys.Left, Keys.Right);
            cam = new Camera(center, controlkey);

            Object2D ob1 = new Object2D(tex[1], new Rectangle(2,5,30,30));
            Object2D ob2 = new Object2D(tex[1], new Rectangle(160,0,30,30));
            Object2D ob3 = new Object2D(tex[1], new Rectangle(500,0,30,30));

            array_objects[0] = ob1;
            array_objects[1] = ob2;
            array_objects[2] = ob3;

            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
        }

        protected override void UnloadContent()
        {
           
        }

        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            cam.Update(20, array_objects);

            if (Keyboard.GetState().IsKeyDown(Keys.F1))
            {
                cam.Zoom(array_objects, 0, 50);
            }

            if (Keyboard.GetState().IsKeyDown(Keys.F2))
            {
                cam.Zoom(array_objects, 1, 50);
            }
            cam.MoveCamera(array_objects,100,-100);

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            DrawAllObjects draw = new DrawAllObjects(array_objects, spriteBatch);

            center.DrawObject(spriteBatch);

            base.Draw(gameTime);
        }
    }
}


lub Pastebin

Sposób instalacji biblioteki w programie:
Spoiler
1. Pobierz bibliotekę z linku poniżej
2. Stwórz projekt gry Windows
3. Kliknij PPM w References
4. Wybierz "Add Reference"
5. W oknie dialogowym zaznacz zakładkę "Browse"
6. Wskaż lokalizację biblioteki
7. Wciśnij "OK" by dodać bibliotekę do projektu
8. Zacznij pisać grę z użyciem mojej biblioteki :)

Download:
Sendspace
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Szczerze mówiąc rozpisałeś to tak bardzo ze jest chujowe ;d

         array_objects[0].Draw(spriteBatch);
                array_objects[1].Draw(spriteBatch);
                array_objects[2].Draw(spriteBatch);
     
                center.DrawObject(spriteBatch);

Jak drukujesz wszystko bez begin i end to znaczy ze każdy obiekt ma swój render target ???

center chyba nie ma dostępu do obiektów 2D więc kolejne pytanie render target każdego obiektu jest rozmiaru ekranu ?? :D

Dlaczego nie ma takiej podstawy jak zoom kamery ??

No i dlaczego w klasie kamery zmieniasz punkt środka ekranu za pomocą klawiszy ??
Gra dla 2 graczy jest nie możliwa do zrobienia z tą "biblioteką"

i dlaczego zrobiłeś coś takiego ??
               Object2D ob1 = new Object2D(tex[1], new Rectangle(2,5,30,30));
                Object2D ob2 = new Object2D(tex[1], new Rectangle(160,0,30,30));
                Object2D ob3 = new Object2D(tex[1], new Rectangle(500,0,30,30));
     
                array_objects[0] = ob1;
                array_objects[1] = ob2;
                array_objects[2] = ob3;

tak tez działa xD :P
               array_objects[0] = new Object2D(tex[1], new Rectangle(2,5,30,30));
                array_objects[1] = new Object2D(tex[1], new Rectangle(160,0,30,30));
                array_objects[2] = new Object2D(tex[1], new Rectangle(500,0,30,30));

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O

Remix

[C#/XNA] Camera2DLib
#2 2013-07-04, 10:41(Ostatnia zmiana: 2013-07-04, 10:43)
@UP Rafał co do tego zooma itp. to jeszcze będę to rozwijał, co do tego "No i dlaczego w klasie kamery zmieniasz punkt środka ekranu za pomocą klawiszy ??", tego zapomniałęm usunąć XD Gra dla dwóch graczy rzeczywiście jest niemożliwa i możliwa raczej nie będzie bo od początku miałem zamiar stworzyć bibliotekę do singleplayer. Co do reszty to sproboje to poprawić w kolejnych Update :)

PS: Dzięki za konstruktywną krytykę :D

EDIT: Te dwa końcowe "cytaty kodu" to zrobiłęm już tak z przyzwyczajenia, zazwyczaj tak robię że najpierw definiuje obiekt klasy a potem wrzucam to do tablicy obiektów, i wiem że to jest złe :D
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O
Sorry za double post.

UPDATE 1.1

dodano: Klasę rysującą wszystkie obiekty, metody Zoom oraz MoveCamera, wszystko w pierwszym poście.

Jeszcze jakieś spostrzeżenia co do działania biblioteki?
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

hugo111

hugo111

Użytkownicy
Łukasz Pietuchowski
posty88
Propsy47
ProfesjaProgramista
  • Użytkownicy
  • Łukasz Pietuchowski

hugo111

[C#/XNA] Camera2DLib
#4 2013-07-13, 23:59(Ostatnia zmiana: 2013-07-14, 00:44)
Prosze o link do pobrania. Ten nie działa. Chciałbym sprawdzić jakość i dać od siebie komentarz.

--EDIT--
Udało Mi się pobrać wcześniejszą wersję biblioteki. Zajrzałem w kod i szczerze powiedziawszy, to spodziewałem się więcej. Praktycznie nic tam nie ma. Jeżeli tworzysz biblioteki to postaraj się więcej funkcji. Tyle kodu ile jest w tej aplikacji lepiej już napisać we własnym projekcie i znacznie milej byłoby zrobić jakiś tutorial : ).

Ale :ok:  za chęci : )
 

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O
Prosze o link do pobrania. Ten nie działa. Chciałbym sprawdzić jakość i dać od siebie komentarz.

--EDIT--
Udało Mi się pobrać wcześniejszą wersję biblioteki. Zajrzałem w kod i szczerze powiedziawszy, to spodziewałem się więcej. Praktycznie nic tam nie ma. Jeżeli tworzysz biblioteki to postaraj się więcej funkcji. Tyle kodu ile jest w tej aplikacji lepiej już napisać we własnym projekcie i znacznie milej byłoby zrobić jakiś tutorial : ).

Ale :ok:  za chęci : )

Ta, masz racje..I tak brakuje wiele rzeczy jest ubogo ale to zawsze moze byc podstawą do napisania czegoś więcej bez babrania się w takie rzeczy, a tylko to rozwijająć. Chociaż o wiele lepiej stworzyć kamerę na podstawie macierzy i viewportu. (Kiedy napisalem tą bibliotekę to jeszcze średnio rozumiałem macierze :) )
 
https://www.youtube.com/watch?v=TNdy0ea6gc4


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