forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на MidletPascal (http://forum.boolean.name/forumdisplay.php?f=88)
-   -   PhysicsEngine (http://forum.boolean.name/showthread.php?t=13218)

psih1 26.08.2010 15:15

PhysicsEngine
 
Вот хочу написать физический движок.Как можно проверить столкновение с линией
PHP код:

program PhysicsEngine;
var
xPos,yPos,xPosBall,yPosBall,xMove,yMove,keyAction,tecla:integer;
Bsize,Psize:integer;
procedure init;
begin
xposball
:=100;
yposball:=100;
yMove := 3;
xPos:=160;
psize:=32;
bsize:=15;
end;
begin
init
;
repeat
tecla
:=getkeypressed
keyaction:= keyToAction(tecla);
        if 
keyAction GA_LEFT then xPos := xPos 2;
        if 
keyAction GA_RIGHT then xPos := xPos 2;
        
            
setColor(255255255);
            
fillRect(00getWidthgetHeight);

            
setColor(000);

        
drawEllipse(xPosballyPosball,bsize,bsize);
        
drawEllipse(xPosball+20yPosball,bsize,bsize);
        
xPosball := xPosball xMove;
        
yPosball := yPosball yMove;
        
delay(30);
        
        
setColor(000);
    
drawline(xpos,getHeight-10,xpos-100,getHeight-10);
    
    
repaint;
until tecla=KE_STAR;
end


abcdef 26.08.2010 17:03

Ответ: PhysicsEngine
 
из старой pascal'евской игрушки:
Код:

function DistToBar(x1, y1, x2, y2, x0, y0 : Integer) : Boolean;
{находится ли точка (x0,y0) в прямоугольнике (x1,y1)-(x2,y2)}
Var
  dx, dy : Integer;
Begin
  dx := abs(x2-x1);
  dy := abs(y2-y1);
  if dx < 15 then  dx := 15;
  if dy < 15 then  dy := 15;
  DistToBar := (abs(x1-x0) <= dx) and (abs(x2-x0) <= dx)
          and (abs(y1-y0) <= dy) and (abs(y2-y0) <= dy);
End;

function DistToLine(x1, y1, x2, y2, x0, y0, maxDist : Integer) : Boolean;
{расстояние от точки (x0,y0) до отрезка (x1,y1, x2,y2)}
Var
  A, B, C : LongInt;
  dist    : Real;
Begin
  x1 := x1 - x0;
  y1 := y1 - y0;
  x2 := x2 - x0;
  y2 := y2 - y0;
  x0 := 0; {?}
  y0 := 0; {?}
  A := y1 - y2;
  B := x2 - x1;
  C := LongInt(y2)*x1 - LongInt(y1)*x2;
  dist := Sqrt(A*A + B*B);
  if dist <> 0 then  dist := abs(A*x0{?=0} + B*y0{?=0} + C) / dist;
  DistToLine := (dist <= maxDist);
End;

Function OnLine(x0, y0, dist, x1, y1, x2, y2 : Integer) : Boolean;
{проверка на пересечение линии на карте}
Begin
  OnLine := DistToBar(x1, y1, x2, y2, x0, y0)
        and DistToLine(x1, y1, x2, y2, x0, y0, dist);
End;


psih1 26.08.2010 18:51

Ответ: PhysicsEngine
 
а что за тип A, B, C : LongInt;

cHeRsAnYa 26.08.2010 21:30

Ответ: PhysicsEngine
 
То же, что и обычный Integer в MidletPascal.

DIMMON4IK 26.08.2010 23:37

Ответ: PhysicsEngine
 
в longint просто большее макс. значение чем в integer

_Nox_ 27.08.2010 02:43

Ответ: PhysicsEngine
 
но в мп такого типа нет, но фактически диапазон мп-овского интеджера равен настоящему лонгинту

psih1 27.08.2010 10:32

Ответ: PhysicsEngine
 
Спасибо а через либ game можно проверить столкновение?

cherepets 27.08.2010 12:05

Ответ: PhysicsEngine
 
а смысл?
начни лучше с броска шарика под любым углом и отскоком от стены.
потом падающим (по дуге) прямоугольничком.

прикрутить более сложную графику и сделать бесконечный хвост из либ ты всегда успеешь

psih1 27.08.2010 14:21

Ответ: PhysicsEngine
 
Вложений: 1
Вот мой подобный проект на flash

psih1 31.08.2010 16:51

Ответ: PhysicsEngine
 
Вложений: 1
Вот то что меня вдохновило

Trazzy 01.09.2010 04:16

Ответ: PhysicsEngine
 
Флеш - супер, а джар почему-то ниодин эмулятор не открыл..

Upd: только на Нокии заработала (сонька, симак и мотор отказались запускать!)

psih1 03.09.2010 14:53

Ответ: PhysicsEngine
 
Как проверить столкновение с линией с помошю Lib_game???

psih1 03.09.2010 15:41

Ответ: PhysicsEngine
 
Вложений: 1
вот так примерно будет выглядеть уровень

Bananbl4 03.09.2010 21:19

Ответ: PhysicsEngine
 
Решил свою гравити сделать? похвально. сделай ещё корректную физику камней под колёсьями, чтобы непредсказуемо кататься :-D

psih1 04.09.2010 16:06

Ответ: PhysicsEngine
 
Сделал карту топерь вся запара со столкновением


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

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