1

对monogame来说很新(确切地说是android的mono),但是通过一些youtube教程,这个过程相当轻松。我正在尝试覆盖一些函数(来自“XNA 库项目”dll),我可以很好地覆盖所有函数。但是,当我尝试覆盖作为参数传入 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 跑酷安卓

我绝对确定该方法存在,因为 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) 函数的类有完全相同的问题。

4

1 回答 1

0

结果我传入了一个 MonoGame spritebatch,其中库需要一个 XNA spritebatch。我用 MonoGame 在一个单独的项目中重新编译了库,所有问题都得到了解决。

于 2012-12-18T04:55:24.957 回答