Jump to content
Lísias de Castro

trajeto linear em linguagem c

Recommended Posts

Ola, sou Lísias e gostaria de saber se alguém poderia me ajudar nessa tarefa tão difícil para finalizar minha biblioteca.

Eu fiz um motor de jogos, e nele já consegui implementar todas as funções básicas para um uso primário. Fazendo a criação de jogos simples através dela.

Mas estou desenvolvendo um rpg, e resolvi fazer com que os personagens atirem a longa distância. Porém, para que isso aconteça, tenho que fazer com que o objeto a ser atirado sempre corra em linha reta.

Criei uma função que faz com que todos os objetos se movam na tela, mas ela não funciona de uma maneira linear. O que posso modificar nessa função para que ela me proporcione isso?

 

static STATUS place_user_move(OBJECT_SET * U, BP32 x, BP32 y) {
    if (U == NULL)return (Off);
    if (U->x_route == x) {
        if (U->y_route > y) {
            U->y_route -= U->y_speed;
            U->where_stop_but(U, NORTH);
            if (U->y_route < y) {
                U->y_route = y;
                U->where_stop(U);
                return (On);
            }
        }
        if (U->y_route < y) {
            U->y_route += U->y_speed;
            U->where_stop_but(U, SOUTH);
            if (U->y_route > y) {
                U->where_stop(U);
                U->y_route = y;
                return (On);
            }
        }
        return (Off);
    }
    if (U->y_route == y) {
        if (U->x_route > x) {
            U->x_route -= U->x_speed;
            U->where_stop_but(U, WEST);
            if (U->x_route < x) {
                U->where_stop(U);
                U->x_route = x;
                return (On);
            }
        }
        if (U->x_route < x) {
            U->x_route += U->x_speed;
            U->where_stop_but(U, EAST);
            if (U->x_route > x) {
                U->where_stop(U);
                U->x_route = x;
                return (On);
            }
        }

        return (Off);
    }
    if (U->x_route > x) {
        U->x_route -= U->x_speed;
        if (U->x_route < x)U->x_route = x;
        if (U->y_route > y) {
            U->y_route -= U->y_speed;
            U->where_stop_but_and(U, NORTH, WEST);
            if (U->y_route < y)U->y_route = y;
        }
        if (U->y_route < y) {
            U->where_stop_but_and(U, SOUTH, WEST);
            U->y_route += U->y_speed;
        }
    }
    if (U->x_route < x) {
        U->x_route += U->x_speed;
        if (U->x_route > x)U->x_route = x;
        if (U->y_route < y) {
            U->y_route += U->y_speed;
            U->where_stop_but_and(U, SOUTH, EAST);
            if (U->y_route > y)U->y_route = y;
        }
        if (U->y_route > y) {
            U->y_route -= U->y_speed;
            U->where_stop_but_and(U, NORTH, EAST);
            if (U->y_route < y)U->y_route = y;
        }
    }
    return (Off);
}

PLACE_CALL STATUS PLACE_TYPE place_user_route(CHAINED * user, BP32 x, BP32 y) {
    if (user && USER_C(user->it)->object && bit_is_on(USER_C(user->it)->object->status, OBJECT_VISIBLE)) {
        OBJECT_SET * U = USER_C(user->it)->object;
        if (U->x_route == x && U->y_route == y) {
            obj_where_stop_all(U);
            return (On);
        }
        //printf("xs %f ys %f\n",object->x_speed,object->y_speed);
        return (place_user_move(U, x, y));
    }
    return (Off);
}

#define sign(x) ((x > 0) ? 1 : ((x < 0) ? -1 : 0) )

PLACE_CALL STATUS PLACE_TYPE place_user_straight(CHAINED * user, BP32 x1, BP32 y1) {
    if (user && USER_C(user->it)->object && bit_is_on(USER_C(user->it)->object->status, OBJECT_VISIBLE)) {
        OBJECT_SET * O = USER_C(user->it)->object;
        BP32 dx, dy;

        dx = x1 - O->x_route;
        dy = y1 - O->y_route;

        static BP32 x = -1, y = -1, p = -1;
        if (x == -1)x = O->x_route;
        if (y == -1)y = O->y_route;
        if (p == -1)p = 2 * dy - dx;

        printf("x %lf y %lf\n", x, y);
        if (x < x1) {
            if (p >= 0) {
                y = y + 1;
                p = p + 2 * dy - 2 * dx;
            } else {
                p = p + 2 * dy;
            }
            x = x + 1;
        } else {
            O->x_route = x;
            O->y_route = y;
            x = -1;
            y = -1;
            p = -1;
            return (On);
        }
        O->x_route = x;
        O->y_route = y;
        x = -1;
        y = -1;
        p = -1;
    }
    return (Off);
}

