我正在尝试制作一个简单的游戏。我使用以下代码将一些图像放置在屏幕上。我要这样做,以便在按下左键并移动鼠标时,这些图像会连续显示在屏幕上(这样播放器就不必多次单击。)我有以下内容:
SDL_Surface *mur = NULL, *caisse = NULL, *objectif = NULL, *mario = NULL;
SDL_Rect position;
SDL_Event event;
int continuer = 1, clic_gauche = 0, clic_droit = 0;
int objet_actuel = MUR, i = 0, j = 0;
int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
//Chargement des objets et du niveau.
mur = IMG_Load("mur.jpg");
caisse = IMG_Load("caisse.jpg");
objectif = IMG_Load("objectif.png");
mario = IMG_Load("mario_bas.gif");
if(!Charger_Niveau(carte)) //Erreur de chargement du niveau.
exit(EXIT_FAILURE);
while(continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_LEFT)
{
carte[event.button.x/TAILLE_BLOC][event.button.y/TAILLE_BLOC] = objet_actuel; //On met l'objet actuellement choisi a l'endroit du clic.
clic_gauche = 1; //On retient le fait que le dernier clic etait un clic gauche.
}
else if (event.button.button = SDL_BUTTON_RIGHT)
{
carte[event.button.x/TAILLE_BLOC][event.button.y/TAILLE_BLOC] = VIDE; //On vide le bloc ou s'est produit le clic droit.
clic_droit = 1; //On retient le fait que le dernier clic etait un clic droit.
}
break;
case SDL_MOUSEBUTTONUP: //On desactive le booleen qui disait qu'un bouton etait enfonce.
if(event.button.button == SDL_BUTTON_LEFT)
clic_gauche = 0;
else if(event.button.button == SDL_BUTTON_RIGHT)
clic_droit = 0;
break;
case SDL_MOUSEMOTION:
if(clic_gauche == 1)
{
carte[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] == objet_actuel;
}
else if(clic_droit == 1)
{
carte[event.motion.x/TAILLE_BLOC][event.motion.y/TAILLE_BLOC] == VIDE;
}
break;
然后,循环将继续检查是否已按下某些键,然后将使用双矩阵菜单加载的所有图像都抹掉,并刷新屏幕。问题是鼠标移动不起作用。调试事件相当困难……有人能看到代码的明显问题吗?
答案 0 :(得分:2)
您不是在carte
处理程序中将分配到SDL_MOUSEMOTION
中,而是在进行比较。
(不幸的是,即使表达式对程序没有影响/副作用,任何表达式都可以作为C中的语句,所以编译器不一定会帮助您发现这些问题。)
您的处理程序应为:
case SDL_MOUSEMOTION:
if(clic_gauche == 1)
{
carte[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] = objet_actuel;
}
else if(clic_droit == 1)
{
carte[event.motion.x/TAILLE_BLOC][event.motion.y/TAILLE_BLOC] = VIDE;
}
break;
(在if / else的每种情况下,请注意单个=
)
此外,反问题会影响您要分配给SDL_MOUSEBUTTONDOWN
的{{1}}的处理程序,而不是将其值与常量event.button.button
进行比较。
注意:由于这个原因,许多开发人员开始将常量放在比较的左侧,这样,如果您键入错误的运算符,编译器 就会给您一个错误。例如,
SDL_BUTTON_RIGHT