forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   MidletPascal (http://forum.boolean.name/forumdisplay.php?f=46)
-   -   Помогите исправить ошибку (http://forum.boolean.name/showthread.php?t=15748)

leonid 12.11.2011 13:45

Ответ: Помогите исправить ошибку
 
PHP код:

//
if (x=unit1x) and (y=unit1ythen //если коорд. курсора совпадают с коорд. юнита,то...
         
begin
         facewindow
:=loadImage('/face1.png'); //загружаем рожу юнита(будет отображаться на нижнем баре)
         
nameOnBar:='О Р К'//присваиваем имя юнита, которое будет около рожи
         
end else //иначе (это когда курсор не на юнете, а на земле)
         
nameOnBar:='З Е М Л Я'//присваиваем другое имя        
         
facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку
         
         
drawImage(facewindow,scrW-sW-3,scrH-SH-3); //размещаем ее на баре
         
SetColor(180,250,0); 
         
DrawText(nameOnBar,scrW-getStringWidth(nameOnBar)-35,scrH-getStringHeight(nameOnBar)-4); //и текст 

Проблема в том, что если строка

"nameOnBar:='З Е М Л Я'; //присваиваем другое имя"

ставится выше

"facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку",

то выполняется только верхняя строка. Если же поменять их местами, будет опять же выполняться та, которая выше. Как сделать так, чтобы выполнялись сразу обе?

leonid 12.11.2011 14:18

Ответ: Помогите исправить ошибку
 
А, всё. Ввёл еще условие.

PassCall 12.11.2011 14:21

Ответ: Помогите исправить ошибку
 
Было бы хорошо иметь весь код, а то я смутно понимаю предназначение кода.

Но в общем я догадываюсь о сути ошибки

PHP код:

end else //иначе (это когда курсор не на юнете, а на земле) 
         
nameOnBar:='З Е М Л Я'//присваиваем другое имя         
         
facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку 

объясняю:
видиш ли, если не указаны begin и end, то выполняется одна, следующая команда. Давай разберем пошагово

if (x=unit1x) and (y=unit1y) then
Если в выделенной клетке монстр, то...

begin
facewindow:=loadImage('/face1.png'); //загружаем рожу юнита(будет отображаться на нижнем баре)
nameOnBar:='О Р К'; //присваиваем имя юнита, которое будет около рожи
end;

Загружаем в память иконку орка (и причем это сделано очень неправильным образом, иконки следует загрузить заранее), и меняем текст на "орк"

else //иначе (это когда курсор не на юнете, а на земле)
nameOnBar:='З Е М Л Я'; //присваиваем другое имя

Иначе делаем текст "земля"
так как сдесь нет begin и end, выполнятсмя будет только nameOnBar:='З Е М Л Я'; Все, условие закончилось.

facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку
А вот эта штука будет выполняться в ЛЮБОМ случае, так как не относиться к условию. Тоесть даже если в клетке стоит орк, и мы загрузим его иконку, то вот эта команда загрузит землю.

Правильно будет так:
PHP код:

if (x=unit1x) and (y=unit1ythen //если коорд. курсора совпадают с коорд. юнита,то... 
         
begin 
         facewindow
:=loadImage('/face1.png'); //загружаем рожу юнита(будет отображаться на нижнем баре) 
         
nameOnBar:='О Р К'//присваиваем имя юнита, которое будет около рожи 
         
end else
begin //иначе (это когда курсор не на юнете, а на земле) 
         
nameOnBar:='З Е М Л Я'//присваиваем другое имя         
         
facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку 
end;
          
         
drawImage(facewindow,scrW-sW-3,scrH-SH-3); //размещаем ее на баре 
         
SetColor(180,250,0);  
         
DrawText(nameOnBar,scrW-getStringWidth(nameOnBar)-35,scrH-getStringHeight(nameOnBar)-4); //и текст 


leonid 12.11.2011 14:43

Ответ: Помогите исправить ошибку
 
"видиш ли, если не указаны begin и end, то выполняется одна, следующая команда."

В принципе, можно было сказать только это, я понял =)

barsunduk 12.11.2011 15:10

Ответ: Помогите исправить ошибку
 
и еще одна мелочь. если твой курсор перемещается с шагом, меньше размеров спрайта, или нужно проверить простейшее столкновение произвольно шатающихся по экрану спрайтов по их размеру (одинаковому у обоих), то можно использовать примерно такие функции:

PHP код:

// находится ли точка внутри прямоугольника?
// функция возвращает истину, если точка (pX, pY)
// в пределах прямоугольника (rX, rY, sW, sH), где
// (rX, rY) - левый верхний угол прямоугольника,
// (sW, sH) - его ширина и высота (размеры спрайта)
function PtInRect(pXpYrXrYInteger): boolean;
begin
    
if (pX >= rX)and(pY >= rY)and(pX rX sW)and(pY rY sHthen
        PtInRect 
:= true
    
else
        
PtInRect := false;
end;

// пересекаются ли прямоугольники?
// размеры обоих прямоугольников равны размерам спрайта (sW, sH)
// на входе - координаты левых верхних углов наших прямоугольников
function RCollision(rX1rY1rX2rY2Integer): boolean;
begin
    RCollision 
:= PtInRect(rX1rY1rX2rY2)
        or 
PtInRect(rX1 sWrY1rX2rY2)
        or 
PtInRect(rX1 sWrY1 sHrX2rY2)
        or 
PtInRect(rX1rY1 sHrX2rY2);
end


leonid 12.11.2011 15:59

Ответ: Помогите исправить ошибку
 
хм... Пока мне это не нужно, но всё равно благодарю. Наверное, пригодится.

leonid 12.11.2011 17:43

Ответ: Помогите исправить ошибку
 
А вот смотрите:

PHP код:

if (x=unit1x) and (y=unit1y) and (key KE_KEY5then //если курсор на юните и кликнута "5"...
    
begin
         condOnBar
:='Выбран'//меняем состояние на баре
         
if (key KE_KEY5then //если была снова кликнута "5"...
            
begin
               unit1x
:=x//перемещение юнита 
               
unit1y:=y//на положение курсора
            
end;         
    
end

Ну, если кликаем по юниту, его состояние меняется на "выбран", если кликаем еще раз, он перемещается на место, где курсор (как в Ancient Empires).

Состояние меняется, а юнит не перемещается. В чем дело?

baton4ik 12.11.2011 17:58

Ответ: Помогите исправить ошибку
 
Потому что ты огромный лентяй, который ленится почитать что-нибудь по основам программирования и паразитирует на добрых форумчанах, которые разжёвывают тебе каждую мелочь вместо того, чтоб послать куда подальше. Ты допускаешь найглупейшие ошибки. Ты отнимаешь кучу времени у barsunduk и PassCall, сам не удосужившись приложить минимум усилий и почитать встроенную справку и какую-нибудь статью. Я следил за темой с самого начала и всё время сдерживался.
Представь себе, что ты нанял репетитора по алгебре, ничего не учишь, спрашиваешь, сколько будет 2+3 после того, как он объяснил тебе сколько будет 2+2. А после того, как он ответил, ты спрашиваешь, сколько будет 2+4. Научись прибавлять сам! Мало того, в итоге ты отказываешься платить репетитору. Ты делаешь абсолютно тоже самое.
Я закончил.

leonid 12.11.2011 19:20

Ответ: Помогите исправить ошибку
 
baton4ik, извините, больше не буду.


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

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