forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Гравитация в 2D (http://forum.boolean.name/showthread.php?t=16989)

Okay 30.06.2012 14:40

Гравитация в 2D
 
Вот сам прыжок
PHP код:

If KeyHit(82Then

    nplayer1
\vely 100
    nplayer1
\jumping True
    
EndIf  



If 
nplayer1\jumping True

    
If nplayer1\vely > -100   
             nplayer1
\vely nplayer1\vely nplayer1\accel
             nplayer1
\cory nplayer1\cory nplayer1\vely
    
EndIf

EndIf 

Выставление значений
PHP код:

nplayer1\vely 0
nplayer1
\accel 10
nplayer1
\jumping False 


Okay 30.06.2012 14:41

Ответ: Гравитация в 2D
 
Проблема в том, что он улетает в самый вверх. А потом быстро перемещается вниз.

Gector 30.06.2012 15:03

Ответ: Гравитация в 2D
 
Цитата:

Сообщение от Okay (Сообщение 231948)
Проблема в том, что он улетает в самый вверх. А потом быстро перемещается вниз.

Скорость меньше не пробовал ставить?

Okay 30.06.2012 15:18

Ответ: Гравитация в 2D
 
Цитата:

Сообщение от Gector (Сообщение 231950)
Скорость меньше не пробовал ставить?

Пробовал. Эффект такой же

Okay 30.06.2012 16:58

Ответ: Гравитация в 2D
 
Вот весь код
Код:

Graphics 840,640,16,2
SetBuffer BackBuffer()

Global sBegin

Global mBack = LoadImage("media/menu/back.bmp")
Global mExit = LoadImage("media/menu/exit.bmp")

Global mBegin = LoadImage("media/menu/mBegin.bmp")
Global mSettings = LoadImage("media/menu/settings.bmp")
Global mgSettings = LoadImage("media/menu/settings1.bmp")
Global millibegin = MilliSecs()
Global mgBegin = LoadImage("media/menu/mgBegin.bmp")
Global sg1 = LoadImage("media/menu/startgame.bmp")
Global menuok = False
Global sg2 = LoadImage("media/menu/startgame1.bmp")
Global sgg = False
Global cursor = LoadImage("media/menu/cursor.bmp")
Global player1 = LoadImage("media/skins/player1.bmp")
Global block = LoadImage("media/level1/wall.bmp")
Global ttt = MilliSecs()
Global gravity = 1
Global velgra = 5

Global left1, right1, left2, right2

HidePointer
AppTitle "Mario War 0.1 'LOG'"

Global StartTeam = 0
Global StartTColor = 0
Global StartSkin1 = 0

Type player
Field lives
Field gun
Field kills
Field team
Field skin
Field corx
Field cory
Field tcolor
Field vely
Field accel
Field jumping
End Type

Global nplayer1.player = New player
nplayer1\lives = 0
nplayer1\gun = 0
nplayer1\kills = 0
nplayer1\team = 0
nplayer1\skin = 0
nplayer1\corx = 0
nplayer1\cory = 0
nplayer1\vely = 0
nplayer1\accel = 10
nplayer1\jumping = False
nplayer1\tcolor = 0

Global nplayer2.player = New player
nplayer2\lives = 0
nplayer2\gun = 0
nplayer2\kills = 0
nplayer2\team = 0
nplayer2\skin = 0
nplayer2\corx = 0
nplayer2\cory = 0
nplayer2\tcolor = 0



While Not KeyDown(56) And KeyDown(62)
Cls

If menuok = True Then
    DrawImage mBegin,0,0
    If sgg = False Then
        DrawBlock sg1,220,210
        DrawBlock mSettings,220,320
        DrawBlock mExit,550,550
        If ImagesCollide(sg1,220,210,0,cursor,MouseX(),MouseY(),0) Then
            DrawBlock sg2,220,210
            If MouseHit(1) Then
                Gosub changeplayers
            EndIf
        EndIf
        If ImagesCollide(mSettings,220,320,0,cursor,MouseX(),MouseY(),0) Then
            DrawBlock mgSettings,220,320
            If MouseHit(1) Then
                Gosub settings
            EndIf
        EndIf
        If MouseHit(1) Then
            If ImagesCollide(mExit,550,550,0,cursor,MouseX(),MouseY(),0) Then
                End
            Else
           
            EndIf
        EndIf
    EndIf
EndIf


While MilliSecs() < millibegin + 3000
DrawImage mgBegin,0,0
Wend menuok = True

FlushKeys
DrawImage cursor,MouseX(),MouseY()
Flip
Wend

.changeplayers
While Not KeyDown(56) And KeyDown(62)
Cls

If menuok = True Then
    DrawImage mBegin,0,0
    DrawBlock mBack,550,550
    If MouseHit(1) Then
        If ImagesCollide(mBack,550,550,0,cursor,MouseX(),MouseY(),0) Then
            Return
        Else
 
        EndIf
    EndIf
EndIf

If KeyDown(28) Then
    Gosub StartGame
    gravity = 1
EndIf


FlushKeys
DrawImage cursor,MouseX(),MouseY()
Flip
Wend



.settings
While Not KeyDown(56) And KeyDown(62)
Cls

If menuok = True Then
    DrawImage mBegin,0,0
    DrawBlock mBack,550,550
    If MouseHit(1) Then
        If ImagesCollide(mBack,550,550,0,cursor,MouseX(),MouseY(),0) Then
            Return
        Else

        EndIf
    EndIf
EndIf


FlushKeys
DrawImage cursor,MouseX(),MouseY()
Flip
Wend


.StartGame
OnPlayer1Spawn()
OnPlayer2Spawn()
Global speedss = 5
Repeat
Cls

nplayer1\cory = nplayer1\cory + velgra
velgra = 5

If right1 = 1 Then
    DrawImageRect player1,nplayer1\corx,nplayer1\cory,0,0,25,31
EndIf

If left1 = 2 Then
    DrawImageRect player1,nplayer1\corx,nplayer1\cory,78,0,103,31
EndIf

DrawBlock block,300,600

If KeyDown(203) Then
    nplayer1\corx = nplayer1\corx - 1.6
    right1 = 2
    left1 = 2
EndIf

If KeyDown(205) Then
    nplayer1\corx = nplayer1\corx + 1.6
    right1 = 1
    left1 = 1
EndIf

If KeyDown(203) And KeyDown(77) Then
    nplayer1\corx = nplayer1\corx - 2.3
    right1 = 2
    left1 = 2
EndIf

If KeyDown(205) And KeyDown(77) Then
    nplayer1\corx = nplayer1\corx + 2.3
    right1 = 1
    left1 = 1
EndIf

If KeyHit(82) Then

        nplayer1\vely = 70
        nplayer1\jumping = True
       
EndIf 



If nplayer1\jumping = True

        If nplayer1\vely > -100 
            nplayer1\vely = nplayer1\vely - nplayer1\accel
            nplayer1\cory = nplayer1\cory - nplayer1\vely
        EndIf

EndIf

If nplayer1\cory <= 0

        nplayer1\vely = 0
        nplayer1\jumping = False
EndIf

If ImagesCollide(player1,nplayer1\corx,nplayer1\cory,0,block,300,600,0) Then
        velgra = 0
EndIf

If nplayer1\cory > 640 Then
    nplayer1\cory = 0
EndIf

FlushKeys
Flip
Forever



Function OnPlayer1Spawn()

right1 = 1
left1 = 1

Local Spawnx = Rnd(1,840)
Local Spawny = Rnd(1,640)

nplayer1\corx = Spawnx
nplayer1\cory = Spawny

StartLocalGame()

gravity = 1
End Function



Function OnPlayer2Spawn()

Local Spawnx = Rnd(0,840)
Local Spawny = Rnd(0,640)

nplayer1\corx = Spawnx
nplayer1\cory = Spawny

StartLocalGame()

End Function


Function StartLocalGame()

nplayer1\lives = StartLives
nplayer1\kills = StartKills
nplayer1\team = StartTeam1
nplayer1\tcolor = StartTColor1

nplayer2\lives = StartLives
nplayer2\kills = StartKills
nplayer2\team = StartTeam2
nplayer2\tcolor = StartTColor2

End Function


Function OnPlayer1Death()

nplayer1\lives = nplayer1\lives - 1
OnPlayer1Spawn()

End Function


Function OnPlayer2Death()

nplayer2\lives = nplayer2\lives - 1
OnPlayer2Spawn()

End Function


Function AI()

If nplayer1\cory > nplayer2\cory Then Jump()

If nplayer1\corx > nplayer2\corx Then GoRight()
If nplayer1\corx < nplayer2\corx Then GoLeft()

If nplayer1\cory = nplayer2\cory Then JumpAttack()

If nplayer2\gun = 1 And 2 And 3 Then Attack()

End Function
 


Function Jump()

Local jn1cory
Local trt = MilliSecs()
    Repeat
    If ImagesCollide(player1,nplayer1\corx,nplayer1\cory,0,block,300,600,0) Then
            nplayer1\cory = nplayer1\cory - (3*2)
           
    Else

    EndIf
    Until MilliSecs() < (trt + 2000)
End Function




Function GoLeft()

nplayer2\corx = nplayer2\corx - 0.1

End Function


Function GoRight()

nplayer2\corx = nplayer2\corx + 0.1

End Function


Function JumpAttack()

End Function


Function Attack()

End Function


pepel 05.08.2012 11:07

Ответ: Гравитация в 2D
 
Цитата:

Сообщение от Okay (Сообщение 231965)
Вот весь код
Код:

Graphics 840,640,16,2
SetBuffer BackBuffer()

Global sBegin

Global mBack = LoadImage("media/menu/back.bmp")
Global mExit = LoadImage("media/menu/exit.bmp")

Global mBegin = LoadImage("media/menu/mBegin.bmp")
Global mSettings = LoadImage("media/menu/settings.bmp")
Global mgSettings = LoadImage("media/menu/settings1.bmp")
Global millibegin = MilliSecs()
Global mgBegin = LoadImage("media/menu/mgBegin.bmp")
Global sg1 = LoadImage("media/menu/startgame.bmp")
Global menuok = False
Global sg2 = LoadImage("media/menu/startgame1.bmp")
Global sgg = False
Global cursor = LoadImage("media/menu/cursor.bmp")
Global player1 = LoadImage("media/skins/player1.bmp")
Global block = LoadImage("media/level1/wall.bmp")
Global ttt = MilliSecs()
Global gravity = 1
Global velgra = 5


ты картинки то выложи, а то код не запускается,желательно раром

Жека 06.08.2012 09:29

Ответ: Гравитация в 2D
 
Начну с хорошего - выкладываю подправленный код.
Из плохого: код ужасен из-за использавания GOSUB, и имена переменных не по мне.

Что было неправильно:
- в типе player все поля были целочисленные, но для ускорения и скорости это не подходит.
- зачем ты проверял на улёт выше экрана? пусть летит, всё равно вернётся назад при правильной формуле
- из координаты Y гравитацию вычитать надо только если мы не в состоянии прыжка, т.к. прыжок отдельно обрабатывается
- при достижении земли (у тебя это у=640) ты зачем-то ставишь игрока в координату у=0, т.е. на небо, а надо оставлять на земле

Вот код, работает без картинок, вывод картинок закомментировал. Из графики есть только прямоугольный пол и квадратный игрок.

Код:

Graphics 840,640,16,2
SetBuffer BackBuffer()

Global sBegin

Global mBack = LoadImage("media/menu/back.bmp")
Global mExit = LoadImage("media/menu/exit.bmp")

Global mBegin = LoadImage("media/menu/mBegin.bmp")
Global mSettings = LoadImage("media/menu/settings.bmp")
Global mgSettings = LoadImage("media/menu/settings1.bmp")
Global millibegin = MilliSecs()
Global mgBegin = LoadImage("media/menu/mgBegin.bmp")
Global sg1 = LoadImage("media/menu/startgame.bmp")
Global menuok = False
Global sg2 = LoadImage("media/menu/startgame1.bmp")
Global sgg = False
Global cursor = LoadImage("media/menu/cursor.bmp")
Global player1 = LoadImage("media/skins/player1.bmp")
Global block = LoadImage("media/level1/wall.bmp")
Global ttt = MilliSecs()
Global gravity = 1
Global velgra = 5

Global left1, right1, left2, right2

HidePointer
AppTitle "Mario War 0.1 'LOG'"

Global StartTeam = 0
Global StartTColor = 0
Global StartSkin1 = 0

Type player
        Field lives
        Field gun
        Field kills
        Field team
        Field skin
        Field corx#
        Field cory#
        Field tcolor
        Field vely#
        Field accel#
        Field jumping
End Type

Global nplayer1.player = New player
nplayer1\lives = 0
nplayer1\gun = 0
nplayer1\kills = 0
nplayer1\team = 0
nplayer1\skin = 0
nplayer1\corx = 0
nplayer1\cory = 0
nplayer1\vely = 0
nplayer1\accel = 10
nplayer1\jumping = False
nplayer1\tcolor = 0

Global nplayer2.player = New player
nplayer2\lives = 0
nplayer2\gun = 0
nplayer2\kills = 0
nplayer2\team = 0
nplayer2\skin = 0
nplayer2\corx = 0
nplayer2\cory = 0
nplayer2\tcolor = 0


Gosub StartGame


While Not KeyDown(56) And KeyDown(62)
        Cls
       
        If menuok = True Then
                ;DrawImage mBegin,0,0
                If sgg = False Then
                        ;DrawBlock sg1,220,210
                        ;DrawBlock mSettings,220,320
                        ;DrawBlock mExit,550,550
;                        If ImagesCollide(sg1,220,210,0,cursor,MouseX(),MouseY(),0) Then
;                                DrawBlock sg2,220,210
;                                If MouseHit(1) Then
;                                        Gosub changeplayers
;                                EndIf
;                        EndIf
;                        If ImagesCollide(mSettings,220,320,0,cursor,MouseX(),MouseY(),0) Then
;                                DrawBlock mgSettings,220,320
;                                If MouseHit(1) Then
;                                        Gosub settings
;                                EndIf
;                        EndIf
;                        If MouseHit(1) Then
;                                If ImagesCollide(mExit,550,550,0,cursor,MouseX(),MouseY(),0) Then
;                                        End
;                                Else
;                                       
;                                EndIf
;                        EndIf
                EndIf
        EndIf
       
       
        While MilliSecs() < millibegin + 3000
                ;DrawImage mgBegin,0,0
        Wend menuok = True
       
        FlushKeys
        ;DrawImage cursor,MouseX(),MouseY()
        Flip
Wend

.changeplayers
While Not KeyDown(56) And KeyDown(62)
        Cls
       
        If menuok = True Then
                ;DrawImage mBegin,0,0
                ;DrawBlock mBack,550,550
                ;If MouseHit(1) Then
                ;        If ImagesCollide(mBack,550,550,0,cursor,MouseX(),MouseY(),0) Then
                ;                Return
                ;        Else
                ;               
                ;        EndIf
                ;EndIf
        EndIf
       
        If KeyDown(28) Then
                Gosub StartGame
                gravity = 1
        EndIf
       
       
        FlushKeys
        ;DrawImage cursor,MouseX(),MouseY()
        Flip
Wend



.settings
While Not KeyDown(56) And KeyDown(62)
        Cls
       
        If menuok = True Then
                ;DrawImage mBegin,0,0
                ;DrawBlock mBack,550,550
                If MouseHit(1) Then
                        ;If ImagesCollide(mBack,550,550,0,cursor,MouseX(),MouseY(),0) Then
                        ;        Return
                        ;Else
                        ;       
                        ;EndIf
                EndIf
        EndIf
       
       
        FlushKeys
        ;DrawImage cursor,MouseX(),MouseY()
        Flip
Wend


.StartGame
OnPlayer1Spawn()
OnPlayer2Spawn()
Global speedss = 5

nplayer1\vely = 0
nplayer1\jumping = False
velgra = 5

Repeat
        Cls
       
       
        ;If right1 = 1 Then
        ;        Rect nplayer1\corx,nplayer1\cory,50,50,1
        ;EndIf
       
        ;If left1 = 2 Then
        ;        Rect nplayer1\corx,nplayer1\cory,50,50,1
        ;EndIf
        Color(200,100,100)
        Rect nplayer1\corx,nplayer1\cory,50,50,1
       
        Color(100,100,100)
        Rect 100,600,600,100,1
       
        If KeyDown(203) Then
                nplayer1\corx = nplayer1\corx - 1.6
                right1 = 2
                left1 = 2
        EndIf
       
        If KeyDown(205) Then
                nplayer1\corx = nplayer1\corx + 1.6
                right1 = 1
                left1 = 1
        EndIf
       
        If KeyDown(203) And KeyDown(77) Then
                nplayer1\corx = nplayer1\corx - 2.3
                right1 = 2
                left1 = 2
        EndIf
       
        If KeyDown(205) And KeyDown(77) Then
                nplayer1\corx = nplayer1\corx + 2.3
                right1 = 1
                left1 = 1
        EndIf
       
        If KeyHit(82) Then
               
                nplayer1\vely = 8
                nplayer1\jumping = True
               
        EndIf 
       
       
       
        If nplayer1\jumping = True
                ;If nplayer1\vely > -100 
                nplayer1\vely = nplayer1\vely - nplayer1\accel*0.01
                        nplayer1\cory = nplayer1\cory - nplayer1\vely
                ;EndIf
        Else
                nplayer1\cory = nplayer1\cory + velgra
        EndIf
       
;        If nplayer1\cory <= 0
;               
;                nplayer1\vely = 0
;                nplayer1\jumping = False
;        EndIf
       
        ;If ImagesCollide(player1,nplayer1\corx,nplayer1\cory,0,block,300,600,0) Then
    ;    velgra = 0
        ;EndIf
       
        If nplayer1\cory > 550 Then ;уровень земли 600 минус 50 сам игрок = 550
                nplayer1\cory = 550
        EndIf
       
        FlushKeys
        Flip
Forever



Function OnPlayer1Spawn()
       
        right1 = 1
        left1 = 1
       
        Local Spawnx = Rnd(1,840)
        Local Spawny = Rnd(1,640)
       
        nplayer1\corx = Spawnx
        nplayer1\cory = Spawny
       
        StartLocalGame()
       
        gravity = 1
End Function



Function OnPlayer2Spawn()
       
        Local Spawnx = Rnd(0,840)
        Local Spawny = Rnd(0,640)
       
        nplayer1\corx = Spawnx
        nplayer1\cory = Spawny
       
        StartLocalGame()
       
End Function


Function StartLocalGame()
       
        nplayer1\lives = StartLives
        nplayer1\kills = StartKills
        nplayer1\team = StartTeam1
        nplayer1\tcolor = StartTColor1
       
        nplayer2\lives = StartLives
        nplayer2\kills = StartKills
        nplayer2\team = StartTeam2
        nplayer2\tcolor = StartTColor2
       
End Function


Function OnPlayer1Death()
       
        nplayer1\lives = nplayer1\lives - 1
        OnPlayer1Spawn()
       
End Function


Function OnPlayer2Death()
       
        nplayer2\lives = nplayer2\lives - 1
        OnPlayer2Spawn()
       
End Function


Function AI()
       
        If nplayer1\cory > nplayer2\cory Then Jump()
       
        If nplayer1\corx > nplayer2\corx Then GoRight()
        If nplayer1\corx < nplayer2\corx Then GoLeft()
       
        If nplayer1\cory = nplayer2\cory Then JumpAttack()
       
        If nplayer2\gun = 1 And 2 And 3 Then Attack()
       
End Function



Function Jump()
       
        Local jn1cory
        Local trt = MilliSecs()
    Repeat
                If ImagesCollide(player1,nplayer1\corx,nplayer1\cory,0,block,300,600,0) Then
            nplayer1\cory = nplayer1\cory - (3*2)
           
                Else
                       
                EndIf
    Until MilliSecs() < (trt + 2000)
End Function




Function GoLeft()
       
        nplayer2\corx = nplayer2\corx - 0.1
       
End Function


Function GoRight()
       
        nplayer2\corx = nplayer2\corx + 0.1
       
End Function


Function JumpAttack()
       
End Function


Function Attack()
       
End Function



Откажись от GOSUB, пожалуйста.

Okay 22.08.2012 15:27

Ответ: Гравитация в 2D
 
Цитата:

Сообщение от Жека (Сообщение 235302)
Начну с хорошего - выкладываю подправленный код.
Из плохого: код ужасен из-за использавания GOSUB, и имена переменных не по мне.

Что было неправильно:
- в типе player все поля были целочисленные, но для ускорения и скорости это не подходит.
- зачем ты проверял на улёт выше экрана? пусть летит, всё равно вернётся назад при правильной формуле
- из координаты Y гравитацию вычитать надо только если мы не в состоянии прыжка, т.к. прыжок отдельно обрабатывается
- при достижении земли (у тебя это у=640) ты зачем-то ставишь игрока в координату у=0, т.е. на небо, а надо оставлять на земле

Вот код, работает без картинок, вывод картинок закомментировал. Из графики есть только прямоугольный пол и квадратный игрок.

Откажись от GOSUB, пожалуйста.

Сразу скажу. Перешел на Blitzmax, но спасибо, что помог. Посмотрю свои недочеты. Сравню.
Насчет Gosub, чтоже тогда использовать? Я что-то не увидел другого оператора перехода на лейблы.
Далее.. устанавливаю y = 0, после того как он упадет в яму(То есть вниз за экран). Это так по игре нужно. игра то Mario. ахахх хотя я уже её забросил.

Жека 23.08.2012 06:58

Ответ: Гравитация в 2D
 
Метки необязательно использовать, можно использовать игровые состояния.

Код:

Global gameState%
Const STATE_MENU_MAIN% = 1
Const STATE_GAME% = 2
;Const STATE_% = 3

;В главном цикле:

if(gameState = STATE_MENU_MAIN)
  ;обрабатываем и рисуем главное меню
else if(gameState = STATE_GAME)
  ;обрабатываем и рисуем саму игру
else if(_и_так_далее_)

endif


Okay 23.08.2012 17:37

Ответ: Гравитация в 2D
 
Цитата:

Сообщение от Жека (Сообщение 237003)
Метки необязательно использовать, можно использовать игровые состояния.

Код:

Global gameState%
Const STATE_MENU_MAIN% = 1
Const STATE_GAME% = 2
;Const STATE_% = 3

;В главном цикле:

if(gameState = STATE_MENU_MAIN)
  ;обрабатываем и рисуем главное меню
else if(gameState = STATE_GAME)
  ;обрабатываем и рисуем саму игру
else if(_и_так_далее_)

endif


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

Nex 23.08.2012 20:20

Ответ: Гравитация в 2D
 
Цитата:

Сообщение от Okay (Сообщение 237063)
Разве это не лишняя нагрузка, так как очень много условий и каждое будет проверяться.

Сверяем STATE_MENU_MAIN. Если рано "1" значит все "вертится" только в этом условии, а остальные пропускаются и так далее. Проверить на нажатие кнопки тоже самое так что никакой нагрузки. :)

Okay 24.08.2012 00:07

Ответ: Гравитация в 2D
 
Цитата:

Сообщение от Nex (Сообщение 237079)
Сверяем STATE_MENU_MAIN. Если рано "1" значит все "вертится" только в этом условии, а остальные пропускаются и так далее. Проверить на нажатие кнопки тоже самое так что никакой нагрузки. :)

ну понятно =)


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

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