purebasic.info
http://purebasic.info/phpBB3ex/

Камера следящяя за игроком, принцип
http://purebasic.info/phpBB3ex/viewtopic.php?f=12&t=3169
Страница 2 из 2

Автор:  pentod65 [ Сб май 25, 2013 5:52 pm ]
Заголовок сообщения: 

ну это отремаешь у тебя руки мабуть по прямей :D
личку по читай.

Автор:  kvitaliy [ Сб май 25, 2013 6:49 pm ]
Заголовок сообщения: 

Лично мне для 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
 


Автор:  easy [ Сб май 25, 2013 8:30 pm ]
Заголовок сообщения: 

kvitaliy писал(а):
Лично мне для 2D игры, использующей скроллинг нравится вот этот простой, компактный но эффективный движок.

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

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

Автор:  pentod65 [ Сб май 25, 2013 8:45 pm ]
Заголовок сообщения: 

kvitaliy конечно красиво и интересно. и твой код уже перекочевал
в код архив. И я обязательно что нибудь стырю оттуда :D.
Но в моем примере все таки глубина присутствует :roll: .

Автор:  easy [ Вс май 26, 2013 9:04 pm ]
Заголовок сообщения: 

Кто знает как правильней организовать передвижение?

Вот кусок кода
Код:
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

Автор:  easy [ Пн май 27, 2013 3:55 pm ]
Заголовок сообщения: 

Нашли мою ошибку, ошибка заключалась в том что при загрузке спрайтов я указал флаг #PB_Sprite_AlphaBlending, флаг создает канал прозрачности для каждого пикселя и поддерживает только png и tiff. Я же загружал bmp и jpeg изображения с этим флагом. У меня и одного товарища этот вариант работал без проблем, но у двух форумчан данная функция вызывала ошибку, вопрос почему у кого то заработало, а у кого то нет и работает ли у Вас?

http://yadi.sk/d/QCu4B76f5A57Z

Автор:  qpAHToMAS [ Пн май 27, 2013 4:13 pm ]
Заголовок сообщения: 

У меня есть прозрачность.

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

Автор:  easy [ Пн май 27, 2013 5:15 pm ]
Заголовок сообщения: 

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

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

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

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

Автор:  pentod65 [ Пн май 27, 2013 5:31 pm ]
Заголовок сообщения: 

хм, странно у меня игрушка виснет. строка 8 в файле camera.pb
--ошибка чтения по адресу 0--

Автор:  Никита Однороб [ Пн май 27, 2013 5:37 pm ]
Заголовок сообщения: 

pentod65, я же говорил, из-за чего - только PNG и TIFF поддерживаются, а вы юзаете BMP.

Автор:  easy [ Пн май 27, 2013 5:39 pm ]
Заголовок сообщения: 

Никита Однороб писал(а):
pentod65, я же говорил, из-за чего - только PNG и TIFF поддерживаются, а вы юзаете BMP.

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

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/