gpt4 book ai didi

c# - XNA 无法将 2D Sprite 表的一部分绘制到屏幕,结果是黑线

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:45 25 4
gpt4 key购买 nike

我目前正在尝试使用下面的代码渲染 2D Sprite 表,结果是只渲染图像的背景颜色,黑色线条穿过它。使用 gimp 将图像保存为 .png 文件。

我已经用从网上下载的随机 Sprite 表进行了测试,它们渲染得很好。有没有一种方法可能会错误地保存我的 png 文件?

框架大小应为 27 x 27,这是实际图像文件的高度,然后是我希望框架的宽度。

这是我目前使用的工作表:

enter image description here

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;


namespace WindowsGame3
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

//Texture2D holds the image
Texture2D character;

//Holds position of character on screen
Vector2 Position = new Vector2(200, 200);

//Frames current size (W, H)
Point frameSize = new Point(27, 27);

//Which frame we are currently on
Point currentFrame = new Point(0, 1);

//How many frames on a line, followed by how many lines
Point sheetSize = new Point(13, 1);

//Sprite animation speed
float speed = 15;

//
KeyboardState currentState;
KeyboardState theKeyboardState;
KeyboardState oldKeyboardState;

enum State
{

Walking,
Punch,
Jump,
JumpForward,
JumpBackgwards


}

//First state we have when character is walking
State mCurrentState = State.Walking;

//Adjusts frames draw speed
TimeSpan nextFrameInterval = TimeSpan.FromSeconds((float)1 / 16);

//Changes each time we need to go to the next frame
TimeSpan nextFrame;

public Game1()
{
//Adjusts how fast things happen in XNA
TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 100);

graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}

/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here

base.Initialize();
}

/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);

// TODO: use this.Content to load your game content here

//Sprite sheet we are using
character = Content.Load<Texture2D>("MainSprite");


}

/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}

/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();

// TODO: Add your update logic here

base.Update(gameTime);
}

/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);

// TODO: Add your drawing code here


spriteBatch.Begin();

//Gives the name of the Texture2D variable, then the position.
//By creating a rectangle, only what is inside will be drawn on the screen.
spriteBatch.Draw(character, Position, new Rectangle(
frameSize.X * currentFrame.X,
frameSize.Y * currentFrame.Y,
frameSize.X,
frameSize.Y),
Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0);

//frameSize.X * currentFrame.X gives current position of frame on X. Same with Y.
//frameSize.X, frameSize.Y is the width and height of the current frame.

spriteBatch.End();

base.Draw(gameTime);
}
}
}

最佳答案

您的矩形已关闭。 X/Y 坐标(第一个索引)为 0/27;你需要 0/0。

黑线是 spritebatch 的产物,因为您告诉它绘制不存在的东西。坐标 0\27 处没有图像。

看看 Point currentFrame = new Point(0, 1);。您为 Y 分配的值为 1,但您需要为零。零基索引,请记住:)

关于c# - XNA 无法将 2D Sprite 表的一部分绘制到屏幕,结果是黑线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com