|
2D-программирование Вопросы, касающиеся двумерного программирования |
11.02.2012, 18:33
|
#46
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
Ответ: Flight
вот код игры и вложения
|
(Offline)
|
|
11.02.2012, 19:22
|
#47
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Flight
Вот так:
Graphics 1600,900,1
SetBuffer BackBuffer()
Type player
Field x,px,deltax
Field y,py,deltay
End Type
Type car
Field x,px,deltax
Field y,py,deltay
End Type
Type TBullet
Field bx#, by#, angle#
End Type
Function TBullet_Update()
For b.TBullet = Each TBullet
bx = bx - Cos(angle)*2
by = by -Sin(angle)*2
If bx<0 Or bx>GraphicsWidth() Or by<0 Or by>GraphicsHeight() Then
Delete b
End If
Next
End Function
Function TBullet_Draw()
For b.TBullet = Each TBullet
Oval(bx - 3, by - 3, 6, 6)
Next
End Function
Global bx=140
Global by=100
Global chn=Rnd(4)
Global w=LoadImage("w.bmp")
Global Tbullet=LoadImage("shot.bpm")
Global dmgC#
Global y=100
Global x=100
Global speed#=3
Global zdorov#=100
Global speedc#=5
Global hp100=LoadImage("hp100.bmp")
Global hp80=LoadImage("hp80.bmp")
Global hp60=LoadImage("hp60.bmp")
Global hp40=LoadImage("hp40.bmp")
Global hp20=LoadImage("hp20.bmp")
Global cursor=LoadImage("cursor.bmp")
Global polosa=LoadImage("polosa.bmp")
Global Endd=LoadImage("end.bmp")
Global angle
Global player=LoadImage("1.bmp")
TFormFilter enable=0
RotateImage player,90
MidHandle player
Global ground=LoadImage ("ground1.bmp")
Global house1=LoadImage ("house1.bmp")
Global house2=LoadImage ("house2.bmp")
Global car=LoadImage("car1.bmp")
Global cy=Rand(1366)
Dim playerg(361)
For t=0 To 361
playerg(t)=CopyImage(player)
MaskImage playerg(t),0,0,0
RotateImage playerg(t),t
Next
MaskImage hp100,255,255,255
MaskImage hp80,255,255,255
MaskImage hp60,255,255,255
MaskImage hp40,255,255,255
MaskImage hp20,255,255,255
MaskImage player,0,0,10
TileImage ground,0,0,0
Function updateplayer()
player_angle=ATan2(MouseY()-y,MouseX()-x)+180
If MouseDown(1) Then
b.Tbullet=New Tbullet
bx=x
by=y
angle=player_angle
EndIf
DrawImage ground,0,0
DrawImage w,700,100
DrawImage house1,300,340
DrawImage house2,750,340
DrawImage house2,-200,340
DrawImage house1,750,340
DrawImage house2,1250,340
DrawImage house2,750,-90
DrawImage house2,950,-90
DrawImage house2,15,-90
DrawImage house2,0,-90
DrawImage car,555,cy
MaskImage cursor,255,255,255
px=x+speed*deltax
py=y+speed*deltay
DrawImage playerg(Int(player_angle)),x,y
Text 0,10,player_angle
If x<0 Then x = 1366
If x>1366 Then x = 0
If y<0 Then y = 768
If y>768 Then y = 0
cursorX=MouseX()
cursorY=MouseY()
DrawImage cursor,MouseX(),MouseY()
If KeyDown(200) Or KeyDown(17) Then
deltay=-1
EndIf
If KeyDown(208) Or KeyDown(31)
deltay=1
EndIf
If KeyDown(203) Or KeyDown(30)
deltax=-1
EndIf
If KeyDown(205) Or KeyDown(32)
deltax=1
EndIf
px=x+speed#*deltax
py=y+speed#*deltay
;DrawImage house1,300,340
;DrawImage house2,750,340
;DrawImage house2,-200,340
;DrawImage house1,750,340
;DrawImage house2,1250,340
;DrawImage house2,750,-90
;DrawImage house2,950,-90
;DrawImage house2,15,-90
;DrawImage house2,0,-90
If Not ImagesCollide (house1,300,340,0,player,px,py,0)
x=px
y=py
EndIf
If ImagesCollide(player,x,y,0,car,555,cy,0) Then zdorov#=zdorov#-2
If zdorov#>80 And zdorov#=<100 Then DrawImage hp100,5,5
If zdorov#>60 And zdorov#=<80 Then DrawImage hp80,5,5
If zdorov#>40 And zdorov#=<60 Then DrawImage hp60,5,5
If zdorov#>20 And zdorov#=<40 Then DrawImage hp40,5,5
If zdorov#>0 And zdorov#=<20 Then DrawImage hp20,5,5
If zdorov#<0 Then DrawImage endd,0,0
End Function
While Not KeyDown(1)
updateplayer()
TBullet_Update()
TBullet_Draw()
Flip
Cls
DrawImage polosa,538,83
If 1=1 Then cy=cy+speedc#
If cy<0 Then cy = 768
If cy>768 Then cy = 0
If ImagesCollide(polosa,538,86,0,car,555,cy,0) Then speedc#=1
If Not ImagesCollide(polosa,538,86,0,car,555,cy,0) Then speedc#=5
Wend
|
(Offline)
|
|
11.02.2012, 19:39
|
#48
|
Бывалый
Регистрация: 26.04.2009
Адрес: Россия, Уфа
Сообщений: 680
Написано 182 полезных сообщений (для 406 пользователей)
|
Ответ: Flight
Сообщение от undertaker
вот код игры и вложения
|
Если у персонажа все еще отображается белая полоса сбоку,то это из-за того что маска неоднородна.
В архиве нет exe)
|
(Offline)
|
|
11.02.2012, 19:49
|
#49
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Flight
Вот exe. Думаю, undertaker не против .
|
(Offline)
|
|
11.02.2012, 19:58
|
#50
|
ПроЭктировщик
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений (для 63 пользователей)
|
Ответ: Flight
вот вроде все норм пашет
добавил таймер стрельбы
добавил таймер для ограничения фпс
пометил ошибки
Graphics 1024,768,32,2
SetBuffer BackBuffer()
FPS=CreateTimer(60); создаем таймер для ограничения фпс это нужно что бы количество кадров\сек был стабильно
Type player
Field x,px,deltax
Field y,py,deltay
End Type
Type car
Field x,px,deltax
Field y,py,deltay
End Type
Type TBullet
Field bx#, by#, angle#
End Type
Function TBullet_Update()
For b.TBullet = Each TBullet
;bx = bx + Cos( b\angle ) * 2 твоя версия ошибку видишь
b\bx = b\bx- Cos( b\angle ) * 4 ;тут меняем + на - чтобы пуля летела в нужное направлние
b\by = b\by -Sin( b\angle ) * 4 ;тут меняем + на - чтобы пуля летела в нужное направлние
If b\bx<0 Or b\bx>GraphicsWidth() Or b\by<0 Or b\by>GraphicsHeight() Then
Delete b
End If
Next
End Function
Function TBullet_Draw()
For b.TBullet = Each TBullet
Oval(b\bx - 3, b\by - 3, 6, 6)
Next
End Function
Global bx=140
Global by=100
Global chn=Rnd(4)
Global w=LoadImage("w.bmp")
Global Tbullet=LoadImage("shot.bpm")
Global dmgC#
Global y=100
Global x=100
Global speed#=3
Global zdorov#=100
Global speedc#=5
Global hp100=LoadImage("hp100.bmp")
Global hp80=LoadImage("hp80.bmp")
Global hp60=LoadImage("hp60.bmp")
Global hp40=LoadImage("hp40.bmp")
Global hp20=LoadImage("hp20.bmp")
Global cursor=LoadImage("cursor.bmp")
Global polosa=LoadImage("polosa.bmp")
Global Endd=LoadImage("end.bmp")
Global player=LoadImage("1.bmp")
Global player_angle ;добавим в глобал что бы при стрельбе получить угол плеера
TFormFilter enable=0
RotateImage player,90
MidHandle player
Global ground=LoadImage ("ground1.bmp")
Global house1=LoadImage ("house1.bmp")
Global house2=LoadImage ("house2.bmp")
Global car=LoadImage("car1.bmp")
Global cy=Rand(1366)
Dim playerg(361)
For t=0 To 361
playerg(t)=CopyImage(player)
MaskImage playerg(t),0,0,0
RotateImage playerg(t),t
Next
MaskImage hp100,255,255,255
MaskImage hp80,255,255,255
MaskImage hp60,255,255,255
MaskImage hp40,255,255,255
MaskImage hp20,255,255,255
MaskImage player,0,0,10
TileImage ground,0,0,0
Function updateplayer()
player_angle=ATan2(MouseY()-y,MouseX()-x)+180
DrawImage ground,0,0
DrawImage w,700,100
DrawImage house1,300,340
DrawImage house2,750,340
DrawImage house2,-200,340
DrawImage house1,750,340
DrawImage house2,1250,340
DrawImage house2,750,-90
DrawImage house2,950,-90
DrawImage house2,15,-90
DrawImage house2,0,-90
DrawImage car,555,cy
MaskImage cursor,255,255,255
px=x+speed*deltax
py=y+speed*deltay
DrawImage playerg(Int(player_angle)),x,y
Text 0,10,player_angle
If x<0 Then x = 1366
If x>1366 Then x = 0
If y<0 Then y = 768
If y>768 Then y = 0
cursorX=MouseX()
cursorY=MouseY()
DrawImage cursor,MouseX(),MouseY()
If KeyDown(200) Or KeyDown(17) Then
deltay=-1
EndIf
If KeyDown(208) Or KeyDown(31)
deltay=1
EndIf
If KeyDown(203) Or KeyDown(30)
deltax=-1
EndIf
If KeyDown(205) Or KeyDown(32)
deltax=1
EndIf
px=x+speed#*deltax
py=y+speed#*deltay
;DrawImage house1,300,340
;DrawImage house2,750,340
;DrawImage house2,-200,340
;DrawImage house1,750,340
;DrawImage house2,1250,340
;DrawImage house2,750,-90
;DrawImage house2,950,-90
;DrawImage house2,15,-90
;DrawImage house2,0,-90
If Not ImagesCollide (house1,300,340,0,player,px,py,0)
x=px
y=py
EndIf
If ImagesCollide(player,x,y,0,car,555,cy,0) Then zdorov#=zdorov#-2
If zdorov#>80 And zdorov#=<100 Then DrawImage hp100,5,5
If zdorov#>60 And zdorov#=<80 Then DrawImage hp80,5,5
If zdorov#>40 And zdorov#=<60 Then DrawImage hp60,5,5
If zdorov#>20 And zdorov#=<40 Then DrawImage hp40,5,5
If zdorov#>0 And zdorov#=<20 Then DrawImage hp20,5,5
If zdorov#<0 Then DrawImage endd,0,0
End Function
While Not KeyDown(1)
updateplayer()
TBullet_Update()
TBullet_Draw()
Flip
Cls
WaitTimer(FPS) ;ограничение FPS
DrawImage polosa,538,83
If 1=1 Then cy=cy+speedc#
If cy<0 Then cy = 768
If cy>768 Then cy = 0
If ImagesCollide(polosa,538,86,0,car,555,cy,0) Then speedc#=1
If Not ImagesCollide(polosa,538,86,0,car,555,cy,0) Then speedc#=5
If MouseDown(1) Then
If MilliSecs()>timer_shoot+200 Then
timer_shoot=MilliSecs()
Local b.Tbullet=New Tbullet
;bx=x и снова ошибка
b\bx=x
b\by=y
b\angle =player_angle+Rnd(-5,5)
EndIf
EndIf Wend
И незабудь тыкнуть на Полезно если помог
__________________
форум эт вещь... и почему я раньше им не пользовался?
AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
|
(Offline)
|
|
11.02.2012, 20:02
|
#51
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Flight
Медленно, бро. Да и тут дельта-тайминг нужен, а не Timer'ы.
|
(Offline)
|
|
11.02.2012, 20:24
|
#52
|
ПроЭктировщик
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений (для 63 пользователей)
|
Ответ: Flight
пока и так сойдет
__________________
форум эт вещь... и почему я раньше им не пользовался?
AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
|
(Offline)
|
|
12.02.2012, 02:03
|
#53
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,362
Написано 2,474 полезных сообщений (для 6,860 пользователей)
|
Ответ: Flight
Накатал пример, который демонстрирует взаимодействие игрока с врагами.
Можно стрелять, ходить, стрелять, умирать :D
Управление: WSAD + MOUSE
Graphics(800,600,0,2)
SetBuffer(BackBuffer())
SeedRnd(MilliSecs())
SetFont(LoadFont("Tahoma cyr", 16))
; Player position
Global player_x# = GraphicsWidth() * 0.5
Global player_y# = GraphicsHeight() * 0.5
Global player_shotdelay = 350 ; Delay per shot
Global player_shottime = 0
Global player_hp = 100
Global player_maxhp = 100
Global player_score = 0
Global spawner_level = 1
Global spawner_time = 0
Global spawner_delay = 6200
; Loop
While Not KeyHit(1)
;====== UPDATE PPLAYER =====
; Calc view angle
Local fang# = ATan2(MouseY() - player_y, MouseX() - player_x)
; Create bullet while mouse button pressed and shot_time
If MouseDown(1) And player_shottime < MilliSecs() Then
TBullet_Create(player_x, player_y, fang)
player_shottime = MilliSecs() + player_shotdelay
EndIf
; movement
Local vx = (KeyDown(32) - KeyDown(30))
Local vy = (KeyDown(31) - KeyDown(17))
Local mang# = ATan2(vy, vx)
If (Abs(vx) + Abs(vy)) Then
player_x = player_x + Cos(mang) * 3
player_y = player_y + Sin(mang) * 3
EndIf
;====== Enemy spawner ======
If spawner_time < MilliSecs() Then
Local i, sx%, sy%
For i = 0 To spawner_level
sx = (Rand(100)>50) * GraphicsWidth()
sy = (Rand(100)>50) * GraphicsHeight()
TEnemy_Create(sx, sy, 1 + Rand(spawner_level))
Next
spawner_time = MilliSecs() + spawner_delay
spawner_level = spawner_level + 1
EndIf
TBullet_Update() ; update all bullets
TEnemy_Update() ; update all enemies
TBullet_Draw() ; Draw all bullets
TEnemy_Draw(); Draw all enemies
;-- Draw player
If (player_hp > 0) Then
Line(player_x, player_y, player_x + Cos(fang) * 30, player_y + Sin(fang) * 30 )
Color(255,0,0)
Oval(player_x - 10,player_y - 10, 20, 20)
Color(255,255,255)
Else
Text(GraphicsWidth()*0.5, GraphicsHeight()*0.5, "YOU SUCK!", True, True)
EndIf
Text(5,0, "SCORE: " + player_score+" " + mang)
Text(5, 30, "HitPoints: " + player_hp * (player_hp > 0))
Flip() : Cls()
Wend
EndGraphics
End
Type TBullet
Field x#, y#, angle#
End Type
Function TBullet_Create(x#, y#, ang#)
Local this.TBullet = New TBullet
this\x=x
this\y=y
this\angle = ang
End Function
Function TBullet_Update()
For b.TBullet = Each TBullet
b\x = b\x + Cos( b\angle ) * 6
b\y = b\y + Sin( b\angle ) * 6
Local enemy.TEnemy
For enemy = Each TEnemy
Local dist# = Sqr((b\x - enemy\x) ^ 2 + (b\y - enemy\y) ^ 2)
If dist < 28 Then
enemy\hp = enemy\hp - 1
b\x = -1000
Exit
EndIf
Next
If b\x<0 Or b\x>GraphicsWidth() Or b\y<0 Or b\y>GraphicsHeight() Then
Delete(b)
EndIf
Next
End Function
Function TBullet_Draw()
For b.TBullet = Each TBullet
Oval(b\x - 3, b\y - 3, 6, 6)
Next
End Function
Type TEnemy
Field x#, y#, angle#
Field hp%
End Type
Function TEnemy_Create(x#, y#, hp)
Local this.TEnemy = New TEnemy
this\x = x
this\y = y
this\hp = hp
End Function
Function TEnemy_Update()
Local this.TEnemy
For this = Each TEnemy
this\angle = ATan2(player_y - this\y, player_x - this\x)
this\x = this\x + Cos(this\angle)*2
this\y = this\y + Sin(this\angle)*2
; if distance between player and enemy < 40
If Sqr((this\x - player_x) ^ 2 + (this\y - player_y) ^ 2)<40 Then
player_hp = player_hp - 1
EndIf
If this\hp < 1 Then
player_score = player_score + 1
Delete(this)
EndIf
Next
End Function
Function TEnemy_Draw()
Local this.TEnemy
For this = Each TEnemy
Color(60, 104, 24) ; Zombie ;D
Oval(this\x - 12, this\y - 12, 24, 24)
Next
Color(255,255,255)
End Function
Прочти внимательно код - там много приёмов которые тебе пригодятся.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
|
|
12.02.2012, 02:13
|
#54
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Flight
Надо бы его куда-то в другое место поместить. В FAQ может. Он всем пригодится может, не только нубам.
|
(Offline)
|
|
12.02.2012, 05:12
|
#55
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
Ответ: Flight
Зачем так резко? Вспомни свои первые посты, к примеру.
Я думаю, нет ни одного программиста, который сразу стал невообразимо крут, минуя стадию новичка.
|
(Offline)
|
|
12.02.2012, 05:53
|
#56
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,362
Написано 2,474 полезных сообщений (для 6,860 пользователей)
|
Ответ: Flight
Сообщение от FireOwl
Зачем так резко? Вспомни свои первые посты, к примеру.
Я думаю, нет ни одного программиста, который сразу стал невообразимо крут, минуя стадию новичка.
|
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
12.02.2012, 10:43
|
#57
|
Разработчик
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений (для 225 пользователей)
|
Ответ: Flight
?Unable to set graphics mode
__________________
Уважай собеседника, а лучше подари ему +
|
(Offline)
|
|
12.02.2012, 11:22
|
#58
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
Ответ: Flight
да, и еще,ник, помнишь, ты мне показывал типо "свою" игру? я нашел точно такую же в интернете и врятли ты сам написал, как ее сделать и код
|
(Offline)
|
|
12.02.2012, 11:49
|
#59
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
вот новая версия игры,были добавлены выстрелы.
спасибо за помощь: Randomize, Spy4433
Вот она(новая версия)
Последний раз редактировалось Randomize, 12.02.2012 в 12:59.
|
(Offline)
|
|
12.02.2012, 14:37
|
#60
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Flight
Из "своих" игр, у меня только Vivo, но её писал я сам(большую часть, в начале мне очень помогали FireOwl и Nex).
2 FireOwl, я undertaker'a лучше знаю, так что мне позволительно так писать Но спорить не буду, все когда-то начинали.
2 undertaker: убери текст под полоской жизни. Плюс, не совсем понятно, что за серые, и более тёмные прямоугольники. Видимо, один из более тёмных это здание, но тогда почему другие - не здания? Либо, это всё здания, но пройти нельзя только через одно.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:44.
|