Autor Wątek: Tworzenie się obiektów [XNA]  (Przeczytany 1280 razy)

Offline justinbieber

  • Użytkownik

# Czerwiec 05, 2010, 20:12:15
Witam, mam taki mały problem.
Pobrałem plik kolizji i samo się tworzenia obiektów aby móc go podpiąć pod mój program.
I niby zrobiłem klase z tworzeniem się obiektów ale cały czas są błędy. Wszystko jest tak samo tylko że tam jest w game.cs wszystko w jednej klasie a ja chce to przenieść do nowej klasy i tak samo kolizja ma być w nowej klasie. No ale błędy są.

http://www.2shared.com/file/IC5WO_o6/RectangleCollision.html  -> a tutaj jest ten program z którego chce to skopiować

Ogólnie po prostu tylko nie wiem czemu te tworzenie się obiektów nie działa, z podpięciem kolizji sobie poradzę.

Tutaj jest klasa Meteory
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;

namespace GRA
{
    class Meteory : Statek
    {
        GraphicsDeviceManager graphics;
        Texture2D meteorTexture;
        SpriteBatch theSpriteBatch;

        List<Vector2> meteorPositions = new List<Vector2>();
        float meteorSpawnProbability = 0.01f;
        const int meteorFallSpeed = 2;

        Random random = new Random();


        public override void LoadContent(ContentManager theContentManager)
        {
            base.LoadContent(theContentManager, "statek");
            theSpriteBatch = new SpriteBatch(graphics.GraphicsDevice);
        }

        public override void Update(GameTime theGameTime)
        {


            for (int i = 0; i < meteorPositions.Count; i++)
            {
                meteorPositions[i] = new Vector2(meteorPositions[i].X,
                        meteorPositions[i].Y + meteorFallSpeed);

                Rectangle meteorRectangle = new Rectangle((int)meteorPositions[i].X, (int)meteorPositions[i].Y,
                        meteorTexture.Width, meteorTexture.Height);

                if (random.NextDouble() < meteorSpawnProbability)
                {
                    float x = (float)random.NextDouble() *
                        (Window.ClientBounds.Width - meteorTexture.Width);
                    meteorPositions.Add(new Vector2(x, -meteorTexture.Height));
                }
            }
            base.Update(theGameTime);

        }

        public override void Draw(SpriteBatch theSpriteBatch)
        {
          foreach (Vector2 meteorPosition in meteorPositions)
                theSpriteBatch.Draw(meteorTexture, meteorPosition, Color.White);

            base.Draw(theSpriteBatch);
        }
    }
}
błędy są takie:
Error   1   The name 'Window' does not exist in the current context   C:\Users\Shak33\Documents\Visual Studio 2008\Projects\GRA\GRA\Meteory.cs   36   22   GRA


Nie rozumiem za bardzo o co chodzi ???

//edit
naprawiłem to z zbyt wcześnie zamknełem for'a i działa ale i tak przy kompilacji jest dalej błąd z window tego się w ogóle nie moge doszukać w tym programie.
« Ostatnia zmiana: Czerwiec 05, 2010, 21:04:59 wysłana przez justinbieber »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline nilphilus

  • Użytkownik
    • wordpress

# Czerwiec 05, 2010, 20:26:36
no ale widać przeca czego nie masz ;-)

poza tym, gdzieś Ci się pogubiły { }, bo próbujesz używać zmiennej 'i' (iteracyjna z for) poza obrębem pętli, czyli wtedy kiedy już ta zmienna nie istnieje.

Offline justinbieber

  • Użytkownik

# Czerwiec 05, 2010, 20:31:34
tak tak właśnie przed chwilą to zauważyłem ;D ale także bardzo dziękuje, bo cały czas siedze nad tymi kodami i już mi się troszke miesza. Lecz dalej jest błąd z Window, tego się natomiast w ogóle nie moge doszukać w tym oryginalnym programie...

Offline KrissM

  • Użytkownik

# Czerwiec 25, 2010, 00:00:56
nie wiem czy to jeszcze aktualne ale dla potomnych, Window to właściwość klasy Game (z tego co pamiętam udostępniająca informację o oknie gry wielkość, położenie itp) niestety w twojej klasie nie ma takiej właściwości (jest w klasie Game) i dlatego ten błąd. Najprościej to chyba zrobić tak aby przy tworzeniu obiektu z klasy Meteor (lub Statek - bo z niej dziedziczy Meteor) przez kontruktor przekazać obiekt klasy Game i już.
Czyli coś w tym stylu : (pseudo kod)

class Meteor:Statek{
   Game _objectGame;

//kostruktor
public Meteor(Game _game)
{
  _objectGame=_game;
}


I teraz dalej możesz wywoływać Window np:
_objectGame.Window
}

Natomiast przy tworzeniu obiektu Meteor w klasie Game1 tworzysz go np. tak

public Meteor meteoTest=new Meteor(this);

oczywiście można to też inaczej próbować zrobić