首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libtcod -不响应输入的运动功能

libtcod -不响应输入的运动功能
EN

Stack Overflow用户
提问于 2014-01-20 12:11:07
回答 2查看 204关注 0票数 0

我使用libtcod和c,并且我的移动函数不响应输入,下面是函数被调用时的样子

代码语言:javascript
复制
    TCOD_key_t key;
    move_entity(player.x, player.y, key);

这是实际的源代码

代码语言:javascript
复制
void move_entity(int x, int y, TCOD_key_t key){
    TCOD_sys_check_for_event(TCOD_EVENT_KEY_PRESS, &key, NULL);
    switch(key.vk){
        case TCODK_UP : y--; break;
        case TCODK_DOWN : y++; break;
        case TCODK_RIGHT : x++; break;
        case TCODK_LEFT : x--; break;
        default:break;
    }
}

奇怪的是,当move_entity内部的代码被复制到程序响应的主函数中时,下面是主循环

代码语言:javascript
复制
#include "libtcod.h"
#include "move.h"
#include "entity.h"

int main(){
struct Entity player = {40, 25, '@', 100, TCOD_COLOR_LIME};
struct Entity enemy = {20, 35, '&', 50, TCOD_COLOR_RED};
TCOD_console_set_custom_font("terminal12x12_gs_ro.png", TCOD_FONT_LAYOUT_ASCII_INROW, 16, 16);
TCOD_console_init_root(80, 50, "Placeholder title", false, TCOD_RENDERER_SDL);

while(!TCOD_console_is_window_closed()){
    TCOD_key_t key;
    move_entity(player.x, player.y, key);
    TCOD_console_clear(NULL);
    TCOD_console_print(NULL, 1, 1, "Player Health:%d", player.health);
    TCOD_console_print(NULL, 1, 2, "Enemy Health:%d", enemy.health);
    entity_render(player.x, player.y, player.ch, player.forcol);
    entity_render(enemy.x, enemy.y, enemy.ch, enemy.forcol);
    TCOD_console_flush(NULL);
}
return 0;

}

我确信这只是我忽略了的一些愚蠢的东西,但它真的让我很想转转,我很感谢你的帮助:)

*编辑sel警报器的建议这里是我编辑的代码

在主循环中调用的代码。

代码语言:javascript
复制
 move_entity(&player.x, &player.y);

以及函数中的代码

代码语言:javascript
复制
 void move_entity(int *x, int *y){
     TCOD_key_t key;
     TCOD_sys_wait_for_event(TCOD_EVENT_KEY_PRESS, &key, NULL, false);
     switch(key.vk){
         case TCODK_UP : *y--; break;
         case TCODK_DOWN : *y++; break;
         case TCODK_RIGHT : *x++; break;
         case TCODK_LEFT : *x--; break;
         default:break;
      }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-27 14:26:48

代码语言:javascript
复制
void test(int *x1, int *x2) {
    printf("before modif x1 = %d\n", *x1);
    printf("before modif x2 = %d\n", *x2);

    *x1++;   // equivalent to *(x1 + 1) 
    (*x2)++; // equivalent to *x2 += 1;
}

int main() {
    int x1 = 1;
    int x2 = 1;

    test(&x1, &x2);
    printf("after modif x1 = %d\n", x1);
    printf("after modif x2 = %d\n", x2);

    return 0;
}

请参阅上面的C示例,为了了解发生了什么,您没有按照正确的顺序表示优先级,您必须先取消引用,然后再添加1,否则,您将取消对变量后面的内存空间的引用,这不会产生任何影响。

代码语言:javascript
复制
Output:

before modif x1 = 1
before modif x2 = 1
after modif x1 = 1
after modif x2 = 2
票数 0
EN

Stack Overflow用户

发布于 2014-01-20 13:30:20

似乎您通过值将player.x和player.y传递给move_entity()函数。此函数中对x和y的任何更改都是函数的本地更改,不会影响player.x和player.y。

您应该将move_entity()函数更改为接收指向int的指针,并向其发送player.x和player.y的地址,以便能够更改它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21233766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档