- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写这个相对简单的程序,以便在按下空格键时从移动的角色发射一个小弹丸。
程序编译没有任何错误(在代码块中)并运行直到按下空格键。该程序没有发射射弹,而是立即崩溃。
我想我已经能够将崩溃隔离到我将射弹绘制到屏幕的那一行(ln. 83)。我只是在之前和之后的行中使用了 cout 语句,而第二个语句没有显示。
for (int ii = 0; ii < inMotion.size(); ii++)
{
window.draw(inMotion[ii].bulletSprite);
}
我相信我的所有代码都是解决这个问题所必需的,所以我已经发布了所有代码。
#include <iostream>
#include <SFML/Graphics.hpp>
#include <string.h>
#include <math.h>
#include <vector>
using namespace std;
class Projectile
{
public:
Projectile(int, string);
void moveBullet();
sf::Sprite bulletSprite;
private:
sf::Texture bulletTexture;
int speed;
string bulletTextureString;
};
Projectile::Projectile(int s, string t)
{
speed = s;
bulletTextureString = t;
if(!bulletTexture.loadFromFile((bulletTextureString).c_str()))
{
cout << "error";
}
bulletSprite.setTexture(bulletTexture);
}
void Projectile::moveBullet()
{
bulletSprite.move(speed, 0);
}
class thePlayer
{
public:
void Fire(sf::Time);
void Walk();
void Draw(sf::RenderWindow&);
void Create(string);
sf::Time lastShot;
private:
vector<Projectile> inMotion;
sf::Texture playerTexture;
sf::Sprite playerSprite;
string playerTextureString;
int moveSpeed = 5;
};
void thePlayer::Create(string s)
{
playerTextureString = s;
if(!playerTexture.loadFromFile((playerTextureString).c_str()))
{
cout << "error";
}
playerSprite.setTexture(playerTexture);
}
void thePlayer::Fire(sf::Time time)
{
sf::Time shotDelay = sf::milliseconds(100);
if(time - lastShot >= shotDelay)
{
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
{
Projectile bullet(15, "fireball.png");
bullet.bulletSprite.setPosition(playerSprite.getPosition());
inMotion.push_back(bullet);
}
}
for(int ii = 0; ii < inMotion.size(); ii++)
{
inMotion[ii].moveBullet();
}
}
void thePlayer::Draw(sf::RenderWindow& window)
{
for (int ii = 0; ii < inMotion.size(); ii++)
{
window.draw(inMotion[ii].bulletSprite);
}
window.draw(playerSprite);
}
void thePlayer::Walk()//awsd standart movement
{
int x = 0;
int y = 0;
if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
{
x-= moveSpeed;
}
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
{
x+= moveSpeed;
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
y-= moveSpeed;
}
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
{
y+= moveSpeed;
}
playerSprite.move(x, y);
}
class Game
{
public:
void Update(sf::RenderWindow&, sf::Time);
void Start(sf::Time);
sf::Clock clock;
thePlayer player;
private:
};
void Game::Start(sf::Time time)
{
player.Create("block.png");
player.lastShot = time;
}
void Game::Update(sf::RenderWindow& window, sf::Time time)
{
player.Fire(time);
player.Walk();
player.Draw(window);
}
int main()
{
sf::RenderWindow window(sf::VideoMode(1000, 1000), "Menu");
window.setFramerateLimit(60);
Game theGame;
sf::Clock clock;
sf::Time startTime = clock.restart();
theGame.Start(startTime);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color::White);
sf::Time elapsed = clock.getElapsedTime();
theGame.Update(window, elapsed);
window.display();
}
return 0;
}
非常感谢您的帮助。
编辑:我尝试使用调试器,但无法解决任何问题。指向一篇关于代码块调试的好文章的链接会很棒。
最佳答案
我自己解决了这个问题。我发现我必须通过指针引用 Bullet 类,并确保纹理也是公开的。我也错误地使用了构造函数,并摆脱了它们。
我的近似解决方案是这样的......
void thePlayer::Fire(sf::Time time)
{
sf::Time shotDelay = sf::milliseconds(100);
if(time - lastShot >= shotDelay)
{
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
{
Projectile *bullet = new Bullet;
bullet->bulletSprite.setPosition(playerSprite.getPosition());
inMotion.push_back(bullet);
}
}
for(int ii = 0; ii < inMotion.size(); ii++)
{
inMotion[ii]->moveBullet();
}
还必须更改类中的 vector 声明
//...
vector<Bullet*> Bullets;
//...
再次感谢尝试回答的人。
关于c++ - SFML - 尝试从 vector 绘制 Sprite 时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23717167/
我有一个包含纹理的文件。我加载到 sf::Texture并用 setTextureRect 拆分成 Sprite . 现在假设一个 Sprite 包含 20 像素宽的纹理的一部分。如何渲染它以适应例如
一段时间以来,我一直在使用 SDL 来制作小东西的原型(prototype)并了解有关图形编程的更多信息。 然后我看到了SFML并想试一试,发现它更面向对象并修复了我认为 SDL 存在的一些问题。 但
我正在使用 rust-sfml ( rsfml::graphics ) 目前,将像素绘制到屏幕上。 (我只是从 Rust 和项目开始。)我将数据存储在 Image 中。 , 然后复制到 Texture
我试图在 SFML 2 中获取关键输入,在 SFML 1.6 im 中使用 while (App.GetEvent(Event)) { if (App.GetI
我做了一个非常简单的双人游戏,一个是水母,另一个是SFML中的鲨鱼。唯一的问题是一次只能有一个 Sprite 移动。这可能修复吗?我该如何修复? 编辑:我的尝试是这样的: if (event.type
我已经尝试了几个小时,但似乎无法做到我已经下载了扩展程序并寻求帮助,但此时一切都让我感到困惑。 我想在我的项目中包含 SFML 库,我正在尝试使用 Visual Studio Code 编辑器,但由于
下面链接中的图片包含 20 多张图片(每个 body 部位和盔甲类型都在单独的文件中)。这个角色在名为“Spriter”的软件中被动画化。该代码采用 spriter 的输出文件 (.scml),然后计
我的第一个问题是 C++ 是否: pTexture.getSize().x 等于 C#(因为这对我来说没有结果): pTexture.Size().X 第二个问题是关于C++代码的(如何在SFML.n
我正在尝试在 Windows 10 下用 sfml 构建游戏。它在构建时显示成功。每当我调试解决方案时,它都会显示如下错误消息: Unhandled exception at 0x00007FFA62
我开始使用 SFML 和 C++ 创建游戏。但是,我遇到了一个问题。我有基本的骨架类代码,但由于某种原因,当我创建一个窗口(sf::Window)时,我立即崩溃了!此代码不包含任何事件检查代码,但它包
我的项目中有 2 个 CMakeLists.txt 文件。 CMakeLists.txt cmake_minimum_required(VERSION 3.2) project(Game) set(C
所以我正在尝试编写一些与网络相关的代码,特别是使用 SFML 的端口扫描器。我正在运行 VS 2017 并下载了 2015 年的 SFML 版本,但是人们说这应该适用于 2017 年。 到目前为止,我
我刚刚开始使用 C++ 和 SFML,最终一切都运行良好。在出现 undefined reference 错误之前,我意识到我一直在下载错误类型的 SFML,得到的是 SJLJ 而不是 DW2。问题已
尝试将新的 C++ 项目与 SFML 链接,我执行了以下操作: 创建了一个空项目。 C/C++ >> 常规:附加包含目录:添加了 SFML 包含目录并从项目默认值继承。 链接器 >> 附加库目录:添加
当我运行代码时,除了不播放声音外,一切正常。链接很好,当我放置断点并查看声音对象时,它显示 .我在正确的位置添加了 sfml-audio-d.lib 和 sfml-audio.lib。欢迎提出任何建议
下面的代码给出了未捕获的异常(特别是 txtr.loadFromFile("C:/Users/kidz/Documents/Visual Studio 2012/Projects/SFML/Debug
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
我想知道是否可以使用 SFML 库在 C 中使用颜色设置碰撞?因为我使用的是带有图 block 的 map ,我不知道它是否可以一起工作。 谢谢! 最佳答案 据我所知,您使用具有两种颜色的图像来定义碰
我正在制作 Frogger 的 C++ SFML 版本,目前正在尝试实现 Frog 和其他物体(汽车、卡车、原木等)之间的碰撞检测。我为 Frog 和游戏对象有单独的类,并希望使用边界框来检测交叉点,
嗨,大家好 为了缩放我的 sfml 应用程序,我正在尝试解决这个问题,该程序最初使用 运行(640, 480) 方面 显示这样的窗口... 我的目标是以全屏模式执行程序并放置旧的 '窗口' (检查图像
我是一名优秀的程序员,十分优秀!