Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
FedyaRus
1

Движение в графике. Смена направления движения

08.12.2012, 13:08. Показов 961. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Столкнулся с такой проблемой: при нажатии стрелки "влево", например, квадрат движется влево, и нужно чтобы при нажатии стрелки "вправо", 1 раз, он сразу же менял направление и двигался вправо, но в данном варианте программы квадрат движется вправо только после двух нажатий на стрелку "вправо". Может кто помочь?
P.S. пытался использовать goto m1 ,но компилятор выдает Error: Goto statements aren't allowed between different procedures.
P.P.S. Прикладываю зархивированный экзешник и код программы, может кому поможет решить мою проблему.

const
left=#75;
up=#72;
esc=#27;
right=#77;
down=#80;


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
procedure upr;
var h,gran:integer;
begin
h:=dx div 6;
        key :=readkey;
        if (key=#0) or (key=#119) or (key=#97) or (key=#100) or (key=#115) then
        begin
        key:=readkey;
        setfillstyle(1,3);
        bar(xp,yp,xp+dx-1,yp+dy-1);
{m1:}case key of
        
        Left:
        begin
        nx:=(xp div dx)+1;
        ny:=(yp div dy)+1; 
        for i:=nx downto 1 do
        if lab[ny,i]=1 then  begin gran:=(i)*dx; break; end;  
        while (xp)>gran do
        begin
        prcount(count);
        if keypressed then 
        begin
        key:=readkey;
        case key of
        Right: begin key:=right; {goto m1;} break; end;
        end; 
        end;
        delay(10);
        setfillstyle(1,2);
        bar(xp,yp,xp+dx-1,yp+dy-1);
        if xp-h<gran then xp:=gran else xp:=xp-h;
        setfillstyle(1,3);
        bar(xp,yp,xp+dx-1,yp+dy-1);
        end;
        nx:=(xp div dx)+1;
        ny:=(yp div dy)+1;
        if lab[ny,nx]=1 then nx:=nx+1;
        xp:=(nx-1)*dx;
        yp:=(ny-1)*dy;
        prcount(count);
        end;    
           
        Right: 
        begin
        nx:=(xp div dx)+1;
        ny:=(yp div dy)+1;
        xp:=(nx-1)*dx;
        yp:=(ny-1)*dy;
        for i:=nx to 25 do
        if lab[ny,i]=1 then  begin gran:=(i-2)*dx; break; end;  
        while (xp)<gran do
        begin
        prcount(count);
        delay(10);
        setfillstyle(1,2);
        bar(xp,yp,xp+dx-1,yp+dy-1);
        if xp+h>gran then xp:=gran else xp:=xp+h;
        setfillstyle(1,3);
        bar(xp,yp,xp+dx-1,yp+dy-1);
        end; 
        nx:=(xp div dx)+1;
        ny:=(yp div dy)+1;
        xp:=(nx-1)*dx;
        yp:=(ny-1)*dy;
        prcount(count);
        end;   
       
        Up: 
        begin
        nx:=(xp div dx)+1;
        ny:=(yp div dy)+1;
        xp:=(nx-1)*dx;
        yp:=(ny-1)*dy;
        for i:=ny downto 1 do
        if lab[i,nx]=1 then  begin gran:=(i)*dx; break; end;  
        while (yp)>gran do
        begin
        prcount(count);
        delay(10);
        setfillstyle(1,2);
        bar(xp,yp,xp+dx-1,yp+dy-1);
        if yp-h<gran then yp:=gran else yp:=yp-h;
        setfillstyle(1,3);
        bar(xp,yp,xp+dx-1,yp+dy-1);
        end;
        nx:=(xp div dx)+1;
        ny:=(yp div dy)+1;
        if lab[ny,nx]=1 then ny:=ny+1;
        xp:=(nx-1)*dx;
        yp:=(ny-1)*dy;
        prcount(count); 
        end;
       
        Down: 
        begin
        nx:=(xp div dx)+1;
        ny:=(yp div dy)+1;
        xp:=(nx-1)*dx;
        yp:=(ny-1)*dy;
        for i:=ny to 13 do
        if lab[i,nx]=1 then  begin gran:=(i-2)*dx; break; end;  
        while (yp)<gran do
        begin
        prcount(count);
        delay(10);
        setfillstyle(1,2);
        bar(xp,yp,xp+dx-1,yp+dy-1);
        if yp+h>gran then yp:=gran else yp:=yp+h;
        setfillstyle(1,3);
        bar(xp,yp,xp+dx-1,yp+dy-1);
        end;
        nx:=(xp div dx)+1;
        ny:=(yp div dy)+1;
        xp:=(nx-1)*dx;
        yp:=(ny-1)*dy;
        prcount(count); 
        end; 
end;
end;
end;
Вложения
Тип файла: rar Game.rar (40.3 Кб, 1 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2012, 13:08
Ответы с готовыми решениями:

Движение символа и смена направления движения при столкновении с границей окна
как сделать, чтобы символ передвигался и, доходя до рамки менял направление на обратное пишу на...

Реализовать движение шариков с возможностью выбора направления движения, их скорости, радиуса и цвета
Мне нужно чтобы три шарика двигались по окружности с центром в одной точке. С возможностью выбора...

Плавные движения в Unity и условия направления движения
Здравствуйте у меня возникла проблема дело в том что я не могу задать правильное направление...

Направления движения движения кнопок в игре пятнашки
Ребят подскажите как можно задать перемещение кнопок . по какому признаку или действию Заранее...

0
08.12.2012, 13:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2012, 13:08
Помогаю со студенческими работами здесь

Нахождение направления движения
Пользуюсь двумя формулами x1 = 0 + cos(angle)*radius; y1 = 0 + sin(angle)*radius; для...

Изменение направления движения
Label1 двигается от левого края к правому при достижении границы формы меняет направление движения...

проходной датчик направления движения
начал я обдумывать проходной луч, чтоб входящих и выходящих в помещение людей считал. красиво было...

Смена направления в Системе координат
В с++ была функция SetMapMode() она задавала режим отображения координат.. Вопрос как по мне очень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru