C# MonoGame Help? (Content.Load<Texture2D>("Invader");) - c#

I am Making a Space Invaders Game using Open GL in MonoGame and I am trying to load a texture that I have added to the Content folder (It is a PNG file called "Invader")
The code that I use is:
invader = Content.Load<Texture2D>("Invader");
However when I attempt to run it It says:
ContentLoadException was unhandled could not load Invader as a
non-content file!

I am trying to load a texture that I have added to the Content folder (It is a PNG file called "Invader")
invader = Content.Load("Invader");
Actually, you can load the PNG content that has been added to the Content folder directly like so:
invader = Content.Load<Texture2D>("Invader");
Note that the filename is case senitive on some platforms so be careful that it matches exactly. Also, make sure you've set the file to Content / Copy if newer in the Properties window.
The alternative is to compile your assets into optimized binary XNB files using the XNA Game Studio Content Pipeline or the MonoGame Content Pipeline. This will give you better performance but carries extra development overhead.
I should also mention that when rendering your sprites as raw PNG files you should use BlendState.NonPremultiplied in the call to SpriteBatch.Begin for best results. I've been doing it this way in my games for a while and I'm pretty happy with the results.

MonoGame does not fully implement the content manager. Typically, you build the content separately, and import the built content files into your project. Then you can load them as usual.
To build the content files, you can use an XNA or MonoGame content builder such as this one. If you prefer, you can use command lines as part of your project's build process so that content is built automatically.

Make sure your Build Action is set to Content for the .png in question. Do this by right clicking the file and selecting properties.

Related

Output image with build

I am using MigraDoc, and would like to insert an image in a document. The simplest way to do this, is to provide a path for the image file (rather than having it in the resources). So what I would like to do is, to include an image as a file, alongside the other files in the build. Then MigraDoc can use the image based on relative path.
But I have no clue how to do this or if it is even possible. So can I make my project include an image file, outside the resources.
P.S. I know that there is a work around, where you include the image in the resources, save it in a temporary folder before MigraDoc has to use it. It just seems like a simpler design, if the image is always available.
P.P.S. There is a work around, to make MigraDoc use images from the project resources (see accepted answer).
As shown on the MigraDoc site you can use images you have as a byte[] to create PDF files. This can easily be used with images from resources (as shown on the site).
You just convert the image resource to a special string and pass that string where MigraDoc expects a filename.
static string MigraDocFilenameFromByteArray(byte[] image)
{
return "base64:" +
Convert.ToBase64String(image);
}
Link to official MigraDoc site:
http://www.pdfsharp.net/wiki/MigraDoc_FilelessImages.ashx
And MigraDoc can also use images that are stored in the program folder with your assemblies. You can use the Assembly class to find out where your assembly is stored and search that folder for images that should be there. This has nothing to do with MigraDoc, just some basic .NET features.

Working with BitMaps (PNG files) in XNA, System.drawing not available

I am sorry that this is a little bit ambiguous. I am having an issue using System.Drawing in XNA; from my research it is not available to XNA (since its part of the windows.dll?)
I want to create a sprite sheet analyzer which automatically dissembles a sprite sheet into its proper segmentation, number of frames, etc. for later playback. For this I need to grab the actual PNG file and it would be nice to have something that already has the functionality for working with images. Is there a class in XNA which provides similar functionality as System.drawing?
You can use System.Drawing in conjuction with XNA with no problem -- you just have to add a reference to it in your XNA project. However, System.Drawing does not support loading of .pngs, while XNA does.
The usual way to load images in XNA is to first add them to your content project (usually when you create an XNA project there is always a corresponding content project created). Add the saved .png to your content project and give it a unique name. Then in your code, load the image as a Texture2D:
Texture2D myTexture = Content.Load<Texture2D>("my image name");
Note the use of Content which is a ContentManager object that can be referenced from the Game object you are currently using for your XNA game.
Check this out for more information.
I found the answer. I can actually obtain the color data from the texture2D, allowing me to disassemble an image for analysis without using any extra libraries outside of XNA
http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Texture_to_Colors.php

