- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 C 中的 allegro 库进行射弹射击。我无法做到这一点。我的所有代码都在下面。我的圈子上升但随后消失。即使没有,我也可以'不要把它放在地上。我不擅长物理,所以如果我的同龄人错了,请原谅我。
#include <allegro.h>
#include < math.h >
void StartAlleg(); // my start program function
void EndAlleg();
int main() {
StartAlleg();
BITMAP *buffer = create_bitmap(640, 480);
int g = 10, Vo = 0 , Vx = 5, Vy = 475, angle= 0;
double time = 0, tUp = 0,hmax=0; //g is gravity
show_mouse(screen);
while (!key[KEY_ESC])
{
circle(buffer, Vx, Vy, 5, makecol(255, 0, 0));
if (key[KEY_UP]&&angle<360) angle++;
if (key[KEY_RIGHT]) Vo++;
if (key[KEY_DOWN] && angle>0) angle--;
if (key[KEY_LEFT] && Vo>0) Vo--;
textout_ex(buffer, font, "Player 1 : ", 0, 0, makecol(255, 255, 13), -1);
textprintf(buffer, font, 0, 25, makecol(255, 255, 13), "Angle = %d ",angle);
textprintf(buffer, font, 0, 15, makecol(255, 255, 13), "Speed = %d ", Vo);
if (key[KEY_Z] ){
Vx = Vo*cos(double(angle));
Vy = Vo*sin(double(angle));
if (angle== 180 || angle == 360) Vy = 0;
if (angle== 90 || angle== 270) Vx = 0;
if (Vx < 0) Vx *= (-1);
if (Vy < 0) Vy *= (-1);
tUp = Vy / g;
time = tUp * 2;
hmax = (Vy*Vy) / (2*g);
}
textprintf(buffer, font, 0, 35, makecol(255, 255, 13), "tUp Value = %.2f ", tUp);
for (int i = 1; i <= time; i++)
{
if (i<tUp){ Vx = Vx + g; Vy += g; }
else{ Vy -= g; Vx = Vx + g; }
}
blit(buffer, screen, 0, 0, 0, 0, 640, 480);
rest(60);
clear_bitmap(buffer);
}
EndAlleg(); // my end program function
return 0;
}
END_OF_MAIN()
void StartAlleg() {
int depth, res;
allegro_init();
depth = desktop_color_depth();
if (depth == 0) depth = 32;
set_color_depth(depth);
res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
if (res != 0) {
allegro_message(allegro_error);
exit(-1);
}
install_timer();
install_keyboard();
install_mouse();
install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, "A");
}
void EndAlleg() {
clear_keybuf();
}
我认为,主要问题在于:
for (int i = 1; i <= time; i++)
{
if (i<tUp){ Vx = Vx + g; Vy += g; }
else{ Vy -= g; Vx = Vx + g; }
}
最佳答案
我没有试图理解你所有的代码,但看起来你的计算是错误的。
重力的实现方式如下:
首先,您需要使用诸如 Px
Py
之类的变量来跟踪弹丸位置。该位置将为您提供绘图坐标。然后你需要跟踪它的速度,通常是水平和垂直速度,变量如 Vx
Vy
。如果您的初始速度是带角度的单个 vector ,请将其转换一次。
游戏的每一次滴答(在您的情况下是每次循环迭代),您都将速度添加到位置。然后添加重力,将垂直速度减去 10,同样在每个刻度(它实现 -10 的加速度)。
仅此而已。负速度和加速度是正常的,你不需要检查,但你可以检查位置的边界。另外,您应该注意,您通常将速度和加速度除以滴答频率,否则循环越快,抛射物移动得越快。
您应该注意,这不是实现重力的最佳方式,因为这只是近似物理(每秒更多的滴答声将为您提供更准确的模拟)。你应该在谷歌上搜索“game implement gravity properly”以获得准确的算法,我不是专家。
关于c - 使用 C 中的 allegro 库制作射弹射击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27527079/
我刚刚创建了一个新的 javascript 文件文件夹。 结构是: .gitignore README.md build node_modules package.json src webpack.c
我正在学习关于 simple cocos2d game 的教程. 但是在该教程中,用户发射的子弹仅朝一个方向 我该怎么做才能让它向所有方向发射而不是单向发射? 这里是方向的代码。 int offX =
我正在构建一个小型物理引擎,以给定的角度和速度发射射弹,并在每个时间间隔跟踪和显示速度/位置 vector ,但我的程序遇到了一些问题。 当我运行我的程序时,它没有循环,并且 position 变量保
我目前有一个从坦克发射的射弹。目前它工作得很好,但我无法在射弹击中目标或离开屏幕后“重新使用”射弹。这是我目前正在使用的代码; //Laser Shape sf::Texture LaserTextu
我有一个 git 仓库,其目录结构如下所示: root ---------- src | | |------ 3rd root 是我的工作目录,3rd
我是一名优秀的程序员,十分优秀!