1

モノゲーム(正確にはアンドロイドのモノ)にはかなり新しいですが、いくつかのYouTubeチュートリアルでは、プロセスはかなり簡単でした. 一部の関数をオーバーライドしようとしています (「XNA ライブラリ プロジェクト」dll から)。すべての関数を正常にオーバーライドできます。しかし、SpriteBatch を引数として渡すものをオーバーライドしようとすると、次のエラーが発生します。

エラー 5 'Parkour.Screens.EditorScreen.Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch)': D:\Data\programming および such\comps\TIGsport\XNA\Parkour\Parkour\Parkour\ をオーバーライドする適切なメソッドが見つかりませんScreens\EditorScreen.cs 117 30 ParkourAndroid

XNA プロジェクトは問題なく動作するため、メソッドがそこにあることは間違いありません。Draw 関数は、mono for android プロジェクトのオートコレクトでもポップアップします。しかし、奇妙なことに、エラーを受け取った後、オートコレクトから消えたようです。

to be override 関数を保持するクラス全体を次に示します。これにより、何も問題がないことを確認できます。

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

ライブラリが XNA spritebatch を必要としていた MonoGame spritebatch を渡していたことが判明しました。MonoGame を使用して別のプロジェクトでライブラリを再コンパイルしたところ、すべての問題が解決しました。

于 2012-12-18T04:55:24.957 に答える