2011-11-24 36 views
9



Trọng lực với đường truyền, khả năng tăng tốc và tốc độ đạt được

Tôi cố gắng để hoàn thành một lực hấp dẫn, nơi đường truyền được bao gồm, và cũng có khả năng tăng tốc.
Tôi đã cố gắng sử dụng trọng lực thông thường, mà trông giống như sau:

velocity += gravity * dt; 
position += velocity * dt; 


Điều này có lẽ sẽ làm việc tốt, đủ cho một trò chơi platformer bình thường, nhưng tôi đang cố gắng để tạo ra một trò chơi lấy cảm hứng từ "Trò chơi máy bay trực thăng ", nơi bạn phải di chuyển qua một đường hầm, không chạm vào tường.

những gì tôi muốn làm khác nhau, là tôi muốn có thể tiết kiệm tốc độ trên đường xuống, sẽ được sử dụng trên đường lên một lần nữa, vì vậy tôi sẽ có một số gia tốc ngay từ đầu.
Tôi cũng muốn một số loại thời gian phát sóng, vì vậy khi bạn nhấn đầu nó sẽ không ép bạn xuống nhanh như nó sẽ, nếu tôi đã sử dụng lực hấp dẫn từ mẫu mã.

Hình ảnh này minh họa đường cong tôi muốn có:
Link to curve

Xin lưu ý rằng toàn bộ điều khiển được thực hiện bằng một khóa, ví dụ như bạn sẽ bay lên nếu bạn giữ không gian và lặn nếu bạn thả nó ra.
Ký tự này cũng không bao giờ di chuyển sang trái hoặc sang phải vì nó sẽ có vị trí X tĩnh trên màn hình, do đó không thể sử dụng vectơ.

Tôi đã dành hàng giờ cố gắng để làm cho nó hoạt động, nhưng không thành công. Tôi cũng đã thử tìm kiếm trên internet, nhưng không có may mắn.

Trò chơi "Con cá voi" có trọng lực mà tôi muốn.
Đây là liên kết cho video của trò chơi: http://www.youtube.com/watch?v=5OQ0OWcuDJs

Tôi không phải là một chàng trai vật lý lớn, vì vậy sẽ rất tuyệt nếu bạn có thể đưa ra ví dụ về mã thực tế
Tôi hy vọng mọi người có thể giúp tôi hình dung ngoài.

+0

Không phải là một câu hỏi xấu, nhưng cho thấy một số mã để minh họa những gì bạn đã cố gắng - và mô tả * cách * nó không hoạt động - sẽ giúp bạn nhận câu trả lời. :) –

+0

Tôi không phải là một chàng trai vật lý, nhưng tôi đoán là bạn cần đào sâu hơn một chút vào vật lý để hoàn thành những gì bạn muốn. Vì vậy, tôi nghĩ rằng vật lý của máy bay bạn nên đi vào hướng chung. Có thể [this] (http://www.ucmp.berkeley.edu/vertebrates/flight/physics.html) giúp bạn ít nhất là tìm kiếm các từ đúng để tìm kiếm các giải pháp cho vấn đề của bạn. Cũng trong Batman - Arkham City Game mới nhất, bạn có một thợ máy tương tự, có thể đáng để kiểm tra. – dowhilefor

+0

@ djacobson nó chủ yếu là mã ngẫu nhiên, vì tôi không biết phải đi đâu, nên nó không làm gì tốt :) – Basic

Trả lời

4

Lực hấp dẫn là lực kéo vật thể xuống. Người chơi của bạn là lực kéo vật thể lên. Theo đó, mã của bạn phải là:

if(keyPressed) { 
    velocity += POWER_OF_PLAYER; 
} 

velocity += G; 
position += velocity; 

Điều này là đủ để tạo đường cong như bạn minh họa. Tất nhiên POWER_OF_PLAYER phải có một dấu hiệu khác và giá trị tuyệt đối phải lớn hơn để thực hiện công việc này.

G = -9.81 
POWER_OF_PLAYER = 20 

