forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Колизия при прыжке (http://forum.boolean.name/showthread.php?t=7803)

Petrofan 09.02.2009 14:12

Колизия при прыжке
 
Вот код прыжка где то нашел в семплах. Работает он нормально по крайней мере игрок не будет бегать по стенам но в нем есть проблема, когда подпрыгнуть в углу где стены сходятся игрок застревает, а если отойти назад отцепляется от стены. Вот сам код:

Graphics3D 800,600,32,0
SetBuffer BackBuffer()
Global gravity#=.08,jumpvel#=2
Global mx,my,angx#,angy#,m#,cam,player
Const Player_T=1,Map_T=2

Player=CreatePivot()
EntityRadius player,5,9
EntityType player,player_T
cam= CreateCamera(Player)

tex = CreateTexture(256,256)
tb=TextureBuffer(tex)

For i=0 To 255
Print(255-i)
For j=0 To 255
grey = Rand(0,25)
r_=Rand(100)+grey
g_=Rand(200)+grey*20
b_=Rand(30)+grey*10
WritePixel i,j,(r_ Shl 16) Or (g_ Shl 8) Or b_,tb
Next
Next

box=CreateCube()
ScaleEntity box,50,50,50
EntityTexture box,tex
FlipMesh box
EntityType box,Map_T


Collisions Player_T,Map_T,2,3
Repeat
If KeyDown( 30 )=True Then speedX#=-1
If KeyDown( 32 )=True Then speedX#= 1
If KeyDown( 31 )=True Then speedZ#=-1.5
If KeyDown( 17 )=True speedZ#= 1.5

mx = MouseX()
my = MouseX()
angx#=(-MouseXSpeed()-angx#)/2.4+angx#
angy#=(MouseYSpeed()-angy#)/2.4+angy#
m#=m#+angy#*.07
If m> 90 Then m=90
If m<-90 Then m=-90
MoveMouse GraphicsWidth()*0.5, GraphicsHeight()*0.5
RotateEntity cam,m#,0,0
TurnEntity player,0,angx#*.07,0


If jumping=0
If KeyDown(57) And EntityCollided(player,map_t)>1 Then yvel#=jumpvel# jumping=1
EndIf
If jumping=1
yvel#=yvel#-gravity#
by#=by#+yvel#
EndIf
If by#<1 Then by#=1 yvel#=0 jumping=0
speedX#=speedX#*.6
speedZ#=speedZ#*.6
MoveEntity player,speedX#,yvel#,speedZ#
If jumping=0 Then MoveEntity player,0,-.55,0

UpdateWorld
RenderWorld
If KeyHit(1) End
Flip
Forever



Помогите разобраться !

christian [I <3 Blitz3D] 09.02.2009 17:14

Ответ: Колизия при прыжке
 
не знаю как это поправить, но этот с помощью этого бага можно вылезти даже до потолка )

попробуй сам написать код прыжка. иногда легче самому сделать, чем поправить чужое

Petrofan 09.02.2009 18:14

Ответ: Колизия при прыжке
 
Нет !!! Зачем изобретать велосипед. В коде прыжка все нормально это колизия кривая вот и прошу помощи чтобы устранить этот баг.

Alex_Noc 09.02.2009 18:26

Ответ: Колизия при прыжке
 
Сори если обижу - но позже если пойдешь по пути прогинга скажешь что праильно сказал :))
ЭТ У ТЯ БАШКА КРИВАЯ :))))))))))))))))
Напиши заново!!!!!

NitE 09.02.2009 18:39

Re: Колизия при прыжке
 
качай - смотри код http://forum.boolean.name/showthread.php?t=7532

H@NON 09.02.2009 18:41

Ответ: Колизия при прыжке
 
код фиговый, чтобы игрок не лазил по потолкам и стенкам или не отталкивался от них, то нужно проверять наклон поверхности. Для этого есть команды CollisionNX/NY/NZ, вот через них и сравнивай. Если значение стоит в определенных пределах, то разрешай игроку прыгать, если не стоит то запрещай.

Petrofan 10.02.2009 12:56

Ответ: Колизия при прыжке
 
Я уже все перепробовал с CollisionNY и у меня постоянно ошибку выдает Collision index out of range почему это так?

Damp 10.02.2009 13:13

Ответ: Колизия при прыжке
 
Можно стенам и полу назначить разные EntityType, что лучше в д. случае.
А в этом примере можно добавить
If jumping=0 yvel#=yvel#-gravity#/2 или 3,4 итд подобрать короче
чтоб хотя бы сползал со стен )) , а на потолке вообще не будтет зависать скорее всего.

H@NON 10.02.2009 16:25

Ответ: Колизия при прыжке
 
Цитата:

Сообщение от Petrofan (Сообщение 97566)
Я уже все перепробовал с CollisionNY и у меня постоянно ошибку выдает Collision index out of range почему это так?

видимо ты неправильно задаешь второй параметр в CollisionNY. Надо так:
Код:

count = CountCollisions(player)
For n = 1 to count
    nx# = nx# + CollisionNX(player, n)
    ny# = ny# + CollisionNY(player, n)
    nz# = nz# + CollisionNZ(player, n)
Next
nx = nx / count
ny = ny / count
nz = nz / count

Еще можно проверять с какой частью сферы(игрока) ты столкнулся и давать возможность прыгать или перемещатся только если эта часть находится в нижней половине, например так:
Код:

count = CountCollisions(player)
Local jumpMode = False
For n = 1 to count
    y# = CollisionY(player, n) - EntityY(player,1)
    If y# < -0.0 then jumpMode = True : Exit
Next


RlexGm 27.01.2010 12:25

Ответ: Колизия при прыжке
 
простите меня что малясь не в тему)
Вопрос: работает ли колизия с моделями *.md2, а то я вроде всё правильно делаю, а все равно проникает...Помогите

Hurrit 27.01.2010 12:39

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

RlexGm 27.01.2010 12:54

Ответ: Колизия при прыжке
 
ах да, забыл(
Graphics3D 0,0,32,1
SetBuffer BackBuffer()

Global Player=CreateSphere()
Global CamPlayer=CreateCamera(Player)
PositionEntity Player,50,60,60
EntityRadius player,8,25
EntityType player, TypePlayer

Global L2L1=LoadMD2("Media\Models\L2L1\L2L1.md2")
L2L1T=LoadTexture("Media\Models\L2L1\L2L1T.jpg")
EntityTexture L2L1,L2L1T
PositionEntity L2L1,74,-12,547
ScaleEntity L2L1,0.5,0.5,0.5
RotateEntity L2L1,0,-90,0
EntityType L2L1, TypeWall

Collisions TypePlayer, TypeWall, 2,3
While Not KeyHit(1)

RenderWorld
UpdateWorld
Flip
Wend
End

Hurrit 27.01.2010 20:30

Ответ: Колизия при прыжке
 
Ты забыл типы объявить. Пропиши перед глобалами
Const TypePlayer=1, TypeWall=2

RlexGm 27.01.2010 20:59

Ответ: Колизия при прыжке
 
***** , я просто нечаяно забыл написать( колизия с другими объктами рабоатет, а имено c *.csm

Hurrit 27.01.2010 23:07

Ответ: Колизия при прыжке
 
Будь внимательнее, ты в таком коротком коде ошибся, когда будешь писать огромные проекты, невнимательность будет для тебя страшным врагом.


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

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