Показать сообщение отдельно
Старый 06.08.2012, 09:29   #7
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Гравитация в 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, пожалуйста.
(Offline)
 
Ответить с цитированием