purebasic.info

PureBasic forum
Текущее время: Пт июл 20, 2018 7:50 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Плавный прыжок 2D
СообщениеДобавлено: Вт янв 22, 2013 12:40 am 
Не в сети
доцент

Зарегистрирован: Вт янв 22, 2013 12:31 am
Сообщений: 46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Решил научиться писать игры. Выбрал purebasic как основной ЯП. Решил начать с банального прыка шарика. Отталкиваося от этой статьи. Код вроде бы перевел правильно, вот только прыжок получается неестественным, каким то резким. Как можно добавить плавности, не маняя Delay()

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
InitSprite()
InitKeyboard()
 
OpenWindow(0, 0, 0, 400, 400, "Sprite",  #PB_Window_SystemMenu| #PB_Window_SizeGadget)
OpenWindowedScreen(WindowID(0), 0, 0, 400,600,0,0,0)
SetFrameRate(60)
 
If CreateSprite(0,50,50) And StartDrawing(SpriteOutput(0))
  Circle(25,25,20)
  StopDrawing()
EndIf
 
 
pos = 350  ;position
vel = 0    ;speed
accel = 5 ; acceration
jumping = #False
 
Repeat
  Event = WindowEvent()
  If Event = #PB_Event_CloseWindow
    End
  EndIf
 
  FlipBuffers()
  ClearScreen(RGB(0, 0, 0))
  DisplaySprite(0,x1,pos)
  ExamineKeyboard()
 
 
 
  If KeyboardPushed(#PB_Key_Up)
    If Not jumping
      vel = 50
      jumping = #True
    EndIf
  EndIf
 
  If jumping
    vel = vel - accel
    pos = pos - vel
    Debug vel
  If pos >= 350
    vel = -5;
    jumping = #False
  EndIf
  EndIf
 
 
 
 
 
  If  KeyboardPushed(#PB_Key_Left)
    x1-4
  EndIf
 
  If KeyboardPushed(#PB_Key_Right)
    x1+4
  EndIf
  If pos >= 350: pos=350:EndIf
  If x1 <= 0: x1=0:EndIf
  If x1 >= 350: x1=350:EndIf
  Delay(10)
ForEver



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 22, 2013 7:11 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6324
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
Можно ввести задержку только для прыжка при помощи таймера.
Один из вариантов
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
 
InitSprite()
InitKeyboard()
 
OpenWindow(0, 0, 0, 400, 400, "Sprite",  #PB_Window_SystemMenu| #PB_Window_SizeGadget)
OpenWindowedScreen(WindowID(0), 0, 0, 400,600,0,0,0)
SetFrameRate(60)
 
If CreateSprite(0,50,50) And StartDrawing(SpriteOutput(0))
  Circle(25,25,20)
  StopDrawing()
EndIf
 
 
pos = 350  ;position
vel = 0    ;speed
accel = 5 ; acceration
jumping = #False
Dojumping.b=#False
Repeat
  Event = WindowEvent()
  If Event = #PB_Event_CloseWindow
    End
  EndIf
 
  FlipBuffers()
  ClearScreen(RGB(0, 0, 0))
  DisplaySprite(0,x1,pos)
  ExamineKeyboard()
 ;Таймер для прыжка
    ElapsedTime = ElapsedMilliseconds()-StartTime
    If ElapsedTime > 40 ; Тут регулируем задержку. 150 как на Луне :)
      Dojumping = #True  
      StartTime = ElapsedMilliseconds()
    Else
      Dojumping = #False
    EndIf    
 
 If Dojumping
  If KeyboardPushed(#PB_Key_Up)
    If Not jumping
      vel = 50
      jumping = #True
    EndIf
  EndIf
 
  If jumping
    vel = vel - accel
    pos = pos - vel
    Debug vel
  If pos >= 350
    vel = -5;
    jumping = #False
  EndIf
  EndIf
EndIf
 
 
 
 
 
 
  If  KeyboardPushed(#PB_Key_Left)
    x1-4
  EndIf
 
  If KeyboardPushed(#PB_Key_Right)
    x1+4
  EndIf
  If pos >= 350: pos=350:EndIf
  If x1 <= 0: x1=0:EndIf
  If x1 >= 350: x1=350:EndIf
 
  Delay(10)
ForEver
 


_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 22, 2013 8:44 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Все чудите, господа.
Сделай pos.f : vel.f : accel.f (float) и настраивай скорость как тебе нравиться. А всякие Delay выкинь на фик.

_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 22, 2013 9:24 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6324
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
AndyLy писал(а):
Сделай pos.f : vel.f : accel.f (float) и настраивай скорость как тебе нравиться.

Именно в этом коде не поможет. Тут другой принцип организации прыжка.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 22, 2013 11:53 am 
Не в сети
доцент

Зарегистрирован: Вт янв 22, 2013 12:31 am
Сообщений: 46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо kvitaliy. А какие еще есть принципы организации прыжка.
Читал в интернете что можно прыгать только вверх, а вниз пусть гравитация притягивает. Как с таком случае реализовать гравитацию? Добавить еще одну переменную за массу и находить G=m*accel ?

Просмотрел тему Немного о движении в 2D. Но там как то все запутанно. Даже DisplaySprite() не используется


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 22, 2013 12:16 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6324
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
Onny писал(а):
Просмотрел тему Немного о движении в 2D. Но там как то все запутанно.

Разбирайся. Ни кто и не говорил, что игры делать просто :D
Есть ещё простой пример движения спрайта с прыжками в стиле Марио.


Вложения:
Mario.zip [15.09 KiB]
Скачиваний: 188

_________________
read-only
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 22, 2013 1:29 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Цитата:
Именно в этом коде не поможет.

Значит это неправильный код. :)
Задержку с помощью Delay делать- не правильно.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
InitSprite(): InitKeyboard()
OpenWindow(0, 0, 0, 400, 400, "Sprite",  #PB_Window_SystemMenu): OpenWindowedScreen(WindowID(0), 0, 0, 400,600,0,0,0)
If CreateSprite(0,50,50) And StartDrawing(SpriteOutput(0)): Circle(25,25,20): StopDrawing(): EndIf
pos.f = 350: vel.f = 0: accel.f=1.2: jumping = 0: x.f=200: g.f=9.8
Repeat
  Event = WindowEvent(): If Event = #PB_Event_CloseWindow: quite=1: EndIf
  FlipBuffers(): ClearScreen(RGB(0, 0, 0)): DisplaySprite(0,x,pos)
  ExamineKeyboard(): If KeyboardPushed(#PB_Key_Escape): quite=1: EndIf
  If KeyboardPushed(#PB_Key_Space): If Not jumping: vel = 35: jumping = 1: EndIf: EndIf
  If jumping: cnt+1: If cnt>1: cnt=0
     If vel>accel: vel = vel - accel: Else: vel=0: EndIf
     pos = pos-vel+g: If pos >= 350: pos=350: vel = 0: jumping = 0: EndIf: EndIf: EndIf
Until quite=1


_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 22, 2013 1:40 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6324
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
AndyLy писал(а):
Задержку с помощью Delay делать- не правильно.

А у кого в коде ты увидел Delay, которая делает задержку? Или ты сам с собой поспорить решил?

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 22, 2013 11:29 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2281
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
А зачем Delay() использовать? Особенно если ты используешь SetFrameRate().

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 23, 2013 1:02 am 
Не в сети
доцент

Зарегистрирован: Вт янв 22, 2013 12:31 am
Сообщений: 46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy писал(а):
Onny писал(а):
Просмотрел тему Немного о движении в 2D. Но там как то все запутанно.

Разбирайся. Ни кто и не говорил, что игры делать просто :D
Есть ещё простой пример движения спрайта с прыжками в стиле Марио.


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

AndyLy огромное спасибо за код. Это то, что мне надо.

qpAHToMAS а разве Delay() не дает процессору время для выполнение других прорамм. Мы же все же на мультизадачной ОС.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 23, 2013 6:00 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6324
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
Onny писал(а):
Чем этот способ лучше хранения каждого спрайта по отдельности.

Компактность. Одна большая картинка всегда меньше десятков маленьких места на диске занимает. Загрузка с диска 1 раз - дисковые операции самые медленные.
Обрезание происходит в памяти компа - операция с памятью это очень быстро, затраты минимальные.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 23, 2013 10:33 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2281
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Onny писал(а):
qpAHToMAS а разве Delay() не дает процессору время для выполнение других прорамм. Мы же все же на мультизадачной ОС.

У вас SetFrameRate(60) применен, в цикле без Delay'ев вызов FlipBuffers() будет сам ограничивать цикл, что бы выполнялось не более 60-и проходов в секунду.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 23, 2013 11:17 pm 
Не в сети
доцент

Зарегистрирован: Вт янв 22, 2013 12:31 am
Сообщений: 46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо, не знал.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 24, 2013 2:14 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Почему у меня на этой строке
Код:
1
If CreateSprite(0,50,50) And StartDrawing(SpriteOutput(0))


получается ошибка?

Цитата:
[ERROR] Invalid memory access. (Read error at address 0)

Ни хрена с графикой не дружу :(

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 26, 2013 12:17 pm 
Не в сети
доцент

Зарегистрирован: Вт янв 22, 2013 12:31 am
Сообщений: 46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Не знаю, может нужно пурик обновить?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB