Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Нужен совет к 2D аркаде!   Найти похожие ветки 

 
ZAROLF ©   (2003-12-14 16:49) [0]

Вообщем дела такие, надо оружие подогнать под выстрел. Мало того в четырёх разных положениях:стоя влево,стоя вправо,сидя влево,сидя вправо.
И все это оказалось не так просто, обычный "angle" всеголишь разворачивал
спрайт, а спрайт этот анимированый.

И вот под каждое положение нужно чтото подобное:

if isButton1 in MainForm.DXInput.States then //здесь типа выстрел
   begin
     with TShoot2.Create(Engine) do
     begin
       PixelCheck := True;
       Image := MainForm.ImageList.Items.Find("Shoot2");
       X := Self.X+Self.Width  -40;
       Y := Self.Y+Self.Height -38;
       Width := Image.Width;
       Height := Image.Height;
   end;
 end;

constructor TShoot2.Create(AParent: TSprite);
begin
inherited Create(AParent);
 Image := MainForm.ImageList.Items.Find("Shoot2");
 Width := Image.Width;
 Height := Image.Height;
end;

Procedure TShoot2.DoMove(MoveCount: Integer);
Begin
inherited DoMove(MoveCount);
if y<= 0 then Dead;
if y>= 480 then Dead;
x:=x+5;
if m mod 1 = 0 then
if AnimCount<5 then inc(AnimCount) else AnimCount:=0;
AnimPos:= AnimCount;
end;


 
SoulSilver   (2003-12-14 21:43) [1]

Сформулируй вопрос конкретнее, я тоже пишу 2D Аркаду и постараюсь помочь. Как я понял у тебя есть картинка персонажа и надо сделать так, чтобы граммотно смотрелось оружие. Для поворота влево и вправо сделай две картинки, а для приседания смещай картинку оружия вниз по Y.


 
ZAROLF ©   (2003-12-15 07:27) [2]

> SoulSilver   (14.12.03 21:43) [1]
> Сформулируй вопрос конкретнее, я тоже пишу 2D Аркаду и постараюсь
> помочь. Как я понял у тебя есть картинка персонажа и надо
> сделать так, чтобы граммотно смотрелось оружие. Для поворота
> влево и вправо сделай две картинки, а для приседания смещай
> картинку оружия вниз по Y.
-----------------------------------------------------------------

Дык персонаж уже готов, реч идёт о том - что надо задать точку для вылета пули из ствола.
В одном положении (например стоя влево) это легко сделать, подогнал координаты x,у и стреляй сколько влезет. А тут надо под
каждое положение, и пуля чтоб вылетала из ствола а не из головы например.


 
Thor ©   (2003-12-15 13:34) [3]


> ZAROLF ©   (15.12.03 07:27) [2]

а какие проблемы привязать начальную координату пули к стволу плюс поправка?


 
Darthman ©   (2003-12-15 13:43) [4]

Поставить на каждый кард по пикселу ОСОБОГО цвета, не используемого в игре, или записать в файл другой для каждого кадра и к этой точке привязывать рождение пули.


 
ZAROLF ©   (2003-12-15 14:26) [5]

> Thor ©   (15.12.03 13:34) [3]
> а какие проблемы привязать начальную координату пули к стволу
> плюс поправка?
-----------------------------------------------------------------

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


 
SoulSilver   (2003-12-15 14:47) [6]

У пули есть параметри Angle? Если есть, то я не вижу проблемы, а для красоты подгони немного точку вылета пули по Y под координату положения стровола по Y в горизонтальном положении, при вылете пули присваивай Angle пули - Angle оружия.


 
Niklto   (2003-12-15 14:49) [7]

A her ego znaet


 
ZAROLF ©   (2003-12-15 14:58) [8]

> SoulSilver   (15.12.03 14:47) [6]
> У пули есть параметри Angle? Если есть, то я не вижу проблемы,
> а для красоты подгони немного точку вылета пули по Y под
> координату положения стровола по Y в горизонтальном положении,
> при вылете пули присваивай Angle пули - Angle оружия.
-----------------------------------------------------------------

А пример бы написал, а то я уже это пробовал делать - неполучается.


 
SoulSilver   (2003-12-16 15:27) [9]

Вот пример, для начала создаем класс пули, хотя я думаю что ты это всё знаешь, но всё-равно:

//Класс пули Игрока
TBullet = class(TImageSpriteEx)//Для того, чтобы был параметр Angle
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
procedure DoDraw; override;
end;


Далее в процедуре DoMove оружия пишем, в тот момент, когда нажимаем клавишу(стреляем), создается пуля:

AngleCorrective:=random(3); //Это для того, чтобы у пуль был разлет(небольшой), опиши в var"е
Bullet := TBullet.Create(MainForm.DXSpriteEngine.Engine);
with TBullet(Bullet) do
begin
Image := MainForm.ImageList.Items.Find("bullet");
Width := 2;
Height := 2;
if PDirect = -1 then X := Player.X+(Player.Width/2-3); //Это я сделал для того, чтобы, если игрок стоит и смотрит влево(PDirect = -1, то пуля создается возле дула оружия(у меня это координата по X описана выше)
if PDirect = 1 then X := Player.X+(Player.Width/2+3);//Тоже самое, но если стоит и повернут вправо
Y := Player.Y+(Player.Height/2+2); //Здесь поправка по Y, для красоты
Z := 5;
//Далее, конечно можно было "case" использовать, ну да ладно, это собственно небольшой разлет пули, ну понял, поправка угла полета пули  
if P1GunAngleCorrective = 0 then Angle:=Weapon.Angle;
if P1GunAngleCorrective = 1 then Angle:=Weapon.Angle+1;
if P1GunAngleCorrective = 2 then Angle:=Weapon.Angle-1;
PixelCheck := false;
Collisioned := true;
end;


Далее процедуры пули:

procedure TBullet.DoDraw; //Тут идет отображение пули и поворот картинки соответственно углу её полета
begin
Image.Drawrotate(MainForm.DXDraw.Surface,round(WorldX),round(WorldY),image.width,image.height,round(animpos),0.5,0.5,Ang le);
end;

procedure TBullet.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if X < 0 then Dead;
if X > 800 then Dead;
if Y < 0 then Dead;
if Y > 600 then Dead;
X := X + sin256(Angle) * (bulletSpeed/1000)*MoveCount; //BulletSpeed - это компонента, влияющая на скорость пули, присвой ей чего-нибудь
Y := Y - cos256(Angle) * (bulletSpeed/1000)*MoveCount;
Collision;
end;

procedure TBullet.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is TMap then Dead; //При столкновении пули с картой - убиваем её
end;


Всё вроде, это код из моей игры, тоже 2D Аркады. Когда напишешь, выложи тут игру, посмотрим.


 
ZAROLF ©   (2003-12-16 18:13) [10]

>SoulSilver   (16.12.03 15:27) [9]
>Всё вроде, это код из моей игры, тоже 2D Аркады. Когда >напишешь, выложи тут игру, посмотрим.
-----------------------------------------------------------------
Тут одна загвоздка, персонаж может только идти и стрелять одновременно. По отдельности нехочет ни двигаться ни стрелять.

Да, скинуть демку я могу тебе на только на mail.


 
Thor ©   (2003-12-16 19:59) [11]


> ZAROLF ©   (16.12.03 18:13) [10]

на gamedev.ru был цикл статей про игру на delphiX и я делал стрелялку. вроде все нормально вылетало. (оружие поворачивалось)


 
SoulSilver   (2003-12-17 12:05) [12]

> ZAROLF ©
Я немного не понимаю, можешь прислать демку и посмотрим.


 
ZAROLF ©   (2003-12-17 13:32) [13]

SoulSilver   (17.12.03 12:05) [12]
> Я немного не понимаю, можешь прислать демку и посмотрим.
-----------------------------------------------------------------
Демку тебе выслал проверь ящик.


 
SoulSilver ©   (2003-12-17 13:41) [14]

