- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试为我的游戏实现一个字体类,但在运行时我不断收到以下错误
Exception thrown: write access violation. this was nullptr.
在 Font.cpp 的初始化函数中
void Font::Init(ID3D11Device* device, ID3D11DeviceContext* deviceContext)
{
if (device != NULL && deviceContext != NULL)
{
m_spriteBatch = new SpriteBatch(deviceContext);//<----This line
m_spriteFont = new SpriteFont(device, L"Fonts/Arial.spritefont");
}
}
这是我的 Font.h
#ifndef FONT_H
#define FONT_H
#include <d3d11.h>
#include <directxmath.h>
#include <fstream>
#include "SpriteBatch.h"
#include "SpriteFont.h"
using namespace std;
using namespace DirectX;
class Font
{
public:
Font();
~Font();
void Init(ID3D11Device* device, ID3D11DeviceContext* deviceContext);
void Render();
private:
SpriteFont* m_spriteFont;
SpriteBatch* m_spriteBatch;
};
#endif
这是我的 Font.cpp
#include "Font.h"
#include "SimpleMath.h"
Font::Font()
{
m_spriteFont = NULL;
m_spriteBatch = NULL;
}
Font::~Font()
{
if (m_spriteFont)
{
delete m_spriteFont;
m_spriteFont = NULL;
}
if (m_spriteBatch)
{
delete m_spriteBatch;
m_spriteBatch = NULL;
}
}
void Font::Init(ID3D11Device* device, ID3D11DeviceContext* deviceContext)
{
if (device != NULL && deviceContext != NULL)
{
m_spriteBatch = new SpriteBatch(deviceContext);
m_spriteFont = new SpriteFont(device, L"Fonts/Arial.spritefont");
}
}
void Font::Render()
{
m_spriteBatch->Begin();
m_spriteFont->DrawString(m_spriteBatch, L"TEST", SimpleMath::Vector2(300, 300));
m_spriteBatch->End();
}
这是我的 GameScene.cpp
#include "GameScene.h"
#include "TextureShader.h"
GameScene::GameScene(void)
{
prevtime = 0;
collision = false;
Sprite_Box_Height = 0;
Sprite_Box_Width = 0;
}
GameScene::~GameScene(void)
{
if(m_player)
{
delete m_player;
}
if (m_enemy)
{
delete m_enemy;
}
if (m_ball)
{
delete m_ball;
}
if (m_timer)
{
delete m_timer;
}
}
bool GameScene::Initialize()
{
TextureShader* shader = (TextureShader*)ResourceManager::GetInstance()->GetShaderByName("texture.fx");
if(shader == NULL)
{
return false;
}
//create objects for all entities and initialize them
m_ball = new Ball();
m_ball->Initialize(Engine::GetEngine()->GetGraphics()->GetDevice(), Engine::GetEngine()->GetGraphics()->GetDeviceContext(), shader);
m_player = new Player();
m_player->Initialize(Engine::GetEngine()->GetGraphics()->GetDevice(), Engine::GetEngine()->GetGraphics()->GetDeviceContext(), shader);
m_enemy = new Enemy();
m_enemy->Initialize(Engine::GetEngine()->GetGraphics()->GetDevice(), Engine::GetEngine()->GetGraphics()->GetDeviceContext(), shader);
m_font->Init(Engine::GetEngine()->GetGraphics()->GetDevice(), Engine::GetEngine()->GetGraphics()->GetDeviceContext());
return true;
}
void GameScene::Update()
{
//Updade all Entities collision
m_player->Update();
m_enemy->Update();
m_ball->Update();
Collision();
}
void GameScene::Render(ID3D11DeviceContext* deviceContext, XMFLOAT4X4 viewMatrix, XMFLOAT4X4 projectionMatrix)
{
m_font->Render();
}
void GameScene::Collision()
{
//Get the current position of the ball and the player
BallPos = m_ball->GetBallPosition();
PlayerPos = m_player->GetPlayerPosition();
EnemyPos = m_enemy->GetPlayerPosition();
BallVel = m_ball->GetBallVelocity();
ballVelX = BallVel.m128_f32[0];
ballVelY = BallVel.m128_f32[1];
//Set the size of the sprite
Sprite_Box_Height = 50;
Sprite_Box_Width = 20;
//if there is a collision between the ball and a paddle get the current time
//and reverse the ball's velocity.
if (m_collision)
{
float currentTime = m_timer->GetTime();
//Wait for the ball to exit the area before setting collison back to false
//to prevent the ball from getting stuck
if (prevtime > currentTime - 100)
{
m_collision = true;
}
else
{
m_collision = false;
}
}
else
{
//#################################################################//
//set collision to true when the ball is in the area of the Paddle //
//check if ball is in the player's x vecinity //
//#################################################################//
//check if ball has near the same position player's paddle
if (BallPos.m128_f32[0] < PlayerPos.m128_f32[0] + Sprite_Box_Width && BallPos.m128_f32[0] > PlayerPos.m128_f32[0] - Sprite_Box_Width)
{
//check if ball hits the top of the player's paddle
if (BallPos.m128_f32[1] < PlayerPos.m128_f32[1] + Sprite_Box_Height && BallPos.m128_f32[1] > PlayerPos.m128_f32[1] - Sprite_Box_Height)
{
prevtime = m_timer->GetTime();
m_ball->SetBallVelocity(-ballVelX, ballVelY);
m_collision = true;
}
}
else if (BallPos.m128_f32[0] < PlayerPos.m128_f32[0] + Sprite_Box_Width && BallPos.m128_f32[0] > PlayerPos.m128_f32[0] - Sprite_Box_Width)
{
//check if ball is in the player's y vecinity
if (BallPos.m128_f32[1] < PlayerPos.m128_f32[1] + Sprite_Box_Height && BallPos.m128_f32[1] > PlayerPos.m128_f32[1] - Sprite_Box_Height)
{
prevtime = m_timer->GetTime();
m_ball->SetBallVelocity(-ballVelX, ballVelY);
m_collision = true;
}
}
else if (BallPos.m128_f32[0] < EnemyPos.m128_f32[0] + Sprite_Box_Width && BallPos.m128_f32[0] > EnemyPos.m128_f32[0] - Sprite_Box_Width)
{
//check if ball is in the player's y vecinity
if (BallPos.m128_f32[1] < EnemyPos.m128_f32[1] + Sprite_Box_Height && BallPos.m128_f32[1] > EnemyPos.m128_f32[1] - Sprite_Box_Height)
{
prevtime = m_timer->GetTime();
m_ball->SetBallVelocity(-ballVelX, ballVelY);
m_collision = true;
}
}
//###################################################################//
//set collision to true when the ball hits the edge of the screen //
//by checking if ball's position is passed the edge and sets it back //
//to a position just inside the screen //
//###################################################################//
//if the ball hits the TOP edge of the screen change ball's velocity
if (BallPos.m128_f32[1] > 300.0f)
{
prevtime = m_timer->GetTime();
m_ball->SetBallVelocity(ballVelX, -ballVelY);
m_collision = true;
}
//if the ball hits the BOTTOM edge of the screen change ball's velocity
else if (BallPos.m128_f32[1] < -300.0f)
{
prevtime = m_timer->GetTime();
m_ball->SetBallVelocity(ballVelX, -ballVelY);
m_collision = true;
}
//if the ball hits the RIGHT edge of the screen change ball's velocity
else if (BallPos.m128_f32[0] > 400.0f)
{
prevtime = m_timer->GetTime();
m_ball->SetBallVelocity(-ballVelX, ballVelY);
m_collision = true;
}
//if the ball hits the LEFT edge of the screen change ball's velocity
else if (BallPos.m128_f32[0] < -400.0f)
{
prevtime = m_timer->GetTime();
m_ball->SetBallVelocity(-ballVelX, ballVelY);
m_collision = true;
}
}
}
提前感谢您的帮助!!!
最佳答案
DirectX 工具包中的原因之一 tutorials我建议使用 std::unique_ptr
而不是原始指针,因为它确实简化了代码。
// Font.h
#pragma once
#include <d3d11.h>
#include <directxmath.h>
#include <fstream>
#include <memory>
#include "SpriteBatch.h"
#include "SpriteFont.h"
class Font
{
public:
Font() {}
void Init(ID3D11Device* device, ID3D11DeviceContext* deviceContext);
void Render();
private:
std::unique_ptr<DirectX::SpriteFont> m_spriteFont;
std::unique_ptr<DirectX::SpriteBatch> m_spriteBatch;
};
// Font.cpp
#include "Font.h"
#include "SimpleMath.h"
using namespace std;
using namespace DirectX;
void Font::Init(ID3D11Device* device, ID3D11DeviceContext* deviceContext)
{
if (device != NULL && deviceContext != NULL)
{
m_spriteBatch = std::make_unique<SpriteBatch>(deviceContext);
m_spriteFont = std::make_unique<SpriteFont>(device, L"Fonts/Arial.spritefont");
}
}
void Font::Render()
{
m_spriteBatch->Begin();
m_spriteFont->DrawString(m_spriteBatch.get(), L"TEST", SimpleMath::Vector2(300, 300));
m_spriteBatch->End();
}
You should avoid having
using namespace
statements in .h files as it basically defeats the whole purpose of using C++ namespaces in the first place. You should putusing namespace
statements only in .cpp files, and then use fully qualified names in headers.
从您发布的代码中没有明显的理由说明您为什么会收到异常。我建议您进入代码以查看异常的真正来源。如果您使用的是 NuGet,那么您可能希望改用项目到项目的引用。查看DirectX Tool Kit维基了解详情。
您可以尝试使用 Fonts\\Arial.spritefont
而不是 Fonts/Arial.spritefont
看看这是否有区别。
With modern compilers, the old-school C-style if
#ifndef FONT_H #define FONT_H .. #endif
is not necessarily. Just use#pragma once
.
注意:如果您使用的是 VS 2012 而不是 VS 2013 或 VS 2015,则无法使用 std::make_unique
。您可以改为执行以下操作:
m_spriteBatch.reset( new SpriteBatch(deviceContext) );
m_spriteFont.reset( new SpriteFont(device, L"Fonts/Arial.spritefont") );
关于C++ DirectX11 : NullPtr error using DirectX tool kit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34667559/
我正在尝试为我的学校作业制作信息亭程序。当我编译它时,它不会发出任何错误信号。但是当我尝试初始化我的队列列表时,它说我不能使用 nullptr...我不明白我的代码有什么问题。 typedef str
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 4 年前。 Improve
这个问题在这里已经有了答案: Placement of the asterisk in pointer declarations (14 个答案) 关闭 4 年前。 在博客和论坛上,我注意到人们使用
为什么std::string str(nullptr)和 std::string str=nullptr是错的?有人可以详细解释原因吗? 最佳答案 这样的例子编译是因为存在一个 std::string
这个定义有效: const auto &b{nullptr}; 虽然失败: auto *b{nullptr}; 我尝试在 Visual C++、GCC 和 Clang 中编译它。他们都提示“无法推断类
刚刚看了一篇关于C++0x标准的文章:http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-w
我已将节点指针初始化为 nullptr 并将其作为引用传递给辅助函数。在辅助函数内,我将之前为 nullptr 的指针设置为等于 new Pointer。然而,函数结束后,它又被设置为nullptr。
有谁知道为什么分配type* = 0无效,而分配type* = nullptr无效呢?在这两种情况下typedef void type。谢谢 #include #include template
我正在尝试为类(class)项目创建链表。我的节点类有一个指向链接节点的指针和另一个指向专门书籍类的指针。 class Node{ private: Book *data; Node
我在destroyStudent()函数中删除指针aStudent,然后我将aStudent设置为空指针。但是,运行该函数后,aStudent 不再设置为nullptr,所以我必须再次将其设置为nul
我正在尝试制作一个基本的 HashMap。在将元素插入索引之前,我正在检查它是否存在于索引中。当我插入第一个元素时,它说该位置已经存在一个元素。我已经通过调试器,我的所有值都符合预期,map[hash
我正在尝试做类似的事情: if (foo) return SET_ERROR_AND_RETURN_NULL(ERROR_HERE); 使用... #define SET_ERROR_AND
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我有一个看起来像这样的结构: struct Wolf { Wolf *dog; Wolf *puppy; }; 我写过: Wolf *alphawolf = new Wolf; 当我尝
我正在使用带有 Visual Studio 2012 的 C++(11)。 我使用定制的包装器类创建窗口。 CUIWindow* winA = new CUIWindow ( NULL, TEXT("
我为它编写了一个 PriorityQueue 类和一个迭代器类。但我不明白为什么这些行编译? PriorityQueue pq; auto z =pq.begin(); z=nullptr
我正在学习 enable_if 的用法我偶然发现了以下代码。 template ::value, T>::type* = nullpt
我有一个函数func(int a, char b, void *ptr)。第三个参数保留供内部使用,它应该是当前版本的 nullptr。有没有办法在函数原型(prototype)而不是定义中强制执行此
所以当我在学校编译它时 nullptr 错误没有出现,我想我可以通过在编译时添加一行来修复它,有没有另一种方法来摆脱它,另外两个错误我不明白为什么我要得到它们。有人可以至少解释一下 nullptr 错
这个问题在这里已经有了答案: Checking if this is null (8 个答案) 关闭 4 年前。 我想像这样替换代码: if ((obj != nullptr) && obj->is
我是一名优秀的程序员,十分优秀!