나는 SDL2.0과 C++를 사용하여이 게임을하고 있으며 걸림돌을 친다. 나는 이동 함수를 만들고 오른쪽 직사각형을 호출하고있다. 그리고 메인 루프에서 이동 기능을 호출했으며 움직이지 않습니다.SDL2.0 moving 키보드로 스프라이트
다음은 코드입니다. 여기
//
// Window.cpp
// Galaxy Shooter
//
// Created by Samrith on 02/03/14.
// Copyright (c) 2014 Sam Shankar. All rights reserved.
//
#include "Window.h"
void Window::create() {
Resources r;
SDL_Init(SDL_INIT_EVERYTHING);
window = SDL_CreateWindow("Galaxy Shooter", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
screen = SDL_GetWindowSurface(window);
if(window == NULL)
std::cout << " Window cannot be created. Error: " << SDL_GetError();
else {
r.load();
SDL_UpdateWindowSurface(window);
}
}
void Window::destroy() {
Resources r;
SDL_DestroyWindow(window);
r.free();
SDL_Quit();
}
void Window::run() {
bool done = false;
Resources r;
create();
while(!done)
{
while(SDL_PollEvent(&event) != 0)
{
if(event.type == SDL_QUIT)
{
done = true;
destroy();
}
r.move(event); //This is the move function
SDL_UpdateWindowSurface(window);
}
r.projectile();
SDL_UpdateWindowSurface(window);
}
}
SDL_Window * Window::getWindow() {
return window;
}
SDL_Surface * Window::getSurface() {
return screen;
}
그리고
가 이동 기능이 들어있는 자원의 소스 파일입니다 또한//
// Resources.cpp
// Galaxy Shooter
//
// Created by Samrith on 06/03/14.
// Copyright (c) 2014 Sam Shankar. All rights reserved.
//
#include "Resources.h"
bool b[4] = {0, 0, 0, 0};
void Resources::load() {
background();
rocket();
//r.create();
}
void Resources::free() {
Sound s;
SDL_FreeSurface(bgimage);
SDL_FreeSurface(rimage);
//SDL_FreeSurface(screen);
s.destroy();
}
//void Resources::run() {
// Window w;
// w.run();
//}
void Resources::background() {
Window w;
Sound s;
//Load screen
screen = SDL_GetWindowSurface(w.getWindow());
if(screen == NULL)
std::cout << "Surface (background) error: " << SDL_GetError();
//Load image
bgimage = IMG_Load("bg2.jpg");
if(bgimage == NULL)
std::cout << "Image (background) error: " << SDL_GetError();
//Load rectangle and set values
bgrect.x = 0;
bgrect.y = 0;
bgrect.h = w.screenH();
bgrect.w = w.screenW();
//Blit image to screen
SDL_BlitScaled(bgimage, NULL, screen, &bgrect);
s.init(1);
}
void Resources::rocket() {
Window w;
Sound s;
//Load screen
screen = SDL_GetWindowSurface(w.getWindow());
if(screen == NULL)
std::cout << "Surface (rocket) error: " << SDL_GetError();
//Load image
rimage = IMG_Load("rocket.png");
if(rimage == NULL)
std::cout << "Image (rocket) error: " << SDL_GetError();
//Load rectangle and set values
rrect.x = 15;
rrect.y = w.screenH()/2;
rrect.h = 75;
rrect.w = 75;
//Blit image to screen
SDL_BlitScaled(rimage, NULL, screen, &rrect);
//s.init(2);
}
void Resources::move(SDL_Event event) {
//bool done = false;
Window w;
switch(event.type)
{
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_UP:
b[0] = 1; break;
case SDLK_DOWN:
b[1] = 1; break;
case SDLK_RIGHT:
b[2] = 1; break;
case SDLK_LEFT:
b[3] = 1; break;
}
break;
case SDL_KEYUP:
switch(event.key.keysym.sym)
{
case SDLK_UP:
b[0] = 0; break;
case SDLK_DOWN:
b[1] = 0; break;
case SDLK_RIGHT:
b[2] = 0; break;
case SDLK_LEFT:
b[3] = 0; break;
}
break;
}
if(b[0]==true)
rrect.y += 10;
if(b[1]==true)
rrect.y -= 10;
if(b[2]==true)
rrect.x += 10;
if(b[3]==true)
rrect.x -= 10;
}
void Resources::projectile() {
Window w;
SDL_PumpEvents();
int x, y;
SDL_GetMouseState(&x, &y);
if(SDL_GetMouseState(&x, &y) & SDL_BUTTON(1))
{
rrect.x = x;
rrect.y = y;
SDL_BlitScaled(rimage, NULL, screen, &rrect);
for(int i=rrect.x; i<=w.screenW(); i++)
rrect.x+=2;
}
}
, 나는이 문제를 봤 다양한 튜토리얼과 문서를 시도했습니다. 이것은 나의 최후의 수단이며이 문제에 대해 내가 처음으로 생각한 것이 아니다. 그러니 친절하게 대해주십시오. :)
당신의 문제는 당신이 자원 r을 선언한다는 것입니다; 각 함수의 스택에. 예를 들어'void Window :: create()'를 호출하면 r을 선언하고로드하는 모든 것을로드하지만 함수가 반환하면 r이 소멸됩니다. 따라서 run에서 선언 한 r에는 load() 함수가 호출되지 않습니다. – Hjorthenify
@Hjorthenify 나는 당신이 의미하는 것을 얻는다. 그래서 나는 이상적인 글로벌 r을 만들어 모든 기능에 걸쳐 사용하여 범위를 벗어나지 않도록해야합니다. – Sam
전역 변수는 나쁜 연습으로 간주되므로 오히려이를 윈도우 클래스의 멤버 변수로 지정해야합니다. – Hjorthenify