我正在尝试编写一个简单的组件,允许您使用SDL 1.3 API在Delphi窗口上嵌入一个或多个SDL渲染表面.它将编译和安装得很好,但是当我尝试在表单设计器中使用该组件时,每当我尝试在对象检查器中访问其属性,保存表单或删除组件,并将其放置在一个上时,它就会引发AV.然后尝试运行的表单给出了一个链接器错误:由于某种原因,它显然无法正确读取DFM.
DLL可以在http://www.libsdl.org/tmp/SDL-1.3-dll.zip找到,我的组件的源代码可以在这里下载.SDL.pas是一个JEDI-SDL头文件; 剩下的就是我自己的代码.
我没有看到任何理由在表单设计器中引发AV.如果我在运行时动态创建控件,我没有任何稳定性问题.任何人都可以看看这个,也许可以提供一些反馈,可以帮助我清理它?
这是SDL在Visual Studio 2005中需要的一些代码,以便我的简单程序能够运行.代码在做什么?我拥有它的唯一原因是因为我的导师告诉我把它放入并且从未解释过.
// what is this code doing?
//---------------------------------------------------------
#ifdef WIN32
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#endif
//-------------------------------------------------------
#include <iostream>
#include "SDL.h"
using namespace std;
int main(int argc, char *argv[])
{
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) == -1) {
cerr << "Failed to initialize SDL: " << SDL_GetError() << endl;
exit(1);
}
atexit(SDL_Quit);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个小游戏来教我自己的OpenGL渲染,因为它是我尚未解决的问题之一.我之前使用过SDL,同样的功能,虽然仍然表现不佳,但并没有像现在那样超越顶级.
基本上,我的游戏还没有太多进展,只是一些基本的动作和背景绘图.当我切换到OpenGL,它看起来好像是这样太快了.我的每秒帧数超过2000,此功能耗尽了大部分处理能力.
有趣的是,它的SDL版本中的程序使用了100%的CPU但运行顺畅,而OpenGL版本只使用了大约40% - 60%的CPU,但似乎对我的显卡征税,使我的整个桌面变得无法响应.坏.
它不是一个太复杂的功能,它根据玩家的X和Y坐标呈现1024x1024背景图块,以给出运动的印象,同时玩家图形本身保持锁定在中心.因为它是用于更大屏幕的小瓷砖,所以我必须多次渲染它以将瓷砖拼接在一起以获得完整的背景.下面代码中的两个for循环迭代12次,合并,所以我可以看到为什么当每秒调用2000次时这是无效的.
所以为了达到目的,这是邪恶的行为者:
void render_background(game_t *game)
{
int bgw;
int bgh;
int x, y;
glBindTexture(GL_TEXTURE_2D, game->art_background);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &bgw);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &bgh);
glBegin(GL_QUADS);
/*
* Start one background tile too early and end one too late
* so the player can not outrun the background
*/
for (x = -bgw; x < root->w + bgw; x += bgw)
{
for (y = -bgh; y < root->h + bgh; y += bgh)
{ …Run Code Online (Sandbox Code Playgroud) 可能重复:
这个&运营商在这里意味着什么?
为什么这个if语句就在宏SDL_BUTTON之前?它有什么作用?帮助我理解这段代码的作用.
if(SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1))
//code to be executed
Run Code Online (Sandbox Code Playgroud) 我想使用SDL来处理我的事件,但我正在使用OpenGL来处理图形.有没有办法使用SDL的事件处理,即使我实际上没有任何活动的SDL窗口?
当我阅读SDLhaskell 的文档时,我发现一些函数不可避免地修改了它的输入.例如,blitSurface将目标曲面作为输入,但在函数内更新.现在,概括问题,如果我有一个函数f :: a -> IO a,如果我a在函数内修改它会破坏组合吗?怎么样f :: IO a -> IO a?怎么样a -> IO ()?那怎么样IO a -> IO ()?
考虑到blitSurface实际上是外来函数的情况,并且每帧的新表面听起来效率不高,这些函数很难避免.这些功能会导致更大规模的问题吗?例如,使用fModifySurface :: Surface -> IO ()破坏性更新作为示例:
main = do
w <- ... -- The window surface
-- Do something here
s <- someFuncGetSurface -- We get a surface here
fModifySurface s -- Destructively update s
blitSurface ...... -- Ignore the actual API, …Run Code Online (Sandbox Code Playgroud) 这里的第一个问题,答案可能很简单,但我无法弄清楚.重点:在我的项目中,我创建了两个类:"GlobalVairables"和"SDLFunctions".显然,在第一个中我想存储我可以在任何其他类中关联的全局变量,而在第二个中我使用这些全局变量获得了很少的函数.这是代码:
GlobalVariables.h
#pragma once
class GlobalVariables
{
public:
GlobalVariables(void);
~GlobalVariables(void);
const int SCREEN_WIDTH;
const int SCREEN_HEIGHT;
//The window we'll be rendering to
SDL_Window* gWindow;
//The surface contained by the window
SDL_Surface* gScreenSurface;
//The image we will load and show on the screen
SDL_Surface* gHelloWorld;
};
Run Code Online (Sandbox Code Playgroud)
和GlobalVariables.cpp
#include "GlobalVariables.h"
GlobalVariables::GlobalVariables(void)
{
const int GlobalVairables::SCREEN_WIDTH = 640;
const int GlobalVariables::SCREEN_HEIGHT = 480;
SDL_Window GlobalVairables:: gWindow = NULL;
SDL_Surface GlobalVariables:: gScreenSurface = NULL;
SDL_Surface GlobalVariables:: gHelloWorld = NULL;
}
GlobalVariables::~GlobalVariables(void)
{
}
Run Code Online (Sandbox Code Playgroud)
这是SDLFunction.cpp中的一个函数,它使用"gWindow"和另外两个变量: …
我已经使用C ++和SDL2编写了一个程序:
如果使用SDL_RENDERER_SOFTWARE标志创建渲染器,则该程序可以完美运行。
如果使用该SDL_RENDERER_ACCELERATED标志创建了渲染器,我发现虽然可以直接渲染到屏幕,但是如果我从窗口表面创建了几个不同的纹理,然后尝试使用SDL_RenderCopy();将它们复制回窗口。我所看到的只是一个黑色的窗户。
我找不到任何失败的SDL调用。
我想知道纹理格式和渲染器之间是否可能不兼容-但我不确定如何跟进。
有什么帮助或建议吗?
我的环境是:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
附加信息和源代码:
我添加了缩减的源代码来演示以下问题。
注意,为了减小大小,我删除了所有错误检查,并将相关代码合并为一个主要函数。
我得到的是,如果我取消注释第40行,那么该程序将按预期运行,从而使我SDL_CreateRenderer使用该SDL_RENDERER_SOFTWARE标志进行调用。
如果我取消对其他任何SDL_CreateRenderer一行的注释(第41-43行:使用硬件加速),则在最初将它们渲染到屏幕上时会看到红色和蓝色方块。
但是,当我按下按键时,不是看着窗口在红色和蓝色方块之间滑动,而是看着黑色的窗口。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string>
//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int main(int argc, char* args[])
{
//The window we'll be rendering to
SDL_Window* gWindow = …Run Code Online (Sandbox Code Playgroud) 我想在SDL中创建一个塔防游戏.在开始这个项目之前,我会尝试编写游戏时需要做的所有事情.在我正在进行的测试中,有一个塔(静态物体),在其范围内的目标(移动物体),以及从炮塔发射到目标的射击(移动物体).我没有做的是找到一种方法让'射击'物体成为一个方向.通过射击物体,我的意思是当目标在范围内时由塔发射的物体.此外,无论方向如何,射击应始终具有相同的速度,这禁止使用配方dirx = x2 - x1.
射击是定义如下的结构:
typedef struct shoot
{
SDL_Surface *img; // Visual representation of the shoot object.
SDL_Rect pos; // Position of the object, it's a structure containing
// coordinates x and y (these are of type int).
int index;
float dirx; // dirx and diry are the movement done by the shoots object in
// 1 frame, so that for each frame, the object shoot is moved dirx
// pixels on the axis …Run Code Online (Sandbox Code Playgroud) 我正在使用十六进制格式的888到565格式的位图.所以我想,以显示对使用SDL模拟器的位图,与帧缓冲区resoultion是16bit.
其中一个位图数据(第一行)看起来像那样
0x42, 0x4D, 0xFE, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x7B, 0x0, 0x0, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x0,
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试在SDL上使用C++绘制该位图,但是我得到了带有扫描线的垃圾图像,看起来像是没有正确计算间距.
void Rasterizer::DrawBitmap(int w, int h, int x, int y, int transparent)
{
if (!bitmap)
return;
const uint8_t bytesPerPixel = 2;
uint16_t bytesPerRow = (bytesPerPixel * h ); // bytes Per Row including padding to 4 byte row boundary
uint16_t paddingSize = bytesPerRow - (bytesPerPixel * …Run Code Online (Sandbox Code Playgroud) sdl ×10
c++ ×6
opengl ×2
bitmap ×1
c ×1
components ×1
delphi ×1
dll ×1
haskell ×1
if-statement ×1
math ×1
monads ×1
optimization ×1
sdl-2 ×1
syntax ×1