标题非常具有描述性。基本上,我在C ++的控制台窗口中制作Space Invaders,它被称为ASCII入侵者。我似乎让游戏中的一切工作正常,除了一个主要问题,_getch正在暂停程序。我打电话给_kbhit检查玩家是否正在输入玩家输入,如果是,我使用_getch获取密钥并正确操作。玩家向左/向右移动就好了,但是当玩家按下“Space”或者进行拍摄时,程序会暂停,直到你再次按下“Space”,此时它也会拍摄。
显然,玩家在游戏中并不想要这个。所以很想知道如何解决它。这就是它的所在:
/***************************************/
/* move_player(); */
/* Calculates player movement */
/*Returns weather or not toQuitTheGame */
/***************************************/
bool move_player()
{
bool ret = false;
//If a key is pressed
if (_kbhit())
{
//Get key
_getch();
int key = _getch();
//Check is the player moves left
if (key == LEFT && object_handle.player_obj.x > 0)
{
//Move left
object_handle.player_obj.x -= 1;
}
//Check is the player moves right
if (key == RIGHT && object_handle.player_obj.x < 79)
{
//Move right
object_handle.player_obj.x += 1;
}
//Check is the player is shooting
if (key == SHOOT)
{
//shoot by creating the bullet above the player
object_handle.bullet_obj.x = object_handle.player_obj.x;
object_handle.bullet_obj.y = object_handle.player_obj.y - 1;
object_handle.bullet_obj.active = true;
}
//Weather or not to kill the program
if (key == VK_ESCAPE)
{
ret = true;
}
else
{
ret = false;
}
}
return ret;
}
作为旁注,如果您只是滚动思考“那是很多代码......我不想处理这个问题。” (我有时会这样做 - 不会捡到你)请注意它不是那么多,我只是使用很多评论和很多空格。
如果你想知道,这是整个“主要”功能。
int main()
{
bool quit = false;
object_handle.set_info();
//Display main manu
menu();
//Main game loop
while(!quit)
{
//Update past object variables
object_handle.xy_update();
//Calculate player movements
quit = move_player();
//Calculate bullet movements
handle_objects();
//Finally, update the screen
screen_update();
//DEBUG CODE
debug();
//Display score/stats
stats();
//Wait a given time before continuing the loop
Sleep(INTERVAL);
}
cout << "\n\n\n\n\nBye" << endl;
Sleep(1000);
return 0;
}
我已经包含了所有正确的库,我没有编译错误。
哦,是的,在我忘记之前。以下是常量:
/******************CONSTANTS********************/
const int ENEMY_COUNT = 15;
const int INTERVAL = 250;
const int LEFT = 75;
const int RIGHT = 77;
const int SHOOT = VK_SPACE;
const int BULLET_SPEED = 8;
/***********************************************/
非常感谢任何帮助!
答案 0 :(得分:1)
正如the documentation When reading a function key or an arrow key, each function must be called twice; the first call returns 0 or 0xE0, and the second call returns the actual key code.
因此,您需要检查返回的内容,以了解是否应该再次调用该函数。
以下是您应该能够适应您的需求的示例:
#include <conio.h>
#include <iostream>
int main()
{
std::cout << "Type stuff, press x to quit.\n";
int count = 0;
for(;;)
{
//To show the loop isn't blocked
if((++count % 1000) == 0)
{
std::cout << ".";
}
if(_kbhit())
{
int key = _getch();
if(key == 0 || key == 0xE0)
{
key = _getch();
}
std::cout << "\nKeycode: " << key << "\n";
if(key == 'x')
{
break;
}
}
}
return 0;
}
您可能还会考虑ReadConsoleInput
系列函数,因为它可以为您提供更多灵活性。这是一个example from MSDN。
答案 1 :(得分:0)
尝试更改:
_getch();
int key = _getch();
为:
int key = _getch();
在move_player
函数中。
答案 2 :(得分:0)
当您第二次拨打_getch()
时,它没有记录密钥,只需挂起,直到您再次按下密钥,因为_getch()
已分配给变量{ {1}}。因此,您应该删除key
函数中的迷路_getch()
。
正如@RetiredNinja所提到的,您需要拨打move_player()
两次,因此您需要对第一个_getch()
进行检查以确定您是否按下了字母密钥或特殊密钥。