forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Flight (http://forum.boolean.name/showthread.php?t=16307)

undertaker 11.02.2012 18:33

Ответ: Flight
 
Вложений: 1
вот код игры и вложения

Nikich 11.02.2012 19:22

Ответ: 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


Program23 11.02.2012 19:39

Ответ: Flight
 
Цитата:

Сообщение от undertaker (Сообщение 219202)
вот код игры и вложения

Если у персонажа все еще отображается белая полоса сбоку,то это из-за того что маска неоднородна.
В архиве нет exe)

Nikich 11.02.2012 19:49

Ответ: Flight
 
Вложений: 1
Вот exe. Думаю, undertaker не против :) .

Spy4433 11.02.2012 19:58

Ответ: 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

И незабудь тыкнуть на Полезно если помог

Nikich 11.02.2012 20:02

Ответ: Flight
 
Вложений: 1
Медленно, бро. Да и тут дельта-тайминг нужен, а не Timer'ы.

Spy4433 11.02.2012 20:24

Ответ: Flight
 
пока и так сойдет :)

Randomize 12.02.2012 02:03

Ответ: Flight
 
Вложений: 1
Накатал пример, который демонстрирует взаимодействие игрока с врагами.
Можно стрелять, ходить, стрелять, умирать :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

Прочти внимательно код - там много приёмов которые тебе пригодятся.

Nikich 12.02.2012 02:13

Ответ: Flight
 
Надо бы его куда-то в другое место поместить. В FAQ может. Он всем пригодится может, не только нубам.

FireOwl 12.02.2012 05:12

Ответ: Flight
 
Зачем так резко? Вспомни свои первые посты, к примеру.
Я думаю, нет ни одного программиста, который сразу стал невообразимо крут, минуя стадию новичка.

Randomize 12.02.2012 05:53

Ответ: Flight
 
Цитата:

Сообщение от FireOwl (Сообщение 219247)
Зачем так резко? Вспомни свои первые посты, к примеру.
Я думаю, нет ни одного программиста, который сразу стал невообразимо крут, минуя стадию новичка.

Это ты кому?

Trazzy 12.02.2012 10:43

Ответ: Flight
 
?Unable to set graphics mode

undertaker 12.02.2012 11:22

Ответ: Flight
 
да, и еще,ник, помнишь, ты мне показывал типо "свою" игру? я нашел точно такую же в интернете и врятли ты сам написал, как ее сделать и код

undertaker 12.02.2012 11:49

Вложений: 1
вот новая версия игры,были добавлены выстрелы.
спасибо за помощь:Randomize,Spy4433:super:

Вот она(новая версия)

Nikich 12.02.2012 14:37

Ответ: Flight
 
Из "своих" игр, у меня только Vivo, но её писал я сам(большую часть, в начале мне очень помогали FireOwl и Nex).
2 FireOwl, я undertaker'a лучше знаю, так что мне позволительно так писать:) Но спорить не буду, все когда-то начинали.
2 undertaker: убери текст под полоской жизни. Плюс, не совсем понятно, что за серые, и более тёмные прямоугольники. Видимо, один из более тёмных это здание, но тогда почему другие - не здания? Либо, это всё здания, но пройти нельзя только через одно.


Часовой пояс GMT +4, время: 22:00.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot