![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Доброго времени суток все кто читает мой текст. Я зарегистрировался совсем недавно, хотя давно уже пользуюсь ресурсами вашего форума для самообучения, однако, как оказалось, учусь я слишком медленно. Дело в том, что мне надо в течение двух недель закончить курсовую по программированию и это без учета, что другие предметы сдавать надо. Но ладно, это моя проблема и не буду грузить ею )
Итак, суть. Я создаю игру. 2D слэшер. Как я понимаю это достаточно простая игрушка, ибо все что я хочу, это небольшая локация 800 пикс шириной и 300 высотой. Есть анимированный герой, который сражается с толпами мобов прибывающих с двух сторон экрана. Детали игры таковы: - у Героя есть шкала жизни и ярости. Жизнь имеет пассивную регенерацию. Ярость заполняется при нанесении урона мобам и в три раза быстрее заполняется при получении урона от мобов. - Герой может бегать, прыгать, а кнопкой down еще и защищаться мечом. - Герой получает опыт за убийство мобов и за определенное количество опыта он получает уровни. За уровни получает бонусы, что дают ему преимущество (например, если кто-то играл - Crimsonlands. Там тоже есть за уровни бонусы, которые дают увеличенные жизни, регенерацию и т.д.) - у Героя по мимо обычной атаки есть одна единственная спец. атака, которой можно воспользоваться при полном заполнении шкалы злости. - с повышением уровня героя, я хочу попытаться сделать увеличение силы приходящих монстров, а так же их количество. В принципе, это всё. Единственное, я еще хотел повставлять звук, - фоновая музыка, реплика героя, когда у него мало жизни, реплика героя когда он делает спец.атаку реплика когда умирает, реплика когда получает уровень. Так же сделать главное меню и таблицу рекодров, - сколько продержался и убил, а так же заработанный лвл игроков. Вот... У меня есть основа, но я все еще разбираюсь с движением героя и происходит это... Весьма туго. Я бы не обращался и сделал бы всё сам, но у меня поджимают сроки и потому, я прошу вашего времени и помощи в моем проекте. Единственное что я из всего этого сделал, это фон и способность героя бегать по форме, что, конечно, вас может не впечатлить. Исходный код или проще, - сам исходник я могу скинуть если согласитесь мне помочь, - не хочу тему загружать. Заранее благодарю за любую подсказку. |
|
#2
|
||||
|
||||
|
|
|
#3
|
||||
|
||||
|
Цитата:
Благодарю. |
|
#4
|
||||
|
||||
|
Цитата:
- Как вывести изображение на форму? - Как сделать перемещение изображения на форме в зависимости от нажатых клавиш? - Как сделать анимацию (изменяющуюся картинку)? ... Все конкретные вопросы предварительно задаются гуглу, и только если ответа там нет - пишутся здесь. Вопросы, ответ на которые вряд ли удастся получить (не конкретные): - Как сделать, чтобы герой мог бить монстров? - Как сделать, чтобы герой прокачивался? ... Пока что я не вижу ни одного вопроса в теме. Как следствие, и ответить ничего не могу. Задавай вопросы, будем обсуждать. Последний раз редактировалось Bargest, 13.05.2013 в 18:24. |
|
#5
|
||||
|
||||
|
Да, Баргест, прошу прощения, Вы правы.
Я буду задавать вопросы по мере продвижения, так, я думаю, будет удобней. На данном этапе у меня проблема с прыжками. Я гуглил ответ на вопрос, как разработать гравитацию (обычное равноускоренное движение) и сделать её глобальной процедурой, дабы, если герой находится в воздухе, он всегда возвращался на исходную координату Y. Я сделал подобие гравитации, однако у меня оно нагло зависло. А при попытке сделать самостоятельное, плавное падение с ускорением, - действие происходит моментально. Так же я все еще не могу разобраться как сделать "карточку" персонажа и монстра. То есть количество жизни, сила атаки. Позвольте я покажу исходник, может Вы сможете что-то подсказать? тык - у форума почему-то загрузчик ошибает. Примечание:Ссылку обновил. Последний раз редактировалось Царь, 13.05.2013 в 19:23. |
|
#6
|
||||
|
||||
|
Цитата:
Разумеется, нужно сделать проверку столкновений, но в данном случае все объекты можно считать круглыми, тогда столкновения считаются просто. Столкновение с землей - расстояние от центра окружности до прямой меньше радиуса, с другими предметами - расстояние между двумя центрами окружностей меньше суммы их радиусов. Цитата:
Такие вопросы надо по-хорошему решать на этапе проектирования. И ответ на них можно найти, если правильно сам вопрос поставить. А для этого нужно описать, что должно происходить, в виде структур данных и методов их обработки. Делать такие вещи после начала написания кода - получить кучу проблем при дальнейшей доработке. Но уже, собственно, поздно. Последний раз редактировалось Bargest, 13.05.2013 в 19:29. |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Царь (14.05.2013)
| ||
|
#7
|
||||
|
||||
|
Понял. Сейчас попробую инициализировать
Последний раз редактировалось Царь, 13.05.2013 в 19:29. |
|
#8
|
|||
|
|||
|
Добрый день.
Честно говоря впечатлен вашей статьей, не могли бы вы мне помочь Сразу говорю, я относительно недавно начал изучать язык, поэтому попрошу сильно не ругаться, за некоторые возможно глупые вопросы). Сейчас сам пытаюсь реализовать небольшую игру. И у меня возникла проблемка в самом начале, не могли бы подсказать как вы реализовали создание объектов Player (игрок) и Enemy(враги). Вот, например, (начну с самого начала): у меня есть модуль main и модуль objects: Код:
TBase=class
private
x: Integer;
y: Integer;
public
constructor Create(x0, y0: Integer);
procedure setX (x0: Integer); //назначают координаты
procedure setY (y0: Integer);
function getX: Integer; //возвращают координаты
function getY: Integer;
end;
{ TStatic }
TStatic=class(TBase)
private
bitmap: TBitmap;
public
constructor Create(x0, y0: Integer; bitmap0: TBitmap);
procedure setBitmap (bitmap0: TBitmap); // меняет изображ. внутри объекта
function getBitmap: TBitmap; // возвращает изображение
end;
{ TAnimate }
TAnimate=class(TBase)
private
bitmap: array[0..100] of TBitmap;
curFrame: Integer; //текущий кадр
maxFrame: Integer; //максим.кадр
public
constructor Create(x0, y0: Integer; bitmap0: array of TBitmap;
maxFrame0: Integer);
procedure nextFrame; //меняет кадры
procedure setBitmap(bitmap0: array of TBitmap);
function getBitmap:TBitmap;
end;
{ TEnemy }
TEnemy=class(TAnimate)
public
procedure move;
end;
{ TPlayer }
TPlayer=class(TAnimate)
private
health: Integer;
public
constructor Create(x0, y0: Integer; bitmap0: array of TBitmap;
maxFrame0: Integer);
procedure moveLeft;
procedure moveRight;
function getHealth: Integer;
end;
implementation
{ TEnemy }
procedure TEnemy.move;
begin
y:= y+3;
end;
{ TPlayer }
constructor TPlayer.Create(x0, y0: Integer; bitmap0: array of TBitmap;
maxFrame0: Integer);
begin
inherited;
health:= 100;
end;
procedure TPlayer.moveLeft;
begin
x:= x-5;
end;
procedure TPlayer.moveRight;
begin
x:= x+5;
end;
{ TAnimate }
constructor TAnimate.Create(x0, y0: Integer; bitmap0: array of TBitmap;
maxFrame0: Integer);
begin
x:=x0;
y:=y0;
bitmap:=bitmap0;
curFrame:= 0;
maxFRame:= maxFrame0;
end;
procedure TAnimate.nextFrame;
begin
if curFrame < maxFrame then
curFrame:=curFrame+1
else
curFrame:=0;
end;
procedure TAnimate.setBitmap(bitmap0: array of TBitmap);
begin
bitmap:=bitmap0;
end;
function TAnimate.getBitmap: TBitmap;
begin
result:=bitmap[curFrame];
end;
{ TStatic }
constructor TStatic.Create(x0, y0: Integer; bitmap0: TBitmap);
begin
x:=x0;
y:=y0;
bitmap:=bitmap0;
end;
procedure TStatic.setBitmap(bitmap0: TBitmap);
begin
bitmap:=bitmap0;
end;
function TStatic.getBitmap: TBitmap;
begin
result:=bitmap;
end;
{ TBase }
constructor TBase.Create(x0, y0: Integer);
begin
x:=x0;
y:=y0;
end;
procedure TBase.setX(x0: Integer);
begin
x:=x0;
end;
procedure TBase.setY(y0: Integer);
begin
y:=y0;
end;
function TBase.getX: Integer;
begin
result:=x;
end;
function TBase.getY: Integer;
begin
result:=y;
end;
end.В модуле main у меня след.образом объявлены переменные: Код:
Form1: TForm1;
//graphics
plPic: array [0..2] of TBitmap;
grPic: array [0..2] of TBitmap;
enPic: array [0..2] of TBitmap;
seaPic: TBitmap;
bulPic: TBitmap;
//objects
Player: TPlayer;
Sea: array [0..1] of Tsea ;
Ground: array [0..2] of TGround;
Bullet: array [0..100] of TBullet;
Enemy: array [0..100] of TEnemy;
//booleans
MoveL, MoveR: boolean;
Shoot: boolean;
//Integers
delay:Integer;
score: Integer;
И подгружается графика:
//load graphics
//player
for i:=0 to 2 do
begin
plPic[i]:= TBitmap.Create;
plPic[i].LoadFromFile('img/player'+IntToStr(i)+'.bmp');
plPic[i].Transparent:= True;
end;
//enemies (графика для enemy)
for i:=0 to 2 do
begin
enPic[i]:= TBitmap.Create;
enPic[i].LoadFromFile('img/enemy'+IntToStr(i)+'.bmp');
enPic[i].Transparent:= True;
end;Далее идет реализация процедур. Проблема в том, что в модуле objects выдает ошибку incompetible types (bitmap и bitmap0).........прошу вас посмотреть, что можно исправить. А также подскажите, пож-та, как вы реализовали создание объектов. Последний раз редактировалось M.A.D.M.A.N., 24.03.2014 в 15:07. |
|
#9
|
||||
|
||||
|
Цитата:
Код:
{ TAnimate }
TAnimate=class(TBase)
private
bitmap: array of TBitmap;Код:
procedure TAnimate.setBitmap(bitmap0: array of TBitmap); var i: Integer; begin SetLength(bitmap, Length(bitmap0)); for i := 0 to High(bitmap) do bitmap[i] := bitmap0[i]; end; |