моноигра; Невозможно переопределить любые методы, в которых SpriteBatch является параметром.

Довольно новичок в моноигре (точнее, в моно для Android), но с некоторыми учебными пособиями на YouTube процесс был довольно безболезненным. Я пытаюсь переопределить некоторые функции (из dll "XNA library project"). Я могу переопределить все функции. Но когда я пытаюсь переопределить все, что передается в SpriteBatch в качестве аргумента, я получаю следующую ошибку:

Ошибка 5 «Parkour.Screens.EditorScreen.Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch)»: не найден подходящий метод для переопределения D:\Data\programming и т.п.\comps\TIGsport\XNA\Parkour\Parkour\Parkour\ Screens\EditorScreen.cs 117 30 ПаркурAndroid

Я абсолютно уверен, что метод существует, потому что проект XNA работает просто отлично. Функция Draw также появляется в автозамене в проекте mono for android. Но как ни странно, он исчез из автозамены после того, как я получил ошибку.

Вот весь класс, который содержит функцию переопределения, чтобы вы, ребята, могли быть уверены, что все в порядке.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;

namespace SimpleTilebasedLibrary.Utils
{
    public class LoopContainer<T> where T : ILoopable
    {
        protected List<T> _items = new List<T>();
        private List<T> _addList = new List<T>();
        private List<T> _removeList = new List<T>();

        public List<T> items
        {
            get{return _items;}
        }

        public virtual void add(T item)
        {
            //if (_addList.Contains(item)) return;
            //_addList.Add(item);
            _items.Add(item);
        }

        public virtual void remove(T item)
        {
            if (_removeList.Contains(item)) return;
            _removeList.Add(item);
        }

        public T get(int index)
        {
            return _items[index];
        }

        public T get(string name)
        {
            foreach (T item in items)
            {
                if (item.getName() == name)
                {
                    return item;
                }
            }

            return default(T);
        }

        public virtual void Update()
        {
            items.AddRange(_addList);
            _addList.Clear();

            foreach (T item in items)
            {
                if (item.status == Status.DEAD)
                {
                    _removeList.Add(item);
                    //break; //root of all evil
                    continue;
                }

                item.Update();
            }

            //remove
            foreach (T i in _removeList)
            {
                items.Remove(i);
            }
            _removeList.Clear();

        }

        public virtual void postUpdate()
        {
            foreach (T item in items)
            {
                item.postUpdate();
            }
        }

        public virtual void Draw(SpriteBatch spritebatch)
        {
            foreach (T item in items)
            {
                item.Draw(spritebatch);
            }
        }
    }
}

И класс, который пытается его переопределить

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SimpleTilebasedLibrary;
using SimpleTilebasedLibrary.Entities;
using SimpleTilebasedLibrary.Tilesystem;
using SimpleTilebasedLibrary.Services;
using Microsoft.Xna.Framework.Input;
using SimpleTilebasedLibrary.Components;
using SimpleTilebasedLibrary.Utils;
using SimpleTilebasedLibrary.UI;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Parkour.Screens
{
    public class EditorScreen : GameScreen //need to couple gamescreens with inputcontexts?
    {
        public ParkourWorld world;
        int currentTile = 0;
        GameObject tile;

        Checkbox editorEnabled;
        Checkbox solidCB;
        Checkbox autotileCB;

        public EditorScreen(ParkourWorld world)
            : base("editorscreen")
        {
            this.world = world;
            tile = new GameObject("tileset", 16, 16); //never actually tested this, doesn't work!
            tile.GetC<GraphicsC>().setScale(2, 2);
            //add(tile); //something fucks up the coordinates when you add it...

            editorEnabled = new Checkbox(Color.White, 10);
            editorEnabled.GetC<TransformC>().Y = 10;
            editorEnabled.GetC<TransformC>().X = 100;

            solidCB = new Checkbox(Color.Red, 10);
            solidCB.GetC<TransformC>().Y = 10;//30;
            solidCB.GetC<TransformC>().X = 120;
            //add(solidCB);

            autotileCB = new Checkbox(Color.Blue, 10);
            autotileCB.GetC<TransformC>().Y = 10;//50;
            autotileCB.GetC<TransformC>().X = 140;
            //add(autotileCB);

            editorEnabled.value = false;
        }


        public override void Update()
        {
            base.Update();

            if (GameServices.get<InputManager>().hasScrolledDown() && currentTile > 0)
            {
                currentTile--;
            }

            if (GameServices.get<InputManager>().hasScrolledUp() && currentTile < tile.GetC<GraphicsC>().totalFrames - 1) 
            {
                currentTile++;
                Console.WriteLine(currentTile);
            }

            tile.GetC<GraphicsC>().gotoAndStop(currentTile);

            //


            if (Mouse.GetState().LeftButton == ButtonState.Pressed && editorEnabled.value)
            {
                GameCamera camera = GameServices.get<CameraManager>().getActiveCamera();

                int x = TileMath.PixelToTile((Mouse.GetState().X + (camera.GetC<CameraC>().leftX * camera.GetC<CameraC>().zoom)) / camera.GetC<CameraC>().zoom, world.tilegrid.tileWidth);
                int y = TileMath.PixelToTile((Mouse.GetState().Y + (camera.GetC<CameraC>().UpY * camera.GetC<CameraC>().zoom)) / camera.GetC<CameraC>().zoom, world.tilegrid.tileHeight);

                if (Keyboard.GetState().IsKeyDown(Keys.Z))
                {
                    world.tilegrid.setTile(x, y, 0, null);
                    //world.tilegrid.getTile(x, y, 0).id = 1;
                    //world.tilegrid.getTile(x, y, 0).solid = false;
                }
                else
                {
                    Tile t = world.tilegrid.setTile(x, y, 0, currentTile);
                    if (t != null) t.solid = solidCB.value;

                    if(autotileCB.value)world.tilegrid.AutoTile(t, 0, x, y, true);
                    //world.tilegrid.setTile(x, y, 0, null);
                }
            }

            // enable and disable cb's //
            if (GameServices.get<InputManager>().wasKeyPressed(Keys.LeftShift))
            {
                solidCB.value = !solidCB.value;
            }

            if (GameServices.get<InputManager>().wasKeyPressed(Keys.Q))
            {
                autotileCB.value = !autotileCB.value;
            }

            if (GameServices.get<InputManager>().wasKeyPressed(Keys.E))
            {
                editorEnabled.value = !editorEnabled.value;
            }

            solidCB.Update();
            autotileCB.Update();
        }

        public override void Draw(SpriteBatch spritebatch)
        {
            base.Draw(spritebatch);
            tile.Draw(spritebatch);
            editorEnabled.Draw(spritebatch);
            solidCB.Draw(spritebatch);
            autotileCB.Draw(spritebatch);

            CameraC camera = GameServices.get<CameraManager>().getActiveCameraC();

            int width = TileMath.PixelToTile(camera.viewrect.Left + camera.viewrect.Width + (world.tilegrid.tileWidth * 2), world.tilegrid.tileWidth);
            int height = TileMath.PixelToTile(camera.viewrect.Top + camera.viewrect.Height + (world.tilegrid.tileHeight * 2), world.tilegrid.tileHeight);

            if (editorEnabled.value)
            {
                spritebatch.End();
                spritebatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, null, null, null, GameServices.get<CameraManager>().getActiveCameraC().getTransformation());

                //getTile(width - 1, 0).GetComponent<GraphicsC>().sprite.gotoAndStop(4);

                Rectangle rect = new Rectangle();
                Color trans = new Color(255, 0, 0, 10);
                for (int x = TileMath.PixelToTile(camera.viewrect.Left, world.tilegrid.tileWidth); x < width; x++)
                {
                    for (int y = TileMath.PixelToTile(camera.viewrect.Top, world.tilegrid.tileHeight); y < height; y++)
                    {
                        if (world.tilegrid.getTile(x, y, 0) != null)
                        {
                            if (!world.tilegrid.getTile(x, y, 0).solid) continue;
                            rect.X = x * world.tilegrid.tileWidth;
                            rect.Y = y * world.tilegrid.tileHeight;
                            rect.Width = world.tilegrid.tileWidth;
                            rect.Height = world.tilegrid.tileHeight;
                            spritebatch.Draw(GameServices.get<AssetManager>().CreateColoredTexture(trans), rect, Color.White);
                        }
                    }
                }

                spritebatch.End();
                spritebatch.Begin();
            }
        }


    }


}

Там много бесполезного материала для вас, ребята, но я хотел включить его только для полноты картины.

У меня точно такая же проблема с другим классом, в котором есть функция Draw (SpriteBatch), которую необходимо переопределить.


person omgnoseat    schedule 29.11.2012    source источник
comment
Наследуется ли «GameScreen» от «LoopContainer‹T›» где-то вдоль линии или он содержит собственный метод «Draw (SpriteBatch spriteBatch)»? Вы не можете «переопределить» метод другого класса без связи между ними.   -  person Darren Reid    schedule 30.11.2012
comment
Не могли бы вы включить код для вашего «GameScreen»   -  person Darren Reid    schedule 30.11.2012
comment
Я понимаю, что мой код был не совсем ясен. Да, он наследуется от GameScreen. С другой стороны, я думаю, что, возможно, узнал, в чем проблема, но я не совсем уверен. DLL, которую я загружаю, была скомпилирована с помощью XNA framework. Может быть, мне следует сначала скомпилировать его в моногейм-проекте? Я предполагаю, что для базовой функции требуется Microsoft SpriteBatch, а EditorScreen имеет параметр MonoGame SpriteBatch?   -  person omgnoseat    schedule 30.11.2012
comment
И XNA, и MonoGame должны иметь одинаковую сигнатуру метода, но вместо того, чтобы ссылаться на скомпилированную DLL, вставьте библиотеку в свое решение и укажите ссылку на MonoGame. Я не думаю, что это будет проблемой, но может быть.   -  person Darren Reid    schedule 30.11.2012


Ответы (1)


Оказалось, что я передавал пакет спрайтов MonoGame, где библиотека требовала пакет спрайтов XNA. Я перекомпилировал библиотеку в отдельный проект с MonoGame и все проблемы решены.

person omgnoseat    schedule 18.12.2012