C Math.h 正弦和余弦根本不起作用

问题描述 投票:0回答:0

我正在 Dos 中用 C 制作 Pong...我正在使用 DosBox 和 Turbo C++ 3.0,因为它有最好的仿真系统。

为了让球移动,我使用了简单的公式:

dx = speed*cos(direction*(M_PI/180))
dy = speed*sin(direction*(M_PI/180))
,但是,每当我保存对代码的更改时,这些函数崩溃,给我奇怪的值...... 我注意到,如果我将函数
cos 
(应该是
double
)的结果转换为
float
,它会给我正确的结果,任何其他方法都不起作用......

我会把我的代码留在下面...请注意其他函数来自我构建的一组库,它们实际上什么都不做 rn...

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <time.h>
#include "libssg/ssg.c"
#include "pki.c"
#include "pfl.c"

//DEFINES
#define BSP  5
#define PSX  3
#define PSY  15
#define PADX1 75
#define X 320
#define Y 200
#define PADX2 X-PADX1
#define BSIZE 3

//headers for PFL.c
int random_dir();
double DegtoRad(int x);
void check_quit();
void main();
void paddle_player();
int player1();           //it uses  INT16h
int player2(int prev);   //it reads PORT60h
int move_paddle(int state, int y1, int PSP,int PSD);
int check_collision(int angle, int x, int y);
byte *paddle_gen(int size);

int check_collision(int angle, int x, int y){
  int a1 = 0;
  //up
  if (y >= 0){
    a1 = angle - 180;
    return a1;
  }
  return angle;
}

void main(){
  //joysticks...
  double v;
  byte frame[64000];
  byte ball[BSIZE*BSIZE];
  double angle = 0;
  int PSP = 10;
  int p2_key = 0;
  int p1_key = 0;
  int *paddle = 0;
  int y1 = (Y/2)-(PSY/2);
  int y2 = y1;
  int by = (int)Y/2;
  int bx = (int)X/2;
  float dx = 0;
  float dy = 0;
  v = (M_PI/180);
  /*    +++   INIT    +++   */ //code that executes once at game startup...
  paddle = paddle_gen(PSX*PSY);
  init_vga();
  fill_buff(0x0,frame);
  memset(ball, 15, BSIZE*BSIZE);
  srand(time(0));
  angle = 45;

  /*    +++ MAIN LOOP +++ */  //game logic and execution loop
  while (1){
    p1_key  = player1();
    p2_key  = player2(p2_key);

    //draw players...
//    draw_sprite(PADX1,y1,PSX,PSY,paddle,frame);
//    draw_sprite(PADX2,y2,PSX,PSY,paddle,frame);
    draw_sprite(by,bx,BSIZE,BSIZE,ball,frame);

    y1+= move_paddle(p1_key, y1, PSP, PSY);
    y2+= move_paddle(p2_key, y2, PSP, PSY);

    dx =  (float) cos(45*v); //here is it... v is pi/180
    dy =  (float) sin(45*v);
    bx += (int)BSP*dx;
    by += (int)BSP*dy;
    //angle = check_collision(angle, bx, by);
    //exit... change key... I suggest 'Q'
    check_quit();

    //write and refresh
    write_buff(frame);
    fill_buff(0x0,frame);
  }
}

有时它可以工作,但是,一旦我更改代码中的任何内容,它就会崩溃...

c game-development dos
© www.soinside.com 2019 - 2024. All rights reserved.