2 ZAROLF ©
!   C:\Games\Archive\ChaosindaHouse\Demo.zip: Either multipart or corrupt ZIP archive
!   Cannot execute "C:\WINDOWS\TEMP\Rar$EX01.743\Demo.exe"

Сори, но не распаковывается архив, пришли, если можешь рар или экзешник.


 
ZAROLF ©   (2003-12-17 14:02) [15]

SoulSilver ©   (17.12.03 13:41) [14]
>Сори, но не распаковывается архив, пришли, если можешь рар или >экзешник.
-----------------------------------------------------------------
Отправляю в SFX. 337 килов.


 
SoulSilver ©   (2003-12-17 17:51) [16]

2 ZAROLF ©  
Посмотрел,  да увидел наконец, что не так у тебя. Скажи, а для чего у тебя

Procedure TShoot2.DoMove(MoveCount: Integer);
Begin
inherited DoMove(MoveCount);
if y<= 0 then Dead;
if y>= 480 then Dead;
x:=x+5;
if m mod 1 = 0 then //Вот от сюда
if AnimCount<5 then inc(AnimCount) else AnimCount:=0;
AnimPos:= AnimCount;
//До сюда
end;

Пули то у тебя не анимированные или я чего-то не догоняю...


 
ZAROLF ©   (2003-12-17 18:03) [17]

SoulSilver ©
>Пули то у тебя не анимированные или я чего-то не догоняю...
-----------------------------------------------------------------
Дык это выстрел ракеты - которую выпускает враг,это я просто пример выставлял.

Дык всётаки в чём проблема с оружием у плеера.


 
SoulSilver ©   (2003-12-17 18:20) [18]

Если честно, то я немного не врубаюсб почему так происходит, но могу дать пример своего кода, который работает нормально.
P.S. Приведи код, именно в том месте, где создается патрон у игрока


 
ZAROLF ©   (2003-12-17 18:36) [19]

SoulSilver ©   (17.12.03 18:20) [18]
> Если честно, то я немного не врубаюсб почему так происходит,
> но могу дать пример своего кода, который работает нормально.
> P.S. Приведи код, именно в том месте, где создается патрон
> у игрока
-----------------------------------------------------------------
А я твой код использовал в демке(всё как есть),а мой ничем особенным не блещет - стреляет в одном направлении или x- или x+.

P.S. Лучше приведи пример как бы ты сделал в данном случае (в моей игре),чтобы стрелять во все стороны "x"-+, и сидя желательно тоже.


 
SoulSilver ©   (2003-12-18 15:13) [20]

type

TPlayer = class(TImageSprite)
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
end;

TWeapon = class(TImageSpriteEx)
protected
procedure DoMove(MoveCount: Integer); override;
procedure DoDraw; override;
end;

TWeapon04_Rocket = class(TImageSpriteEx)
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
procedure DoDraw; override;
end;

var

Player: TSprite; //Игрок
Weapon: TWeapon; //Оружие
Weapon04_Rocket: array[0..999] of TWeapon04_Rocket; //Массив рокет
P1Direct: integer; //Направление героя (влево/вправо)
P1Reload: integer; //Значение текущей перезарядки
P1MaxReload: integer; //Значение перезарядки, чтобы патрон выстрелил
P1Clip: integer; //Обойма


Пошли процедуры

//Отображение оружия Игрока
procedure TWeapon.DoDraw;
Begin
Image.Drawrotate(MainForm.DXDraw.Surface,round(Player.WorldX)+16,round(Player.WorldY)+16,image.width,image.height,round( animpos),0.5,0.5,Angle);
end;

//Движение и стрельба оружия Игрока1
procedure TWeapon.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if isButton3 in MainForm.DXInput.States then
begin

