2014-02-20 23 views
0

嗨我對編碼總體上非常陌生,一直在努力提高我的流暢度。那就是爲什麼我開始用Pygame編碼一個pong遊戲,因爲我想要一些可視化的東西。所以我創造了一個帶有工作槳和一個球的乒乓球設計,我可以從牆上彈開,但是無法獲得槳碰撞。我擁有它,所以當我的槳和球對齊時它會打印槳,但它不會檢測到它。我怎樣才能讓它具有更高的靈敏度並增加反彈到槳上。我再一次很新等使代碼更易於任何語法修正或建議閱讀或簡化將是巨大的:代碼如下:新編程pyong遊戲槳遊戲碰撞?

import sys, pygame, pygame.mixer, random, math 
from pygame.locals import * 

pygame.init() 

screen_size = width, height = 600, 400 
black = 0,0,0 
red = (200,0,0) 
blue = 0,0,200 

screen = pygame.display.set_mode(screen_size) 
pygame.display.set_caption("PONG WANNABE") 
screen.fill(black) 

paddle = pygame.image.load("paddle.png") 
divider = pygame.image.load("divider.png") 


def addVectors((angle1, length1), (angle2, length2)): 
    x = math.sin(angle1) * length1 + math.sin(angle2) * length2 
    y = math.cos(angle1) * length1 + math.cos(angle2) * length2 
    length = math.hypot(x, y) 
    angle = 0.5 * math.pi - math.atan2(y, x) 
    return (angle, length) 


class Ball: 
    def __init__(self): 
     self.size = 8 
     self.x = width/2 
     self.y = height/2 
     self.colour = (255, 255, 255) 
     self.thickness = 0 
     self.speed = 0.05 
     self.angle = math.pi/2 

    def display(self): 
     pygame.draw.circle(screen,self.colour,int(self.x),int(self.y)), 
     self.size,self.thickness) 

    def move(self): 
     self.x += math.sin(self.angle) * self.speed 
     self.y -= math.cos(self.angle) * self.speed 

    def bounce(self): 
     if self.x > width - self.size: 
      self.x = 2*(width - self.size) - self.x 
      self.angle = - self.angle 
     elif self.x < self.size: 
      self.x = 2*self.size - self.x 
      self.angle = - self.angle 
     if self.y > height - self.size: 
      self.y = 2*(height - self.size) - self.y 
      self.angle = math.pi - self.angle 
     elif self.y < self.size: 
      self.y = 2*self.size - self.y 
      self.angle = math.pi - self.angle 

ball = Ball() 

running = True  
while running: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.display.quit() 
      sys.exit() 
     elif event.type == KEYDOWN and event.key == K_SPACE: 
      black = blue 
     elif event.type == KEYUP and event.key == K_SPACE: 
      black = 0,0,0 
    screen.fill(black) 
    mx,my = pygame.mouse.get_pos() 
    screen.blit(divider,(width/2, 0)) 
    screen.blit(paddle,(10,my-35)) 
    screen.blit(paddle,(width-20,365-my))  
    ball.move() 
    if ball.x < my + 73 and ball.x > my: 
     print "Paddle" 
    ball.bounce() 
    ball.display() 
    pygame.display.flip() 

回答

0

我就老老實實嘗試使用矩形和檢查矩形碰撞。完整的文檔可以在http://www.pygame.org/docs/ref/rect.html找到,但我仍然會直接解釋你的情況。

在您的Ball類中,您可能需要創建一個Rect。

class Ball: 
    def __init__(self): 
     #all of your x, y etc. 
     #add in a react at the end of init 
     self.rect = pygame.Rect(self.x, self.y, self.size, self.size) 
     #self.size is the width and height 

然後在函數的move你需要更新矩形

def move(self): 
    #move ball with what you already have 
    #now update the rect 
    self.rect.x = x 
    self.rect.y = y 

現在,你要創建一個矩形的槳,現在我不知道你的槳有多寬結束,但我只想說10,你可以根據需要進行調整。

所以現在添加矩形。在while循環中,在獲得槳的x和y後,添加這一行以創建一個矩形 mrect = pygame.Rect(mx,my,10,73) 因此,現在您有一個矩形可用於檢查碰撞點。現在,而不是這條線if ball.x < my + 73 and ball.x > my:你需要改變這個來檢查你的兩個矩形之間的碰撞點。我們將通過使用pygame.Rectpygame.Rect的一部分的函數來完成此操作,該函數被稱爲colliderect 因此,將行if ball.x < my + 73 and ball.x > my:更改爲此if ball.rect.colliderect(mrect):,這將檢查矩形,球或槳在任何點上是否發生碰撞。

祝你好運!

0

這是雙球乒乓球。名稱球實例circle_m和circle_mc。名稱槳實例矩形和矩形_mc。名稱邊界boundary1和邊界。名稱目標goal1和goal2。名稱文本框textField_1,textField_2和textField_3。然後使用這段代碼並玩得開心。 (必須在Adobe Flash作出明顯)