Handle lots of images in C# application

I'm trying to create a card game in C# and for this I have alot of images that I need to load. They're all jpg images and there are about 7000 of them.
I would like to make sure that if you download the game, the images will not be easily accessible, meaning that they should not just be JPG images in a sub folder of the application. So I thought about imbedding them in a DLL file.
But how do I do this? And how do I handle this efficiently? Is there a tecnique to this sort of thing, or is another method preferable?
I would like to make sure that [...] the images will not be easily accessible
First, you should ask yourself why you want to forbid this. If you just want to avoid that someone else manipulates the pictures, you can leave them in a bunch of subfolders as JPGs, just generate checksums for each file and check them at the time the program loads the pictures.
If you want to avoid reuse of the pictures, you can leave them in a bunch of subfolders, but not as JPGs. Encode them with for example with the standard AES algorithm. But beware, that won't prevent anyone else of making screenshots while you application is running, so you should consider if that's really worth the effort.
EDIT: if you want to embed the images because installation gets easier when you have just one big file to deploy instead of 7000 single files, then you may write a helper program for creating resource files programmatically. See this page from Microsoft, especially the part about .resource files, to learn how to utilize the ResourceWriter class for that purpose.
If you have 7000 image, you need a database. Microsoft SQL Server Compact 4.0 is an option. It's small and easy to use.
I'm assuming that this is a windows application
In order to Embed a Image to the assembly
1. Right click the Image file and Select properties
2. In the Properties Pane Set the BuildAction as Embeded resource
So this Image becomes a embeded resource when the application is compiled
Then you can access the Image from the assembly like:
global::[[MyNameSpace]].Properties.Resources.[[ImageName]]
for eg:this.pictureBox1.Image = global::[[MyNameSpace]].Properties.Resources.[[ImageName]]

How to load user generated png images as textures (not xnb's)?

The idea is to let users create their own textures, put them in a folder as images (and maybe set some properties in a separate text file) for the game to load and work accordingly.
Usually I have my own textures as images, they are processed by Visual Studio when compiling, and then the game uses XNB files. But how about end users that don't have VS installed?
UPD: The only safe option (that doesn't require manual resource disposal) seems to be replacing the original resource files in XNB format. For that, you can process your own PNG, WAV and other files with this tool from codeplex and put them in content folder of the game.
if you works in windows only... (not xbox and not windows phone)
you can use Texture2d.FromStream(File.OpenRead(path));
You have to realize that this way, you should call the texture dispose method when the texture is not needed to free resources.
Wehn you use the content manager, is the manager who call the method when the game ends.

C#.NET: a library that outputs the same file

You have a library, and one of the function in the library provides a functionality that, among other things output a file (maybe to different paths in every execution). The content and the name of the file is constant in each execution. What is the best way to carry this out? declare the content of the file as a string and print it each time (probably not a good idea, the file is around 1000 lines long)? or have a file which always exist in the same folder as the library dll? How to make sure that the compiler will always include this file? Or is there any better way, for example embedding the file to the dll somehow?
Note that outputting this file is not the only thing that the library do, it's one of the subtasks that is done by a function in the library
Thanks!
If the content is going to be the same in every case and it's non-trivial (i.e. you couldn't just write it out in a couple of small lines of code) then embed it as a resource file in the assembly.
Then you can just use Assembly.GetManifestResourceStream to get an input stream, and copy the data out to a file. (If you're using .NET 4.0, you can use the Stream.CopyTo method and you're done.)
You can create a Resource file in your VS2010 project and have typed access to the file as a static member of an automatically generated class. The resource will then be embedded automatically as well.
Try Add New Item -> Resources File. Once the file is created, drag your file onto the designer surface.
Alternatively there is the file.copy method http://msdn.microsoft.com/en-us/library/system.io.file.copy(VS.71).aspx
You can just include the file with your project (Add existing item) and copy it whenever needed.

Categories