我正在致力于将我的开源粒子引擎测试从 SDL 移植到 SDL + OpenGL。我已经成功地编译并运行了它,但无论我做什么,屏幕都保持黑屏。主要.cpp:
#include "glengine.h"
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//Create a glengine instance
ultragl::glengine *gle = new ultragl::glengine();
if(gle->init())
gle->run();
else
std::cout << "glengine initializiation failed!" << std::endl;
//If we can't initialize, or the lesson has quit we delete the instance
delete gle;
return 0;
};
Run Code Online (Sandbox Code Playgroud)
glengine.h:
//we need to include window first because GLee needs to be included before GL.h
#include "window.h"
#include <math.h> // Math Library …Run Code Online (Sandbox Code Playgroud) 这是我第一次尝试将我的文件分成 4 个文件夹:图像、源、声音、标题。我的问题是:我试图从源文件夹中的文件调用的图像文件夹中加载一个简单的 BMP。这是我的代码:
#include <SDL/SDL.h>
int main(int argc, char *argv[])
{
SDL_Surface *hello = NULL;
SDL_Surface *screen = NULL;
屏幕 = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
你好 = SDL_LoadBMP("../images/hello.bmp");
SDL_BlitSurface(你好,NULL,屏幕,NULL);
SDL_Flip(屏幕);
SDL_延迟(2000);
SDL_FreeSurface(你好);
SDL_退出();
返回0;
}
显然,调用“../images/hello.bmp”不起作用。
我最近才开始使用 C 语言并使用 SDL,所以我确信我搞砸了一些基本的东西,但我能找到的每个示例代码看起来都像我的,除了我的不起作用。因此,任何帮助都会受到欢迎。
#include <stdio.h>
#include <SDL.h>
int main(int argc, char *argv[])
{
SDL_Event event;
int game_running = 1;
while (game_running)
{
while (SDL_PollEvent(&event))
{
switch (event.type) /* checking for event type */
{
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_UP:
printf("You pressed up.\n");
break;
case SDLK_DOWN:
printf("You pressed down.\n");
break;
}
break;
case SDL_KEYUP:
printf("You stopped pressing the button.\n");
break;
case SDL_QUIT:
game_running=0;
break;
}
}
}
SDL_Quit();
printf("The program stopped.");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 正如小标题所说,鼠标移动是垃圾事件队列,所以当我摇晃鼠标时我不能走路。有什么办法吗?仅鼠标或其他东西的不同队列。
SDL_Event event_;
CInputManager::Instance()->SetEvent(&event_);
InitializeGameFiles();
while (running)
{
if (SDL_PollEvent(&event_))
{
if (event_.type == SDL_QUIT)
{
running = false;
}
else if (event_.type == SDL_MOUSEMOTION)
{
CCrosshair::Instance()->OnUpdate();
}
}
OnUpdate(SDL_GetTicks() - currentTime);
currentTime = SDL_GetTicks();
OnRender();
}
void OnUpdate(unsigned int deltaTime)
{
//Game logic here
CInputManager* IM = CInputManager::Instance();
CPlayer* player = &CPlayer::PlayerControl;
IM->UpdateHeyHeld();
if (IM->IsKeyDown(SDLK_w))
{
cam[1] += speed * (deltaTime / 1000.f );
}
else if (IM->IsKeyDown(SDLK_s))
{
cam[1] -= speed * (deltaTime / 1000.f );
}
if …Run Code Online (Sandbox Code Playgroud) 使用 SDL2 和 SDL2_image 尝试一些 C++ 和 OpenGL,基于http://open.gl
一旦到达 glGenTextures 调用,我就会收到主题错误。我的大多数搜索都提到尚未创建 gl 上下文。我已经成功使用了多次 gl 调用。这是我的主要内容。所以
int main(int argc, const char * argv[]) {
uniforms = std::vector<GLuint>();
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_Window* window = SDL_CreateWindow("OpenGL", 100, 100, 800, 600, SDL_WINDOW_OPENGL);
SDL_GLContext context = SDL_GL_CreateContext(window);
glewExperimental = GL_TRUE;
glewInit();
SDL_Event windowEvent;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo;
glGenBuffers(1, &vbo);
GLuint ebo;
glGenBuffers(1, &ebo);
setupVertices(vbo);
setupElementBuffer(ebo);
GLuint fragmentShader;
GLuint vertexShader;
GLuint shaderProgram = compileShaders(vertexShader, fragmentShader); …Run Code Online (Sandbox Code Playgroud) 所以我对从头开始编程还很陌生,到目前为止主要使用了几年统一,所以我的一般编程知识非常好。暑假后开始在大学学习游戏开发,但我们从头开始编程,作为一项任务,我们必须在课堂上共同制作的 2D 引擎中制作一个简单的游戏。
所以我决定制作的游戏是炸弹人的副本,并且我已经达到了我现在使炸弹起作用的程度。
我遇到的问题是我不知道如何正确添加一个计时器来倒计时炸弹爆炸的时间,以便玩家可以避免它。
我已经尝试过 SDL_Delay 和 _sleep,它们都只是暂停整个程序,因此不起作用,我已经四处寻找更多选项,但并没有真正理解事情是如何工作的。如果我能得到一些示例和页面链接来解释如何正确地制作这样的东西(一些简单而小巧的东西:P),那么我将不胜感激!
请注意,我们在引擎中使用 SDL。
谢谢!
我一直在研究一个小的 3D 引擎,试图修复相机并使其不那么生涩。我一直在使用 SDL 作为输入,当它工作时,它正在做这件事,如果我按住一个按钮,它会立即移动一次然后暂停然后开始正确移动,使移动感觉没有反应。
我录制了它的 GIF 动图,虽然可能很难看出发生了什么,但希望它能给一些想法:
向前移动然后向右移动就像:
w wwwwwwwwwwwwwwww aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
重要的代码在这里,但如有必要,请随时要求更多:
//Poll events
SDL_Event event;
while (m_EngineState != EngineState::EXIT)
{
m_last = m_current;
m_current = SDL_GetPerformanceCounter();
deltaTime = (double)((m_current - m_last) * 1000 / SDL_GetPerformanceFrequency());
while (SDL_PollEvent(&event))
{
switch (event.type) {
case SDL_QUIT:
m_EngineState = EngineState::EXIT;
break;
case SDL_MOUSEMOTION:
break;
case SDL_KEYDOWN:
m_Keys[event.key.keysym.sym] = true;
break;
case SDL_KEYUP:
m_Keys[event.key.keysym.sym] = false;
break;
}
ProcessEvents();
}
void Engine::ProcessEvents()
{
if (m_Keys[SDLK_w])
{
m_Camera->MoveForward(5.0f*(deltaTime*0.001));
}
if (m_Keys[SDLK_s])
{
m_Camera->MoveForward(-5.0f*(deltaTime*0.001));
} …Run Code Online (Sandbox Code Playgroud) 我曾经SDL通过SDL_SaveBMP. 问题是保存的图像是颠倒的。
保存的图像是
虽然它必须是
我应该如何修复代码?
截图功能:
void screen_shot(std::string filename)
{
int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);
SDL_Surface * image = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, image->pixels);
SDL_SaveBMP(image, filename.c_str());
SDL_FreeSurface(image);
}
Run Code Online (Sandbox Code Playgroud)
更新
我尝试翻转像素。结果是纯黑色输出图像。问题是什么?
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <stdio.h>
#include <assert.h>
#include <iostream>
#include <GL/freeglut.h>
#include <boost/thread/thread.hpp> // for sleep
#include <SDL2/SDL.h>
Uint32 GetPixel24(SDL_Surface * surface,int x, int y)
{
Uint32 rgb;
Uint8 * pixel …Run Code Online (Sandbox Code Playgroud) 我需要在 SDL 窗口中创建一个输入框。
由于没有功能,我将制作一个基本的输入框,但我找不到如何检测在 SDL 中按下了哪个键。
使用下面的代码,我可以在点击时打印,'A'但我认为为每个角色制作这个代码会非常重复。如何检测按下了哪个键?
case: SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_a:
cout << "You Clicked \'A\'" << endl;
break;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用ray并行运行pygame,但希望如此抑制 SDL 视频警告/错误。
这是我的代码:
@ray.remote
def run2(agent): # same as run1
sys.stdout = open(os.devnull, "w")
sys.stderr = open(os.devnull, "w")
os.environ["SDL_VIDEODRIVER"] = "dummy"
env = GameEnv(0)
state = env.reset()
steps =0
done= False
while not done:
steps+=1
action = agent.predict(state)
ns , r ,done ,i= env.step(env.action_space.sample())
return steps
# note: maybe run this twice to warmup the system
%time result = ray.get([run2.remote(pops[i]) for i in range(10)])
Run Code Online (Sandbox Code Playgroud)
我曾尝试更改 stdout 和 stderr 但这似乎不起作用,或者我应该在其他地方更改它这是我为每个工人收到的警告
(pid=1128) ALSA lib confmisc.c:767:(parse_card) cannot find …Run Code Online (Sandbox Code Playgroud)