forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Проблемы разработки от EvilOkta (http://forum.boolean.name/showthread.php?t=17911)

EvilOkta 11.10.2013 23:28

Ответ: Передача переменной в метод
 
ребят, глупый вопрос но все-таки. Делаю метод CheckInBorders:
PHP код:

public class CameraNavigation MonoBehaviour {    
List<
floatBorders = new List<float>(); //список экранных маркеров
    
public enum GetBordersInfo {None,Left,Right,Up,Down}; // присвоение попавшей рамки
    
public GetBordersInfo BordersInfo;
    const 
float ScreenPercent 0.05f;
        
    
void Start () {
    
ScreenWidth Screen.width;
    
ScreenHeight Screen.height;    
    
    
Borders.Add ((float)0f); // 0 - слева начало
    
Borders.Add ((float)ScreenWidth*ScreenPercent); // 1 - слева конец
    
Borders.Add ((float)ScreenWidth*(1-ScreenPercent)); // 2 - справа начало
    
Borders.Add ((float)ScreenWidth); // 3 - справа конец
    
Borders.Add ((float)0f); // 4 - сверху начало
    
Borders.Add ((float)ScreenHeight*ScreenPercent); // 5 - сверху конец
    
Borders.Add ((float)ScreenHeight*(1-ScreenPercent)); // 6 - снизу начало 
    
Borders.Add ((float)ScreenHeight); // 7 - снизу конец

public void CheckInBorders () {
    
float MouseXCord Input.mousePosition.x;
    
float MouseYCord Input.mousePosition.y;
    
    if ((
MouseXCord >= Borders[0])&(MouseXCord <= Borders[1])) GetBordersInfo.Left;
    if ((
MouseXCord >= Borders[2])&(MouseXCord <= Borders[3])) GetBordersInfo.Right;    
    if ((
MouseYCord >= Borders[4])&(MouseYCord <= Borders[5])) GetBordersInfo.Up;
    if ((
MouseYCord >= Borders[6])&(MouseYCord <= Borders[7])) GetBordersInfo.Down;
    if ((
MouseXCord >= Borders[1])&(MouseXCord <= Borders[2])&(MouseYCord >= Borders[5])&(MouseYCord <= Borders[6])) GetBordersInfo.None;
    }


привел выдержки из кода касаемые этого метода

он по идее должен проверить в какую из рамок экрана попал курсор мыши (для навигации камеры)
но компилятор на каждом условии выдает ошибку cs0201
метод вызывается из метода update.
Не могу понять почему так. MouseXCord, MouseYCord инициализируются при каждом вызове метода, типы соблюдаются... в чем может быть косяк?

pax 11.10.2013 23:40

Ответ: Передача переменной в метод
 
везде return забыл и тип функции GetBordersInfo, после каждого условия компилятор не понимает что делать со значением.

seaman 12.10.2013 00:46

Ответ: Передача переменной в метод
 
Цитата:

везде return забыл
Зачем? Если все методы void?
Стоп! А что по мнению вопрошающего делает выражение "GetBordersInfo.Left"? Оно возвращает значение enum. Что делают с этим значением - либо присваивают чему то, либо возвращают из функции. pax решил, что надо вернуть. Что хотели Вы?
Цитата:

тип функции GetBordersInfo
Это ж не функция, а enum.

Ошибка в том, что нет скобки '}' у метода Start

EvilOkta 12.10.2013 06:54

Ответ: Передача переменной в метод
 
про скобку - просто пропустил в цитате.
return не используется, но я понял с вашей помощью в чем косяк, я не правильно обновлял контейнер для enum
PHP код:

if ((MouseXCord >= Borders[0])&(MouseXCord <= Borders[1])) BordersInfo GetBordersInfo.Left;
    if ((
MouseXCord >= Borders[2])&(MouseXCord <= Borders[3])) BordersInfo GetBordersInfo.Right;    
    if ((
MouseYCord >= Borders[4])&(MouseYCord <= Borders[5])) BordersInfo GetBordersInfo.Up;
    if ((
MouseYCord >= Borders[6])&(MouseYCord <= Borders[7])) BordersInfo GetBordersInfo.Down;
    if ((
MouseXCord >= Borders[1])&(MouseXCord <= Borders[2])&(MouseYCord >= Borders[5])&(MouseYCord <= Borders[6])) BordersInfo GetBordersInfo.None

глупо, контейнер объявил но его не обновлял, но ваши подсказки как раз и дали понять )) спасибо

кстати еще один вопрос, есть ли в C# конструкции которые позволяют условия типа ((x > a)&(x < b)) записывать более компактно? Именно попадание переменной в диапазон

pax 12.10.2013 08:59

Ответ: Передача переменной в метод
 
Цитата:

Сообщение от EvilOkta (Сообщение 268663)
кстати еще один вопрос, есть ли в C# конструкции которые позволяют условия типа ((x > a)&(x < b)) записывать более компактно? Именно попадание переменной в диапазон

Вроде нет

seaman 12.10.2013 14:30

Ответ: Передача переменной в метод
 
Напиши расширение, если нужно:
Код:

public static class Extension
{
    public static bool InRange(this float val, float min, float max)
    {
        return val > min && val < max;
    }
}

Используем:
if(x.InRange(a, b))

pax 12.10.2013 17:09

Ответ: Передача переменной в метод
 
Это не на много короче, а по сути одно и то же. Плюс ты написал расширение с проверкой, что граничные значения диапазона не учитываются.

Кстати ты используешь побитовый И (&). Для чего? Надо обязательно проверить два условия? Оператор && остановит выполнение если уже не верно левое условие.

EvilOkta 12.10.2013 17:54

Ответ: Передача переменной в метод
 
Цитата:

Сообщение от pax (Сообщение 268677)
Кстати ты используешь побитовый И (&). Для чего? Надо обязательно проверить два условия? Оператор && остановит выполнение если уже не верно левое условие.

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

EvilOkta 14.10.2013 00:53

Ответ: Передача переменной в метод
 
блин, ребят помогите, опять застрял, четвертый час бьюсь а косяка не могу найти до сих пор.
В чем смысл - делаю навигацию камеры с небольшим движением по инерции после смены направления. Но почему-то весь блок где инерция должна по идее происходить - не происходит. Хотя если вставить отладчики, то видно что эти блоки выполняются.
PHP код:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class 
CameraNavigation MonoBehaviour {
     
    public 
Transform CameraTransform//основа навигации камеры
    
public GameObject CameraTarget//цель камеры
    
public float SpeedSpeedXSpeedYRealSpeedXRealSpeedYSpeedXFromSpeedYFrom;
    public 
int ScreenWidthScreenHeight// размеры экрана
    
public bool inInertia//инерция камеры
        
    
List<floatBorders = new List<float>(); //список экранных маркеров
    
public enum GetBordersInfo {None,Left,Right,Up,Down,UpLeft,UpRight,DownLeft,DownRight}; // присвоение попавшей рамки
    
public GetBordersInfo BordersInfoBordersInfoSave;
    
    const 
float ScreenPercent 0.05f;
    
// Use this for initialization
    
    
    
void Start () {
    
ScreenWidth Screen.width;
    
ScreenHeight Screen.height;    
    
CameraTransform transform;
    
Speed 0.5f;
            
    
inInertia false;    
    
Borders.Add ((float)ScreenWidth*ScreenPercent); // 0 - слева
    
Borders.Add ((float)ScreenWidth*(1-ScreenPercent)); // 1 - справа
    
Borders.Add ((float)ScreenHeight*ScreenPercent); // 2 - сверху
    
Borders.Add ((float)ScreenHeight*(1-ScreenPercent)); // 3 - снизу 
    
    
}
    
    
// Update is called once per frame
    
void Update () {
    
        
СheckInBorders(); // - проверка попадания в рамки
    
CameraTransform.Translate(new Vector3(RealSpeedX,0,RealSpeedY));    
    
    }
        
    public 
void CheckInBorders () {
    
float MouseXCord Input.mousePosition.x;
    
float MouseYCord Input.mousePosition.y;
    
    if (
inInertia == false) {    
        
BordersInfoSave BordersInfo;
        if ((
MouseXCord <= Borders[0])&&(BordersInfo != GetBordersInfo.Left)) BordersInfo GetBordersInfo.Left;
        if ((
MouseXCord >= Borders[1])&&(BordersInfo != GetBordersInfo.Right)) BordersInfo GetBordersInfo.Right;
        if ((
MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.Down)) BordersInfo GetBordersInfo.Down;
        if ((
MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.Up)) BordersInfo GetBordersInfo.Up;
        if ((
MouseXCord <= Borders[0])&&(MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.UpLeft)) BordersInfo GetBordersInfo.UpLeft;
        if ((
MouseXCord >= Borders[1])&&(MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.UpRight)) BordersInfo GetBordersInfo.UpRight;
        if ((
MouseXCord <= Borders[0])&&(MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.DownLeft)) BordersInfo GetBordersInfo.DownLeft;
        if ((
MouseXCord >= Borders[1])&&(MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.DownRight)) BordersInfo GetBordersInfo.DownRight;
        if ((
MouseXCord >= Borders[0])&&(MouseXCord <= Borders[1])&&(MouseYCord >= Borders[2])&&(MouseYCord <= Borders[3])&&(BordersInfo != GetBordersInfo.None)) BordersInfo GetBordersInfo.None;
        }
        
    if (
BordersInfoSave != BordersInfo
        {
SpeedXFrom SpeedX;
        
SpeedYFrom SpeedY;
        
inInertia true;
        
        switch (
BordersInfo) {
        case 
GetBordersInfo.Left:
            
SpeedY Speed;
            
SpeedX 0f;
            break;
        case 
GetBordersInfo.Right:
            
SpeedY = -Speed;
            
SpeedX 0f;
            break;
        case 
GetBordersInfo.Up:
            
SpeedX Speed;
            
SpeedY 0f;
            break;
        case 
GetBordersInfo.Down:
            
SpeedX = -Speed;
            
SpeedY 0f;
            break;
        case 
GetBordersInfo.UpLeft:
            
SpeedX SpeedY Speed;
            break;
        case 
GetBordersInfo.DownLeft:
            
SpeedX = -Speed;
            
SpeedY Speed;
            break;
        case 
GetBordersInfo.UpRight:
            
SpeedX Speed;
            
SpeedY = -Speed;
            break;    
        case 
GetBordersInfo.DownRight:
            
SpeedX SpeedY = -Speed;
            break;
        case 
GetBordersInfo.None:
            
SpeedX SpeedY 0f;
            break;
            }
        
BordersInfoSave BordersInfo;
        }
                    
        if (
inInertia == true) {
            
RealSpeedX Mathf.Lerp(SpeedXFromSpeedXTime.time/2f);
            
RealSpeedY Mathf.Lerp(SpeedYFromSpeedYTime.time/2f);
            if ((
RealSpeedX == SpeedX)&&(RealSpeedY == SpeedY)) inInertia false;
        }
    }
    


По задумке переменная RealSpeedX должна плавно в течение двух секунд изменяться от SpeedXFrom до SpeedX, притом они отслеживаются при изменении направления движения камеры.
Т.е. если курсор был в левой части экрана GetBordersInfo.Left то при перемещении в центральную часть GetBordersInfo.None скорость должна плавно угаснуть с 1 до 0.
Но не выходит, всю голову поломал.

PS: Внимание, много говнокода!

dsd 14.10.2013 01:08

Ответ: Передача переменной в метод
 
RealSpeedX = Mathf.Lerp(SpeedXFrom, SpeedX, Time.time/2f); сдается мне что третье число в формуле должно лежать в диапазоне 0...1, а оно уже через 2 секунды от старта будет всегда больше 1, то есть надо выделить целую часть от такого числа и вычесть из исходного. Но хз как то оче сложно все для такой задачи.

EvilOkta 14.10.2013 01:15

Ответ: Передача переменной в метод
 
Цитата:

Сообщение от dsd (Сообщение 268734)
RealSpeedX = Mathf.Lerp(SpeedXFrom, SpeedX, Time.time/2f); сдается мне что третье число в формуле должно лежать в диапазоне 0...1, а оно уже через 2 секунды от старта будет всегда больше 1

делал по справкам, там как раз рекомендуют Time.time делить на кол-во секунд на протяжении которых делается интерполяция, я пока для пристрела поставил две секунды чтобы отследить правильность реагирования скрипта.
Вроде до второй секунды Time.time/2f и будет давать диапазон 0..1 или я ошибаюсь?

pax 14.10.2013 07:24

Ответ: Передача переменной в метод
 
Как-то так

PHP код:

float _interpolationTime 0// поле класса
...
   if (
BordersInfoSave != BordersInfo
        {
SpeedXFrom SpeedX;
        
SpeedYFrom SpeedY;
        
inInertia true;
        
_interpolationTime 0// при начале инерции обнуляем время начала

...
   
        if (
inInertia == true) {
            
_interpolationTime += Time.deltaTime// прибавляем прошедшее время
            
RealSpeedX Mathf.Lerp(SpeedXFromSpeedX_interpolationTime/2f);
            
RealSpeedY Mathf.Lerp(SpeedYFromSpeedY_interpolationTime/2f); 


EvilOkta 14.10.2013 14:52

Ответ: Передача переменной в метод
 
Спасибо pax! То что нужно. Сразу в голову не пришло что нужно фиксировать начало инерции.

EvilOkta 15.10.2013 21:49

Ответ: Передача переменной в метод
 
как-нибудь можно отследить одновременное нажатие двух клавиш с помощью Input.GetKey? в том плане, что одна кнопка вызывает одно действие, вторая - другое, а две вместе третье

pax 15.10.2013 22:46

Ответ: Передача переменной в метод
 
Ну...
PHP код:

if(Input.GetKey(1) && Input.GetKey(2)){
// две
} else if(Input.GetKey(1){
 
// первая
}else if(Input.GetKey(2){
 
// вторая




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

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