a função user_place_straight foi minha tentativa de implementar bresenham que promete fazer o que estou tentando.

 

Isso é o que fá fiz com o motor: https://www.youtube.com/watch?v=nuLi_lB6c4Y&feature=youtu.be

 

Mas até agora não estou conseguindo resultado

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Nwband
      programar um determinado programa pf
       
      Preciso de um programa em C que seja capaz de ler uma frase com ate 100 caracteres e imprimi-la, conseguir identificar quantas letras maiusculas e minusculas tem na frase e escreve-la ao contrario
    • By Auface
      Pessoal estou iniciando na programaçaoem C e tenho este trabalho para fazer.
       
      Ajudem por favor , programação em C, e não tenho a minima ideia de como fazer, o enunciado é em inglês e está, neste link, é o exercício B(building a field).
      http://maratona.ime.usp.br/hist/2018/resultados18/contest_onesided.pdf
      Por enquanto eu fiz isso, mas não tenho certeza se começo assim.eu acho também que tenho que fazer este exercício a partir de um arquivo e lendo ele, mas também n sei como fazer.
       
      #include <stdio.h> int main() {     float x1,y1,x2,y2;     printf("Ponto 1: \n");     scanf("%f %f",&x1,&y1);     printf("Pont 2: \n");     scanf("%f %f",&x2,&y2);     printf("%.4f\n",(sqrt(pow(x2-x1,2)+pow(y2-y1,2))));     return 0; }
    • By eduardobraz
      Corrigir dois erros:
       
      entrada:
      10 4
      -93 -86 49 -62 -90 -63 40 72 11 67
       
      Saída
      NAO
      6
      5
      4
      2
      1
       
      Mais com esse está assim
      NAO
      1
      3
      4
      5
       
       
      #include <stdio.h>
      int main(){
          int n, k, i, j, cont, vetor[1000], aux, po;
          while (1){
              
              scanf("%d %d", &n, &k);
              
              if(n <= 1000 && n >= 0 && k <= 1000 && k >= 0){
                  
                  break;
                  
              }
          }
          for(i = 0; i < n; i++){
              
              scanf("%d", &vetor);
              
          }
          for(i = 0; i < n; i++){
          
              if(vetor <= 0){
                  cont++;
              }
          }
          if(cont >= k){
              printf("NAO\n");
              for(i=1; i<n; i++){
                  if (vetor <= 0){
                      aux = vetor;
                      po=i;                 
                      printf("%d\n", po);
                  }
              }
          }
          else{
              printf("SIM\n");
          }
      }
    • By soaresgusta
      Boa tarde, exercício pede a seguinte questão:

      Faça um programa que leia um valor x qualquer e calcule:
      Y = ( x+1)+(x+2)+(x+3)+(x+4)+(x+5)+...(x+100).

      Eu não estou conseguindo criar uma função Y na linguagem que some de 1 a 100.

      #include <stdio.h>
      #include <stdlib.h>

      int main ()
      {
      int Y=0, x, i=1;

      for (i=1;i<=100;i++);
      {
      Y= (x+i);
      printf("Digite um numero inteiro qualquer: \n");
      scanf ("%d", x);

      printf("Y = %d \n", Y);
      i++;

      }
      return (0);
      }

      Pela lógica, i varia de 1 a 100, mas quando eu executo o programa ele não soma. Alguém pode me ajudar?
    • By Leonard123456789
      fazer um programa  que pede ao usuário que entre com os valores de 0 a 10. Não pode ser maior que 10 e nem menor que 0 é não pode ter números repetidos e nem iguais
       
      var v,cont,igual:inteiro inicio cont <- 0 enquanto (cont <= 5) faca escreva("Digite os valores de 0 a 5: ") leia(v) se (v >5) entao escreval("Número errado!") fimse cont <- cont + 1 fimenquanto fimalgoritmo  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.