我正在微处理器上用C制作游戏。得分取决于你能活多久;分数每3秒增加1。得分是一个全局声明的整数,但是从函数中显示。
int score = 0;//globally declared
void draw_score(int score_d)
{
char score_draw[99];
sprintf(score_draw,"%d", score_d);
draw_string(score_draw, 9, 0);
}
我正在考虑一个功能,只是将分数增加一分钟,但是没有效果。
void score_increaser(int score)
{
score++;
_delay_ms( 3000 );
}
是否需要在while循环中?无论如何,函数本身都将进入主循环。
答案 0 :(得分:2)
C是按值传递的。
score_increaser()
如您的问题所示只会增加传入内容的副本。
要解决这个问题,主要有两个选择:
由于score
是全局定义的,所以不要传递任何内容:
void score_increaser(void) {
score++;
_delay_ms( 3000 );
}
这会直接修改全局score
。
传递score
的地址并在函数
void score_increaser(int * pscore) {
(*pscore)++;
_delay_ms( 3000 );
}
像这样称呼
...
score_increaser(&score);
...
第三种,更复杂的方法(假设目标平台支持信号)
score
和这可能如下所示:
#include <signal.h> /* for signal() and sig_atomic_t */
#include <unistd.h> /* for alarm() */
#define DURATION (3) /* Increase score every 3 seconds. */
sig_atomic_t score = 0;
void set_alarm(unsigned);
void handler_alarm(int sig)
{
++score;
set_alarm(DURATION);
}
void set_alarm(unsigned duration)
{
signal(SIGALRM, handler_alarm);
alarm(duration);
}
int main(void)
{
set_alarm(DURATION);
... /* The game's codes here. */
}
后一种方法的优势在于您的游戏代码无需关注增加score
。只要程序运行,score
每3秒就会增加一次。
答案 1 :(得分:1)
我建议使用定时器中断。将计时器配置为3秒。
volatile int score = 0; //global
void Intr_Init(peripheral_t per)
{
//Initialize the timer interrupt
}
void draw_score(int score_d)
{
char score_draw[99];
sprintf(score_draw,"%d", score_d);
draw_string(score_draw, 9, 0);
}
int main(void)
{
Intr_Init(TIMER);
while(1)
{
//Code that makes your game run
draw_score(score);
}
}
ISR (TIMER1_COMPA_vect)
{
//clear disable interrupt
score++;
//enable interrupt
}
在嵌入式设备中,您应该依靠计时器来获得更好的时间关键任务和准确性。 Delay例程的实现方式通常是循环或向上/向下计数器。而计时器通常基于SysTicks的计数。 Interrupts的另一个主要优点是让处理器一直完成任务,而不是让它在延迟循环中阻塞。
答案 2 :(得分:0)
score
是全局值,如果该函数可以访问该全局空间,则不需要在函数中传递它
void score_increaser() {
score++;
_delay_ms( 3000 );
}
答案 3 :(得分:0)
你不需要得分参数,因为它是全局声明的。
//global
int score = 0;
void score_increaser()
{
_delay_ms(3000);
score++;
}
调用就像:score_increaser();
应该做的工作..
我建议您检查任何其他行/函数中的score
..也许您已重新声明它或意外更改了值..
希望这有帮助..
答案 4 :(得分:0)
这是处理分数的好方法。
在“开始游戏”功能中,
$event = new Event(['date_of_donation' => '2015-05-16', 'date_of_last_donation_letter_sent' => '']);
在定时器中断处理函数
中clear 'score' to 0
setup a timer:
--to expire once each 3 seconds
--enable the automatic reload feature,
--enable the timer interrupt
--enable the timer counter
在'结束游戏'功能中
--increment 'score'
--clear the timer interrupt pending flag