if P1Direct = -1 then begin //Если игрок повернут влево, то
if P1Reload > P1MaxReload then begin //Если оружие перезарядилось, то
MainForm.DXWaveList.Items.Find("weapon04_rocketlauncher").Play(false); //Проигрываем звук выстрела
Weapon04_Rocket[n] := TWeapon04_Rocket.Create(MainForm.DXSpriteEngine.Engine); //Создаем рокету
with TWeapon04_Rocket(Weapon04_Rocket[n]) do
begin
Image := MainForm.ImageList.Items.Find("weapon04_rocket");
Width := 8;
Height := 8;
if P1Direct = -1 then X := Player.X+(Player.Width/2-5);
if P1Direct = 1 then X := Player.X+(Player.Width/2+5);
Y := Player.Y+(Player.Height/2+3);
Z := 5;
Angle := Weapon.Angle;
AnimSpeed := 100/3000;
Animlooped := true;
AnimStart := 0;
AnimCount := 17;
PixelCheck := false;
Collisioned := true;
end;
P1Reload := 0; //Присваеваем "переменной перезарядки" значению 0
dec(P1Clip); //Уменьшаем на один патрон в обойме
end;
end;
end;
end;

//Отображение рокеты Игрока1
procedure TWeapon04_Rocket.DoDraw;
Begin
Image.Drawrotate(MainForm.DXDraw.Surface,round(WorldX),round(WorldY),image.width,image.height,round(animpos),0.5,0.5,Ang le);
end;

//Движение рокеты Игрока1
procedure TWeapon04_Rocket.DoMove(MoveCount: Integer);
var
i: integer;
begin
inherited DoMove(MoveCount);
if X < 0 then Dead;
if X > 800 then Dead;
if Y < 0 then Dead;
if Y > 600 then Dead;

X := X + sin256(Angle) * (Weapon04_rocketStartSpeed/1000)*MoveCount;
Y := Y - cos256(Angle) * (Weapon04_rocketStartSpeed/1000)*MoveCount;
Collision;
end;

//Столкновение рокеты Игрока1
procedure TWeapon04_Rocket.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is TMap then Dead;
end;


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


 
ZAROLF ©   (2003-12-18 16:18) [21]

Я уже решил эту проблему своим способом:

TShoot1Left = class(TImageSprite)
  protected
   procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
   procedure DoMove(MoveCount: Integer); override;
  public
   constructor Create(AParent: TSprite); override;
   destructor Destroy; override;
 end;

 TShoot1Right = class(TImageSprite)
  protected
   procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
   procedure DoMove(MoveCount: Integer); override;
  public
   constructor Create(AParent: TSprite); override;
   destructor Destroy; override;
 end;

//здесь выстрел
if (isButton1 in MainForm.DXInput.States) and (CanShoot(0)) then
begin
with TShoot1Left.Create(Engine) do
begin
PixelCheck := True;
Image := MainForm.ImageList.Items.Find("Shoot1");
Y := Player.Y+(Player.Height/4+2);
Width := Image.Width;
Height := Image.Height;
if Direct = -1 then
X := Player.X+(Player.Width/2-30)
else
if Direct = 1 then
begin
with TShoot1Right.Create(Engine) do
begin
PixelCheck := True;
Image := MainForm.ImageList.Items.Find("Shoot1");
X := Player.X+(Player.Width/2+24);
Y := Player.Y+(Player.Height/4+2);
Width := Image.Width;
Height := Image.Height;
//collision;
end;
end;
end;
end;
end;

Вот что я не пойму в твоём коде это:

if P1Direct = -1 then X := Player.X+(Player.Width/2-5);
if P1Direct = 1 then X := Player.X+(Player.Width/2+5);

как они у тебя подразделяются без "else" ?
-----------------------------------------------------------------
2.
Далее, мне нужен алтернативный способ стрелять сидя, как можно
проще сделать. Я вот пробовал через "Can":

function TPlayer.CanShoot(t:shortint): boolean;
begin
result:=true;
case t of
0: if ((isButton1 in MainForm.DXInput.States)and(isDown in MainForm.DXInput.States))then
begin
with TShoot1Left.Create(Engine) do
begin
PixelCheck := True;
Image := MainForm.ImageList.Items.Find("Shoot1");
Y := Player.Y+(Player.Height/2.4+2);
Width := Image.Width;
Height := Image.Height;
if Direct = -1 then
X := Player.X+(Player.Width/2-30)
else
if Direct = 1 then
begin
with TShoot1Right.Create(Engine) do
begin
PixelCheck := True;
Image := MainForm.ImageList.Items.Find("Shoot1");
X := Player.X+(Player.Width/2+24);
Y := Player.Y+(Player.Height/2.4+2);
Width := Image.Width;
Height := Image.Height;
end;
end;
end;
end;
end;
end;

... и знаеш чё получается, пули летят в два слоя.
Может сообразим как сделать более правильно.


 
SoulSilver ©   (2003-12-19 12:19) [22]

2 ZAROLF ©:
if P1Direct = -1 then X := Player.X+(Player.Width/2-5);
if P1Direct = 1 then X := Player.X+(Player.Width/2+5);

Проще говоря когда игрок нажимает клавишу влево, то P1Direct= - 1, а когда нажимает клавишу вправо, то P1Direct = 1, а затем когда игрок нажимает клавишу стрельбы, то пуля по идее должа вылетать из дула, так вот +5 и -5 в коде - это просто координаты дула, для красоты короче, а else я вообще тут не использую и не понимаю зачем он нужен в данном случае.
На счет стрельбы из положения сидя я скажу, что есть элементарный способ: когда игрок нажимает клавишу вниз, то картинка персонажа меняется на "положение сидя", оружие смешается вниз по Y, но так как у тебя нет класса оружия и патроны создаются из самого героя, то просто необходимо создавать пули со смещением по Y. Я считаю, что ты намудрил с функцией и двумя классами, но если оно работает, то ничего плохого в этом нет. А летят в два слоя это как? (прости мое невежество) :-)


 
ZAROLF ©   (2003-12-19 13:17) [23]

SoulSilver ©   (19.12.03 12:19) [22]
А летят в два слоя это как? (прости мое невежество) :-)
-----------------------------------------------------------------
Да нужно когда садишся(смещать по Y вниз) как то заглушить координаты из положения стоя. А то пули летят поверху и по низу.


 
SoulSilver ©   (2003-12-19 13:41) [24]

2 ZAROLF ©  

if (клавиша стрелять) then begin
if (перезарядка > какого-то числа) then begin
Создаем пулю begin
X := Player.X+(Player.Width/2);
Y := Player.Y+(Player.Height/2);
end;
end;
end;

if (клавиша стрелять) and (клавиша сидеть) then begin
if (перезарядка > какого-то числа) then begin
Создаем пулю begin
X := Player.X+(Player.Width/2);
Y := Player.Y+(Player.Height/2+чего-то);
end;
end;
end;

P.S. У меня это работает...


 
ZAROLF ©   (2003-12-19 14:53) [25]

>SoulSilver ©   (19.12.03 13:41) [24]
>P.S. У меня это работает...
-----------------------------------------------------------------
Благодарю за совет - действительно работает, игруха скоро будет готова. Сейчас работаю над AI - довольно недурной, хочу заставить
самонаводящуюся ракету обходить препятствия.


 
SoulSilver ©   (2003-12-20 16:39) [26]

2 ZAROLF ©:Надо будет взглянут на твою игру, может это конкурент NFK. Удачи с рокетой, я парился над паучком, который бы пытался подойти к игроку и взорваться, но у меня нифига не вышло :-(


 
ZAROLF ©   (2003-12-20 17:37) [27]

SoulSilver ©   (20.12.03 16:39) [26]
>я парился над паучком, который бы пытался подойти к игроку и >взорваться, но у меня нифига не вышло :-(
-----------------------------------------------------------------
Подробнее можешь описать обстановку с пауком, возможно помогу.

-----------------------------------------------------------------
2.
Вот дошёл до реализации звука и музыки (в своей игре),и тогда я понял - ну геморой этот Delphix. При каком то звуке выстрела мой
CPU:Cel400,128mb,TNT16Mb,SB16/64AWE превращается в нечто тооооооооормоооооооозящее. Ой-ё да о музыке можно забыть.

Может посоветуешь мне другой обработчик звука.


 
SoulSilver ©   (2003-12-21 09:52) [28]

2 ZAROLF ©
Я использую стандартный MediaPlayer, в принципе он хорош, но если хочешь наворотов, то используй Bass. MediaPlayer не тормозит игру, может загружать и (*.mp3) и (*.mid), а на паучка я уже забил, вместо него 10 видов оружия, 11 супер способностей :-))


 
ZAROLF ©   (2003-12-21 10:50) [29]

А у тебя аркада имеет какое напавление, бродилка или чемпионат по
мордобою(типа Worms).


 
SoulSilver ©   (2003-12-21 13:44) [30]

Она что-то вроде Soldat, если играл, а так - Мочилово.


 
ZAROLF ©   (2003-12-21 14:21) [31]

SoulSilver ©   (21.12.03 09:52) [28]
Я использую стандартный MediaPlayer, в принципе он хорош, но если хочешь наворотов, то используй Bass. MediaPlayer не тормозит игру, может загружать и (*.mp3) и (*.mid), а на паучка я уже забил, вместо него 10 видов оружия, 11 супер способностей :-))
-----------------------------------------------------------------
Чтото у меня стандартный MediaPlayer проигрывает только (*.mid),
а (*.wav) упорно отказывается.

Да, а где взять Bass. MediaPlayer.


 
SoulSilver ©   (2003-12-21 16:13) [32]

В Delphi есть MediaPlayer, он всё проигрывает, у меня играет mp3 - это 100%. Bass введи в Yandex и найдешь, это очень известная библиотека.


 
ZAROLF ©   (2003-12-22 13:55) [33]

Предположим у меня в игре есть рубильник и источник энергии.
И вот касаясь плеером этого рубильника(if Sprite is TPlayer then) надо убрать(dead;) источник энергии(тоже спрайт).
Как проще это сделать через "docollision".


 
SoulSilver ©   (2003-12-22 14:08) [34]

В Collision Player"а:
if Sprite is TРубильник then
Источник энергии.Dead;


 
dRake ©   (2003-12-22 14:10) [35]

По поводу BASS, для дельфей существует отличный набор пасников
http://un4seen.com , возможности либы используют на все 100!
Тут тебе и 3Д звук, и поддержка основный форматов, и создание отдельных потоков, и многое, многое другое ;) лично у меня
вся звуковая система на BASS, и тебе тоже рекомендую


 
ZAROLF ©   (2003-12-22 15:56) [36]

>SoulSilver ©   (22.12.03 14:08) [34]
>В Collision Player"а:
>if Sprite is TРубильник then
>Источник энергии.Dead;
-----------------------------------------------------------------
Вообщем у меня так, но всё равно вылетает при компиляции.

Procedure TRubilnik1Left.DoMove(MoveCount: Integer);
begin
PixelCheck := True;
Image := MainForm.ImageList.Items.Find("rubilnik1_left");
Width := Image.Width;
Height := Image.Height;
Collision;
end;

destructor TRubilnik1Left.Destroy;
begin
 inherited Destroy;
end;

procedure TRubilnik1Left.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is TPlayer then
begin
if AnimCount<0 then inc(AnimCount) else AnimCount:=1;
AnimPos:= AnimCount;
TEnergy1(Sprite).dead; //хотя без этого всё идёт, рубильник опускается.
end;
end;

Что ни так?


 
SoulSilver ©   (2003-12-22 16:04) [37]

У тебя класс TEnergy, в var"e опиши Energy: TEnergy; и в procedure TRubilnik1Left.DoCollision(Sprite: TSprite; var Done: Boolean); пиши уже Energy.Dead;


 
ZAROLF ©   (2003-12-23 15:48) [38]

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

//Вот пимер обычных блоков
if Map[j,i]=5 then Image:=ImageList.Items.Find("Block1");
Collisioned := true;
x:=j*32+16;
y:= i*32+16;


 
SoulSilver ©   (2003-12-24 14:19) [39]

Снизить скорости пуль и задать размер всем картинкам, типа
Image := MainForm.ImageList.Items.Find("bullet");
Width := 4;
Height := 4;


У меня такой проблемы не было, но я думаю, что таким образом её решить можно


 
ZAROLF ©   (2003-12-24 15:08) [40]

SoulSilver ©   (24.12.03 14:19) [39]
>Снизить скорости пуль и задать размер всем картинкам, типа
>Image := MainForm.ImageList.Items.Find("bullet");
>Width := 4;
>Height := 4;
-----------------------------------------------------------------
И ещё один баг, плеер проходит сквозь стены в таких местах где нельзя упереться стволом(краем спрайта) в стены.
Вот взгляни в демке, когда спускаешся по ступенькам и заверни влево.

А здесь плотность плеера:

//влево Direct:= -1
if (Map[trunc((Player.X+30)/32)-1,trunc((Player.Y+30)/32)]<5)then
//вправо Direct:= 1
if (Map[trunc((Player.X)/32)+1,trunc((Player.Y+30)/32)]<5)then


 
SoulSilver ©   (2003-12-25 08:33) [41]

Да-да я тоже когда-то на это натыкался, смысл в том, что в идеале спрайт игрока должен по Ширине и Высоте совпадать со спрайтом блока, вот т.е. если Блок 32*32, то и Плеер должен быть 32*32.


 
ZAROLF ©   (2003-12-25 08:44) [42]

SoulSilver ©   (25.12.03 08:33) [41]
>Да-да я тоже когда-то на это натыкался, смысл в том, что в >идеале спрайт игрока должен по Ширине и Высоте совпадать со >спрайтом блока, вот т.е. если Блок 32*32, то и Плеер должен >быть 32*32.
-----------------------------------------------------------------
Я вот думаю плееру надо перед ногами сделать както невидимый пиксель, чтобы он уперался им а не стволом. Но тогда свобода движения резко гасится. Что думаешь на этот счёт.


 
SoulSilver ©   (2003-12-25 17:58) [43]

Это как?


 
ZAROLF ©   (2003-12-25 18:28) [44]

SoulSilver ©   (25.12.03 17:58) [43]
>Это как?
-----------------------------------------------------------------
Ладно забыли, всё равно не получается.

Лучше подскажи как проиграть "wav" файл в bass 2.0, мне для музона надо.

Вот здесь пример из Demo bass, немогу разабраться

procedure TForm1.Button10Click(Sender: TObject);
var
f: PChar;
begin
if not OpenDialog3.Execute then Exit;
f := PChar(OpenDialog3.FileName);
sams[samc] := BASS_SampleLoad(FALSE, f, 0, 0, 3, BASS_SAMPLE_OVER_POS);
if sams[samc] <> 0 then
begin
ListBox2.Items.Add(OpenDialog3.FileName);
Inc(samc);
end;
end;

procedure TForm1.Button9Click(Sender: TObject);
var
i: Integer;
begin
i := ListBox2.ItemIndex;
if i >= 0 then
if not BASS_SamplePlayEx(sams[i], 0, -1, 50, Random(200)-100, False) = 0 then
end;


 
SoulSilver ©   (2003-12-29 11:31) [45]

Sory, I don"t know. Совет банален: см. Документацию



Страницы: 1 2 вся ветка

Форум: "Игры";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.6 MB
Время: 0.037 c
1-1083068196
P_Aleks
2004-04-27 16:16
2004.05.16
Потоки и формы


14-1082640058
skx
2004-04-22 17:20
2004.05.16
Diamond Access Full Source 2.20


3-1082387534
Vit
2004-04-19 19:12
2004.05.16
Какая функция преобразует String в Date


4-1080568055
Boris_S
2004-03-29 17:47
2004.05.16
как вызвать процесс и дождаться окончания его выполнения?


3-1082361081
Курьин Денис
2004-04-19 11:51
2004.05.16
Cristall Report и растровая графика, как динамически подгружать?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский