forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Не вижу ошибку (http://forum.boolean.name/showthread.php?t=6259)

Smarik 20.08.2008 12:57

Не вижу ошибку
 
Вложений: 1
Код:

                                procedure NewGame; 
var
key:integer;
exit,clicked:command;                       
begin
FillRect(0,0,getWidth,GetHeight);
lev.level:=1;
lev.img:=LoadImage('levimg'+lev.level+'.PNG');
lev.x:=(GetWidth/2)-(GetImageWidth(lev.img)/2);
lev.y:=(GetHeight/2)-(GetImageHeight(lev.img)/2);
fed.img:=LoadImage('/4.PNG');
fed.x:=(GetWidth/2)-(GetImageWidth(fed.img)/2);
fed.y:=(GetHeight/2)-(GetImageHeight(fed.img)/2);
fed.st:='right';
exit := CreateCommand('Выход', CM_EXIT, 1);
AddCommand(exit);
repeat
FillRect(0,0,getWidth,GetHeight);
if score<99 then lev.level:=1;
if (score>100) and (score<199) then lev.level:=2;
if (score>200) and (score<399) then lev.level:=3;
if (score>400) and (score<699) then lev.level:=4;
if (score>700) and (score<=1000) then lev.level:=5;
fed.speed:=lev.level;
randomize;
if fed.st='left' then
begin
fed.rand:=random(3);
fed.img:=LoadImage('/'+fed.rand+'.PNG');
end;
if fed.st='right' then
begin
fed.rand:=random(6)-3;
fed.img:=LoadImage('/'+fed.rand+'.PNG');
end;
DrawImage(lev.img,lev.x,lev.y);
DrawImage(fed.img,fed.x,fed.y);
key:=GetKeyPressed;
if key=KE_KEY2 then
fed.y:=fed.y-fed.speed;
if key=KE_KEY8 then
fed.y:=fed.y+fed.speed;
if key=KE_KEY6 then
begin
fed.st:='right';
fed.x:=fed.x+fed.speed;
end;
if key=KE_KEY4 then
begin
fed.st:='left';
fed.x:=fed.x-fed.speed;
end;
repaint;
delay(50);
clicked := getClickedCommand;
until clicked = exit;
if clicked=exit then halt;
removeCommand(exit);
end;

Когда игра доходит до етой процедуры видно черный екран
Внизу сам файл игры

ViNT 20.08.2008 14:26

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

Smarik 20.08.2008 15:06

Ответ: Не вижу ошибку
 
Я бы не назвал ето отрезком, процедура в полную ее велечину, некоторые переменные просто описаны как глобальные, сейчас опишу все действия, возможно станет понятнее.
Код:

    procedure NewGame; 
var
key:integer;
exit,clicked:command;                       
begin
FillRect(0,0,getWidth,GetHeight);
lev.level:=1;
{загружаем какртинку в зависимости от уровня}
lev.img:=LoadImage('levimg'+lev.level+'.PNG');

{находим координаты центра екрана}
lev.x:=(GetWidth/2)-(GetImageWidth(lev.img)/2);
lev.y:=(GetHeight/2)-(GetImageHeight(lev.img)/2);

{загружаем персонажа}
fed.img:=LoadImage('/4.PNG');

{находим координаты центра екрана}
fed.x:=(GetWidth/2)-(GetImageWidth(fed.img)/2);
fed.y:=(GetHeight/2)-(GetImageHeight(fed.img)/2);

{говорим что персонаж смотрит направо}
fed.st:='right';

{софт клавиша}
exit := CreateCommand('Выход', CM_EXIT, 1);
AddCommand(exit);

repeat
FillRect(0,0,getWidth,GetHeight);
{проверяем содержание переменной Score и устанавливаем уровень}
if score<99 then lev.level:=1;
if (score>100) and (score<199) then lev.level:=2;
if (score>200) and (score<399) then lev.level:=3;
if (score>400) and (score<699) then lev.level:=4;
if (score>700) and (score<=1000) then lev.level:=5;

{устанавливаем скорость персонажа в зависимости от уровня}
fed.speed:=lev.level;

{рендом для создания анимации}
randomize;

{если персонаж смотрит налеов загружаем либо 0.PNG или 1.PNG или 2.PNG, получается анимация}
if fed.st='left' then
begin
fed.rand:=random(3);
fed.img:=LoadImage('/'+fed.rand+'.PNG');
end;

{аналогично в другую сторону}
if fed.st='right' then
begin
fed.rand:=random(6)-3;
fed.img:=LoadImage('/'+fed.rand+'.PNG');
end;

{рисуем задний план и персонажа}
DrawImage(lev.img,lev.x,lev.y);
DrawImage(fed.img,fed.x,fed.y);

{управление}
key:=GetKeyPressed;
if key=KE_KEY2 then
fed.y:=fed.y-fed.speed;
if key=KE_KEY8 then
fed.y:=fed.y+fed.speed;
if key=KE_KEY6 then
begin
fed.st:='right';
fed.x:=fed.x+fed.speed;
end;
if key=KE_KEY4 then
begin
fed.st:='left';
fed.x:=fed.x-fed.speed;
end;

repaint;
delay(50);
clicked := getClickedCommand;
{ждем нажатия клавиши выход}
until clicked = exit;

if clicked=exit then halt;
{удаляем софт клавишу}
removeCommand(exit);

end;


vitalik1 21.08.2008 00:37

Ответ: Не вижу ошибку
 
замени lev.img:=LoadImage('levimg'+lev.level+'.PNG');
на lev.img:=LoadImage('/levimg'+lev.level+'.PNG');

несколько советов:
1. Вместо строк 'right' и 'left' используй константы:

const
left=1;
right=2;

if key=KE_KEY6 then
begin
fed.st:=right;//fed.st типа integer
fed.x:=fed.x+fed.speed;
end;
if key=KE_KEY4 then
begin
fed.st:=left;
fed.x:=fed.x-fed.speed;
end;

2. не используй софт клавиш

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

4. вместо fed.rand:=random(6)-3; пиши fed.rand:=random(3)+3;
random(6)-3 возвращает от -3 до 2
ты грузиш рисунки -3.PNG -2.PNG -1.PNG 0.PNG 1.PNG 2.PNG

Smarik 21.08.2008 15:06

Ответ: Не вижу ошибку
 
чем плохи софт клавиши? Я заметил что в основной игровой процедуре они как то странно глючат и какие альтернативы использовать?
изначально я пробовал через массив, но не работало...
Код:

                                procedure NewGame; 
var
key,i:integer;
exit,clicked:command; 
img:array[0..5] of image;                     
begin
FillRect(0,0,getWidth,GetHeight);
lev.level:=1;
lev.img:=LoadImage('/levimg'+lev.level+'.PNG');
lev.x:=(GetWidth/2)-(GetImageWidth(lev.img)/2);
lev.y:=(GetHeight/2)-(GetImageHeight(lev.img)/2);
DrawImage(lev.img,lev.x,lev.y);
delay(3000);
repaint;
lev.lev:=LoadImage('/level'+lev.level+'.PNG');
lev.x:=(GetWidth/2)-(GetImageWidth(lev.lev)/2);
lev.y:=(GetHeight/2)-(GetImageHeight(lev.lev)/2);
for i:=0 to 5 do
img[i]:=LoadImage('/'+i+'.PNG');

fed.x:=(GetWidth/2)-(GetImageWidth(img[1])/2);
fed.y:=(GetHeight/2)-(GetImageHeight(img[i])/2);
fed.st:=right;
repeat
FillRect(0,0,getWidth,GetHeight);
fed.speed:=2;
randomize;
if fed.st=left then
fed.rand:=random(3);

if fed.st=right then
fed.rand:=random(3)+3;

DrawImage(lev.lev,lev.x,lev.y);
DrawImage(img[fed.rand],fed.x,fed.y);
key:=GetKeyPressed;
if key=KE_KEY2 then
fed.y:=fed.y-fed.speed;
if key=KE_KEY8 then
fed.y:=fed.y+fed.speed;
if key=KE_KEY6 then
begin
fed.st:=right;
fed.x:=fed.x+fed.speed;
end;
if key=KE_KEY4 then
begin
fed.st:=left;
fed.x:=fed.x-fed.speed;
end;
repaint;
delay(50);
until key=ke_key0;
end;

немного оптимизировал код
массив


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

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