[C++] [Allegro] Problem z ruchem kółka odbijającego się od ścian


(Kamil Kocurek) #1

Witam, oto kod mojego programu:

 

main.cpp:

#include "lib.h"

void moveCircle(){
    tempX = x;
    tempY = y;

    if (dir == 1 && x != 20 && y != 20){
        --x;
        --y;
    }
    else if (dir == 2 && x != 20 && y != 460){
        --x;
        ++y;
    }
    else if (dir == 3 && x != 620 && y != 20){
        ++x;
        --y;
    }
    else if (dir == 4 && x != 620 && y != 460){
        ++x;
        ++y;
    }
    else{
        dir = rand() % 1 + 4;
    }
    acquire_screen();
    circlefill (screen, tempX, tempY, 20, makecol(0, 0, 0));
    circlefill (screen, x, y, 20, makecol(0, 255, 0));
    release_screen();

    rest(10);
}

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(16);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0 ,0);

    while(!key[KEY_ESC]){
        moveCircle();
    }

    return 0;
}
END_OF_MAIN();

lib.h

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

#include <allegro.h>
#include <cstdlib>

int x = 100;
int y = 100;

int tempX = 100;
int tempY = 100;

int dir = 1;

#endif // LIB_H_INCLUDED

Pytanie dlaczego piłka nie odbija się po dotarciu do drugiej ściany? Wie ktoś może jak temu zaradzić?


(Marcin Obala) #2

Ja pamiętam jak to robiłem ale w C# to miałem tylko 2 ify

 

Mój ruch wyglądał tak:

int moveX=1;
int moveY=1;
//
void ruch()
{
kwadrat.X += moveX;
kwadrat.Y += moveY;

if(kwadrat.X >= wartoscGranicznaGórna || kwadrat.X < WartośćGranicznaDolna)
moveX *= -1;

if(kwadrat.Y >= wartoscGranicznaGórna|| kwadrat.Y < WartośćGranicznaDolna)
moveY *= -1;
}

Bardzo prosto, jak dojeżdżam do granicy okna to odwracam ruch.