forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   плавное перемещение по одному нажатию (http://forum.boolean.name/showthread.php?t=13788)

WhiteBlack 27.11.2010 17:34

плавное перемещение по одному нажатию
 
вобщем нужно по команде
KeyHit()
переместить объект на 20 единиц вправо, чтобы при этом он двагался плавно, то есть видно было движение на каждую единицу

пробовал цикл - он просто перемедается в конечный пункт

делал задержку Delay - тоже самое

пробовал так
<code>
for i=1 to 21
old=Millisecs()
while Millisecs()-old<300
wend
translateentity entity, 1, 0, 0
next
</code>
но и так не катит, подскажите плиз

pepel 27.11.2010 17:50

Ответ: плавное перемещение по одному нажатию
 
так чтоли?
PHP код:

Graphics 640,480,16,2
SetBuffer BackBuffer 
()
Local x#,y#,dx#,dy#,mx#,my#,x1#,y1#

Repeat

mx
=MouseX()
my=MouseY()

x=x+(mx-x1)/22
y
=y+(my-y1)/22

x1
=x/2+x1
y1
=y/2+y1

x
=x*.8
y
=y*.8

Rect x1
,y1,6,6

Flip
:Cls:If KeyDown(1End
Forever 


Taugeshtu 27.11.2010 17:55

Ответ: плавное перемещение по одному нажатию
 
Учимся понимать логику программы:

Цикл выполняется итерация за итерацией , и лишь затем следует выход из цикла.
Если у тебя в цикле нет отрисовки (рендера) - то изменений в течение цикла ты не увидишь.

Решение: ввести переменную-таймер, и в главном цикле программы (где есть отрисовка) сравнивать текущее время и таймер.
Конкретнее: при нажатии кнопки переменная-таймер устанавливается на значение "текущее время + 2 секунды"; в цикле проверяется условие "если текущее время меньше, чем в переменной-таймере", и в теле этого условия лежит смещение объекта.

WhiteBlack 27.11.2010 18:32

Ответ: плавное перемещение по одному нажатию
 
я пробовал ставил
PHP код:

flip
cls 

в цикле это почему то ни на что не влияет (единственное перестал тормозить во время этого перемещения, т.е. я могу еще при этом двигать камеру)

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

WhiteBlack 27.11.2010 18:48

Ответ: плавное перемещение по одному нажатию
 
вот сделал так
PHP код:

flag=0
   
........
repeat
.....
If 
KeyHit(205flag=1
 
TurnTopCubes
()
.....
until keyhit(1)

Function 
TurnTopCubes()
    If 
flag=1 Then
        oldX
=EntityX(cubes(1))
        If 
oldX+20<>EntityX(cubes(1)) Then
            TranslateEntity cubes
(1), .5 00
        
EndIf    
        If 
oldX+20=EntityX(cubes(1)) Then     
            flag
=0
        
EndIf    
    EndIf
End Function 

теперь по нажатию вообще ничего не происходит, блин, где ошибка:dontknow:

Nex 27.11.2010 18:51

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

WhiteBlack 27.11.2010 18:55

Ответ: плавное перемещение по одному нажатию
 
Цитата:

Сообщение от Nex (Сообщение 170071)
WhiteBlack, учите основы, почитайте уроки и все получится.

обязательно почитаю, но у меня совсем не времени, нужно сделать за пару дней, если не трудно объясните как это сделать, и почему мой код не работает, ведь все вроде правильно

pepel 27.11.2010 19:07

Ответ: плавное перемещение по одному нажатию
 
если переменную не обьявлять глобальной то она на каждый цикл будет обнулятся

если oldX=EntityX(cubes(1)) прописать в функции после If flag=1 то oldX будет постоянно присваивать измененное значение, т.е. его нужно определить один раз во время нажатия кнопки

еще можно упростить оператор if с помщью else

PHP код:

global flag=
global oldX
   
........ 
repeat 
..... 
If 
KeyHit(205flag=:oldX=EntityX(cubes(1)) 
  
TurnTopCubes() 
..... 
until keyhit(1

Function 
TurnTopCubes() 
    If 
flag=1 Then 
        If 
EntityX(cubes(1))<oldX+20 Then 
            TranslateEntity cubes
(1), .5 0
       
else
          
flag=
       
EndIf     
    EndIf 
End Function 


WhiteBlack 27.11.2010 19:24

Ответ: плавное перемещение по одному нажатию
 
pepel, блин спасибо, что то я про это забыл:)
теперь он почему то не останавливается после 20 единиц перемещения
странно, объявил как глобальную перемещение стоит по 0.5, значит через 40 циклов должен остановиться вроде

pepel 27.11.2010 19:29

Ответ: плавное перемещение по одному нажатию
 
попробуй так:

If EntityX(cubes(1))<oldX+20
TranslateEntity cubes(1), .5 , 0, 0
else
flag=0
EndIf

WhiteBlack 27.11.2010 19:34

Ответ: плавное перемещение по одному нажатию
 
Цитата:

Сообщение от pepel (Сообщение 170092)
попробуй так:

If EntityX(cubes(1))<oldX+20
TranslateEntity cubes(1), .5 , 0, 0
else
flag=0
EndIf

о спасибо заработало, наверно я полный нуб, потому что я не вижу разницы между
PHP код:

If oldX+20<>EntityX(cubes(1)) Then 

и
PHP код:

If EntityX(cubes(1))<oldX+20 

хотя да первый(мой) более тупой по условию
ну ладно всем большущее спасибо

baton4ik 27.11.2010 19:37

Ответ: плавное перемещение по одному нажатию
 
<> - не равно
< - меньше

WhiteBlack 27.11.2010 19:41

Ответ: плавное перемещение по одному нажатию
 
Цитата:

Сообщение от baton4ik (Сообщение 170095)
<> - не равно
< - меньше

спасибо большое за объяснения, это я знаю
у меня была идея пока не равно двигается, как только стало равным прекращается

pax 27.11.2010 21:02

Ответ: плавное перемещение по одному нажатию
 
Вообще не целочисленные переменные сравнивать надо с погрешностью, а не простым "=" или "<>" т.к. они не точные.


Часовой пояс GMT +4, время: 00:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot