purebasic.info

PureBasic forum
Текущее время: Пт апр 27, 2018 9:37 am

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




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Сб май 25, 2013 5:52 pm 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
ну это отремаешь у тебя руки мабуть по прямей :D
личку по читай.

_________________
CQ DX...


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

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6246
Благодарил (а): 17 раз.
Поблагодарили: 182 раз.
Пункты репутации: 48
Лично мне для 2D игры, использующей скроллинг нравится вот этот простой, компактный но эффективный движок.
Спрайты и фон в в этой демке генерируются " на лету", что бы не крепить ресурсы. Но работа движка видна и понятна. Обращаем внимание на мышку -она всегда там, где её оставили относительно экрана, а герой передвигается по всему полю. Есть ускорение при непрерывном движении.
Код:
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#Hintergrundbild =  1 
#Mauszeiger      =  2
#Spieler         =  3
 
Structure Spieler
  x.f
  y.f
  Groesse.l
  Geschwindigkeit.l
EndStructure
Define.Spieler Spieler
 
Breite = 800
Hoehe = 600
Tiefe = 32
Titel$ = "ScreenScroller"
SpielfeldBreite = 1920;1600
SpielfeldHoehe = 1080;1200
Spieler\x = Breite/2
Spieler\y = Hoehe/2
Spieler\Groesse = 40
Spieler\Geschwindigkeit = 2
 
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite3D() = 0
   MessageRequester("DirectX Не работает !", "Ошибка!", #PB_MessageRequester_Ok)
  End
EndIf
 
 
If OpenScreen(Breite, Hoehe, Tiefe, Titel$) = 0
  End
EndIf
 
CreateSprite(#Hintergrundbild, SpielfeldBreite, SpielfeldHoehe, 0)
CreateSprite(#Mauszeiger, 32, 32, 0)
CreateSprite(#Spieler, Spieler\Groesse, Spieler\Groesse, 0)
 
StartDrawing(SpriteOutput(#Hintergrundbild))                             ;Заполняем фон разными тайлами
Box(1, 1, SpielfeldBreite, SpielfeldHoehe, $00ff00)
For i= 1 To 300
  Circle(Random(SpielfeldBreite),Random(SpielfeldHoehe) , 20, RGB(Random(255),Random(255),Random(255)))
Next  
StopDrawing()
 
StartDrawing(SpriteOutput(#Mauszeiger)) ;Делаем указатель мыши
  DrawingMode(4)
  Circle(10, 10, 10, $ff0000)
  StopDrawing()
 
StartDrawing(SpriteOutput(#Spieler))                   ; Это наш Герой
Box(1, 1, Spieler\Groesse, Spieler\Groesse, $ffff00)
Circle(20, 20, 10, $0000ff)
StopDrawing()
 
Quit = 0
Repeat
  FlipBuffers()
  ExamineMouse()
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)
    Quit = 1
  EndIf
 
  ;- Управляем героем
  If Spieler\x < 0 : Spieler\x = 0 : EndIf
  If Spieler\y < 0 : Spieler\y = 0 : EndIf
  If Spieler\x + HintergrundX + Spieler\Groesse > Breite
    Spieler\x = Breite - HintergrundX - Spieler\Groesse
  EndIf
  If Spieler\y + HintergrundY + Spieler\Groesse > Hoehe
    Spieler\y = Hoehe - HintergrundY - Spieler\Groesse
  EndIf
  ;
  If KeyboardPushed(#PB_Key_Left) Or KeyboardPushed(#PB_Key_A)
    Spieler\x - Spieler\Geschwindigkeit
  EndIf
  If KeyboardPushed(#PB_Key_Right) Or KeyboardPushed(#PB_Key_D)
    Spieler\x + Spieler\Geschwindigkeit
  EndIf
  ;
  If KeyboardPushed(#PB_Key_Up) Or KeyboardPushed(#PB_Key_W)
    Spieler\y - Spieler\Geschwindigkeit
  EndIf
  If KeyboardPushed(#PB_Key_Down) Or KeyboardPushed(#PB_Key_S)
    Spieler\y + Spieler\Geschwindigkeit
  EndIf
 
  ;-Двигаем экран
  Einteilungsfaktor.b = 5
  If Spieler\x + HintergrundX > Breite / Einteilungsfaktor * 2;3
    HintergrundX - Spieler\Geschwindigkeit/2
  EndIf
  If Spieler\y + HintergrundY > Hoehe / Einteilungsfaktor * 2;3
    HintergrundY - Spieler\Geschwindigkeit/2
  EndIf
  If Spieler\x + HintergrundX < Breite / Einteilungsfaktor *1;2
    HintergrundX + Spieler\Geschwindigkeit/2
  EndIf
  If Spieler\y + HintergrundY < Hoehe / Einteilungsfaktor * 1;2
    HintergrundY + Spieler\Geschwindigkeit/2
  EndIf
  If Spieler\x + HintergrundX > Breite / Einteilungsfaktor * 3;4
    HintergrundX - Spieler\Geschwindigkeit/2
  EndIf
  If Spieler\y + HintergrundY > Hoehe / Einteilungsfaktor * 3;4
    HintergrundY - Spieler\Geschwindigkeit/2
  EndIf
  If Spieler\x + HintergrundX < Breite / Einteilungsfaktor
    HintergrundX + Spieler\Geschwindigkeit/2
  EndIf
  If Spieler\y + HintergrundY < Hoehe / Einteilungsfaktor
    HintergrundY + Spieler\Geschwindigkeit/2
  EndIf
  If HintergrundX > 0
    HintergrundX = 0
  EndIf
  If HintergrundY > 0
    HintergrundY = 0
  EndIf
  If HintergrundX < Breite - Spielfeldbreite
    HintergrundX = Breite - Spielfeldbreite
  EndIf
  If HintergrundY < Hoehe - SpielfeldHoehe
    HintergrundY = Hoehe - SpielfeldHoehe
  EndIf
  ;
  ClearScreen(RGB(0,0,0)) ;  чистим фон
 
  DisplaySprite(#Hintergrundbild, HintergrundX, HintergrundY) ;фоновый спрайт
  DisplayTransparentSprite(#Spieler, Spieler\x + HintergrundX, Spieler\y + HintergrundY) ; Герой
  DisplayTransparentSprite(#Mauszeiger, MouseX(), MouseY()) ; указатель мыши
 
Until Quit = 1
End
 


_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб май 25, 2013 8:30 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт янв 01, 2013 6:11 pm
Сообщений: 74
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy писал(а):
Лично мне для 2D игры, использующей скроллинг нравится вот этот простой, компактный но эффективный движок.

Расцветка конечно вырвиглазная :D Тоже хорошо выглядит но плохо что при передвижении не очень хорошо видно что впереди. Сегодня еще сделал курсор что бы персонаж мог крутиться, если ком вдруг понадобится прикрепляю. Пробел что бы персонаж повернулся на 90 градусов, это пока что что бы посмотреть как Объект игрока будет себя вести с краями игрового поля так как они может начать вылазить при повороте. Текстуру прикрутил к игроку еще что б не квадрат гонять :D

Больно что то тяжелый архив, форум не дает загрузить. На яндекс гружу
http://yadi.sk/d/QCu4B76f5A57Z


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб май 25, 2013 8:45 pm 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy конечно красиво и интересно. и твой код уже перекочевал
в код архив. И я обязательно что нибудь стырю оттуда :D.
Но в моем примере все таки глубина присутствует :roll: .

_________________
CQ DX...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс май 26, 2013 9:04 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт янв 01, 2013 6:11 pm
Сообщений: 74
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Кто знает как правильней организовать передвижение?

Вот кусок кода
Код:
1
2
3
4
5
6
7
 
        If KeyboardPushed(#PB_Key_D)
                If plaStRight = #True And camX < mapW * 512 - (sizeW / 2) - (plaW / 2)
                        camX + 1
                EndIf
        EndIf
 



Если нажата клавиша то прибавлять по одному пикселю расположение персонажа, остальное проверка что бы персонаж не вышел за пределы карты и переменная которая блокирует при необходимости движение. Дело в том что если написать camX + 20 например то персонаж будет ходить рывками по 20 пикселей и может залезть в текстуру, если написать вот так

Код:
1
2
3
4
5
6
7
8
9
 
        If KeyboardPushed(#PB_Key_A)
                        For i.i = 0 To plaSp - 1
                                If plaStLeft = #True And camX > - ((sizeW / 2) - (plaW / 2))
                                        camX - 1
                                EndIf
                        Next
        EndIf
 



Тоже не подходит так как персонаж залезает на объекты. Где то слышал что нужно считать кадры в секунду и делать что то типа: В секунде 60 кадров, за 60 кадров объект должен преодолеть 20 пикселей, а значит за 3 кадра объект передвигается на 1 пиксель. Кто нибудь ткните носом в формулу\пример как это делается :)

Исходник выложил http://yadi.sk/d/QCu4B76f5A57Z


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн май 27, 2013 3:55 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт янв 01, 2013 6:11 pm
Сообщений: 74
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Нашли мою ошибку, ошибка заключалась в том что при загрузке спрайтов я указал флаг #PB_Sprite_AlphaBlending, флаг создает канал прозрачности для каждого пикселя и поддерживает только png и tiff. Я же загружал bmp и jpeg изображения с этим флагом. У меня и одного товарища этот вариант работал без проблем, но у двух форумчан данная функция вызывала ошибку, вопрос почему у кого то заработало, а у кого то нет и работает ли у Вас?

http://yadi.sk/d/QCu4B76f5A57Z


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

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2270
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
У меня есть прозрачность.

PS:
Что-то мне подсказывает, что передвижение персонажа (и вообще, физика) не должно зависеть от FPS, а должно основываться на таймере (ElapsedMilliseconds() или типа того).
Более того, пиксели как расстояние — тоже не верно.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн май 27, 2013 5:15 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт янв 01, 2013 6:11 pm
Сообщений: 74
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
Что-то мне подсказывает, что передвижение персонажа (и вообще, физика) не должно зависеть от FPS, а должно основываться на таймере (ElapsedMilliseconds() или типа того).

Вот почитал http://habrahabr.ru/post/136878/ , привязывать надо к кадрам, но не обязательно, есть и другие реализации.

qpAHToMAS писал(а):
Более того, пиксели как расстояние — тоже не верно.

А как же тогда передвигать персонажа?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн май 27, 2013 5:31 pm 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
хм, странно у меня игрушка виснет. строка 8 в файле camera.pb
--ошибка чтения по адресу 0--

_________________
CQ DX...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн май 27, 2013 5:37 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
pentod65, я же говорил, из-за чего - только PNG и TIFF поддерживаются, а вы юзаете BMP.

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн май 27, 2013 5:39 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт янв 01, 2013 6:11 pm
Сообщений: 74
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Никита Однороб писал(а):
pentod65, я же говорил, из-за чего - только PNG и TIFF поддерживаются, а вы юзаете BMP.

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


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

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


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

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


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

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