Tiết kiệm năng lượng sau đó là kiểm tra đơn giản.

if(keyPressed) { 
    if(powerSaved > 0) { 
    velocity += POWER_OF_PLAYER; 
    powerSaved -= SOMETHING; 
    } 
} else if (velocity >= SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER) { 
    powerSaved += SOMETHING; 
} 

SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER nên một cái gì đó ít hơn hoặc bằng 0.

T.B. Tôi giả sử trục Y của bạn bắt đầu từ mặt đất và bắn vào bầu trời. Dấu hiệu cho phù hợp.

+0

Tôi khá chắc chắn tôi đã thử điều này, nhưng tôi sẽ cung cấp cho nó một đi với mã của bạn và xem nếu nó hoạt động :) – Basic

+0

Đây là công thức tiêu chuẩn, vật lý của trò chơi là khác nhau. –

+0

Toán của bạn sai. Lực hấp dẫn là một lực, tức là nó có khối lượng đơn vị * gia tốc, trong khi vận tốc có đơn vị khoảng cách theo thời gian, do đó, thiết lập 'vận tốc + = GRAVITY' về cơ bản là không chính xác. – rcollyer

0

Dường như vận tốc của cá là không đổi.

Hãy thử như sau:

velocity là cố định và không nên thay đổi (trừ trường hợp cá ăn một tốc độ power-up). angle = 0 tương đương với mức bay.

angle -= gravity * dt; 
if (angle < - Math.PI/2) { 
    angle = Math.PI/2; 
} 
if (keyPressed) { 
    angle += power * dt; 
} 

if (angle < - Math.PI/2) { 
    // Stop the player from doing a looping 
    angle = - Math.PI/2; 
} 
if (angle > Math.PI/2) { 
    // Stop the player from doing an inverted looping 
    angle = Math.PI/2; 
} 
// Move the fish (vertical component of velocity) 
position += velocity * dt * Math.sin(angle); 
// Move the background (horizontal component of velocity) 
background_position -= velocity * dt * Math.sin(angle); 
+0

Khi sử dụng mã của bạn, đầu phát chỉ chuyển sang chế độ căng thẳng, trừ khi khi nhấn phím, nó sẽ giảm nhẹ. – Basic

+0

Cố gắng thực hiện các thay đổi ở góc nhỏ hơn - 'angle - = gravity * dt/100.0;' và 'angle + = power * dt/100.0;' –

0

Nghe có vẻ như kết hợp 'nâng' dựa trên tốc độ ngang và nhấn nút kích hoạt chuyển động 'mũi' sẽ hoạt động tốt.

Vì vậy lift sẽ là một số không đổi k nhân với tốc độ ngang Vx và tốc độ dọc Vy sẽ là sự khác biệt của gravitylift lần so với sự thay đổi trong thời gian dt

lift = k * Vx 
Vy += (lift - gravity) * dt 

def noseup 
    k = 0.01 #some small chunk 
    dx = k * Vx 
    dy = k * Vy 
    Vx -= dy 
    Vy += dx 

Khi máy bay (hoặc bất kỳ) mũi về cơ bản nó làm giảm vận tốc trên một trục trong khi tăng nó lên một trục khác.

Có lẽ sẽ không phải là ý tưởng tồi nếu bạn ném drag vào một nơi nào đó mà bây giờ tôi nghĩ về nó, sẽ phải phụ thuộc vào vận tốc tuyệt đối V = (Vx**2 + Vy**2)**0.5 ... và trọng lượng là một từ tốt hơn trọng lực trong trường hợp (ít gây nhầm lẫn, đơn vị khôn ngoan) nhưng nó hoạt động tôi đoán.

Không chính xác "vật lý" nhưng gần đúng xấp xỉ nên hoạt động khá tốt. Chơi xung quanh với các giá trị của k và xem nếu bạn có thể làm cho nó làm những gì bạn muốn.

BTW xin lỗi vì sự uber crappy psuedocode :-P

Các vấn đề liên quan