//1. 
var xDir2 = 1; 
var yDir2 = 1; 
stage.addEventListener(Event.ENTER_FRAME, circleHit); 
var xDir = 1; 
var yDir = 1; 
var score = 0; 
var score2 = 0; 
//2. 
function circleHit(event:Event):void 
{ 

{ 
    circle_mc.x += 10 * xDir; 
    circle_mc.y += 10 * yDir; 
    circle_m.x += 5 * xDir2; 
    circle_m.y += 5 * yDir2; 
    if (circle_mc.hitTestObject(rectangle_mc)) 
    { 

     xDir *= -1; 
    } 
}; 
if (circle_mc.hitTestObject(rectangle)) 
{ 
    xDir *= -1; 
} 
if (circle_mc.hitTestObject(boundary)) 
{ 
    yDir *= -1; 
} 
if (circle_mc.hitTestObject(boundary1)) 
{ 
    yDir *= -1; 
} 
if (circle_mc.hitTestObject(goal2)) 
{ 
    score2++; 
    circle_mc.y = 161.95; 
    circle_mc.x = 273; 

} 
textField_2.text = score2; 
textField_1.text = score; 
if (circle_mc.hitTestObject(goal1)) 
{ 
    score++; 
    circle_mc.y = 161.95; 
    circle_mc.x = 273; 
} 


if (circle_m.hitTestObject(goal2)) 
{ 
    score2++; 
    circle_m.x = 273; 
    circle_m.y = 161.95; 
} 

if (circle_m.hitTestObject(goal1)) 
{ 
    score++; 
    circle_m.x = 273; 
    circle_m.y = 161.95; 
} 
if (circle_m.hitTestObject(rectangle_mc)) 
{ 
    xDir2 *= -1; 
} 
if (circle_m.hitTestObject(rectangle)) 
{ 
    hSiz2 *= -2; 
    xDir2 *= -1; 
} 
if (circle_m.hitTestObject(boundary)) 
{ 
    yDir2 *= -1; 
} 
if (circle_m.hitTestObject(boundary1)) 
{ 
    yDir2 *= -1; 
} 
} 
//This section creates variables to store the condition of each key A(up or down) 
var keyUP:Boolean = false; 
var keyDOWN:Boolean = false; 
var keyRIGHT:Boolean = false; 
var keyLEFT:Boolean = false; 

本節創建事件偵聽器。前兩個檢查是否有任何按鍵被按下或返回。第三事件偵聽控制的重複循環

stage.addEventListener(KeyboardEvent.KEY_UP,key_Up); 
    stage.addEventListener(KeyboardEvent.KEY_DOWN,key_Down); 
    stage.addEventListener(Event.ENTER_FRAME,loop); 

這些功能改變變量的值,如果鍵來理想管材switch語句;檢查正在處理哪個密鑰。案例陳述爲每個關鍵字提供了代表關鍵字的選項。打破案件結束。

function key_Up(event:KeyboardEvent) 
{ 
switch (event.keyCode) 
{ 
    case Keyboard.W : 
     keyLEFT = false; 
     break; 
    case 38 : 
     keyUP = false; 
     break; 
    case Keyboard.S : 
     keyRIGHT = false; 
     break; 
    case 40 : 
     keyDOWN = false; 
} 
} 
function key_Down(event:KeyboardEvent) 
{ 
switch (event.keyCode) 
{ 
    case Keyboard.W : 
     keyLEFT = true; 
     break; 
    case 38 : 
     keyUP = true; 
     break; 
    case Keyboard.S : 
     keyRIGHT = true; 
     break; 
    case 40 : 
     keyDOWN = true; 
} 
} 

每次輸入幀時都會重複該功能。它使用變量的值來控制動作。跟蹤語句將在輸出窗口

function loop(event:Event) 
{ 
if (keyUP) 
{ 
    rectangle_mc.y -= 20; 
} 

if (keyDOWN) 
{ 
    rectangle_mc.y -= -20; 
} 

if (keyLEFT) 
{ 
    rectangle.y -= 20; 
} 

if (keyRIGHT) 
{ 
    rectangle.y -= -20; 
} 

if (score ==10) 
{ 
    textField_3.text = "Left side WINS!!!!!"; 
    circle_mc.y = -5000; 
    circle_mc.x = -5000; 
} 
if (score2 ==10) 
{ 
    textField_3.text = "Right side WINS!!!!!"; 
    circle_mc.y = -5000; 
    circle_mc.x = -5000; 
} 
if (score ==10) 
{ 
    textField_3.text = "Left side WINS!!!!!"; 
    circle_m.y = -5000; 
    circle_m.x = -5000; 
} 
if (score2 ==10) 
{ 
    textField_3.text = "Right side WINS!!!!!"; 
    circle_m.y = -5000; 
    circle_m.x = -5000; 
} 

}

顯示一個字