2014-02-20 2 views
0

안녕하세요 저는 일반적으로 코딩에 새로운 경험이 있으며 유창함을 향상시키기 위해 노력하고 있습니다. 그게 내가 시각적 인 것을 원했기 때문에 파이 게임으로 테이블 게임을 시작한 이유입니다. 그래서 나는 벽에서 튀어 오르고 있지만 패들 충돌 핵심을 얻는 데 어려움을 겪고있는 패들과 공을 가지고 탁구 디자인을 만들었습니다. 내 외륜과 볼을 정렬 할 때 외륜을 인쇄하므로 항상 감지합니다. 어떻게하면 감도를 높이고 외륜에 바운스를 추가 할 수 있습니까? 다시 한번 나는 아주 새로운 오전 그래서 코드를 쉽게 만들기에 구문 수정이나 조언을 읽거나 좋은 것 간소화하기 :파이 게임에서 프로그래밍 가능한 탁구 게임 패들 충돌이 처음입니까?

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 

그런 다음 RECT 이제

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

당신은 지금 당신의 패들가 얼마나 넓은 잘 모릅니다, 패들에 대한 사각형을 만들 수 있습니다를 업데이트해야 move 함수의 끝에서 ,하지만 저는 10을 말하고 필요할 때 조정할 수 있습니다.

이제 직사각형을 추가하십시오. while 루프에서 패들의 x와 y를 얻으면이 선을 추가하여 직사각형을 만듭니다. mrect = pygame.Rect (mx, my, 10, 73) 이제 직사각형을 확인하여 충돌 지점. 이제이 줄 대신 if ball.x < my + 73 and ball.x > my: 두 직사각형 사이의 충돌 지점을 확인하려면이를 변경해야합니다. colliderect 이라고하는 클래스 pygame.Rect에 속한 함수를 사용하여이 작업을 수행 할 것입니다. if ball.x < my + 73 and ball.x > my:if ball.rect.colliderect(mrect):으로 변경하면 사각형, 공 또는 패들이 어느 지점에서나 충돌하는지 확인할 수 있습니다.

행운을 빈다.

0

이것은 이중 볼 퐁용입니다. 이름 ball 인스턴스 circle_m 및 circle_mc. 이름 패들 인스턴스 rectangle 및 rectangle_mc. 이름 경계 boundary1과 경계. 이름 목표 goal1 및 goal2. 이름 텍스트 상자 textField_1, textField_2 및 textField_3. 그런 다음이 코드를 사용하여 재미있게 읽으십시오. 이 섹션에서는 이벤트 리스너를 만듭니다

//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); 

이 기능을 변경하는 반복 루프를 변수의 값을 제어; 처리중인 키를 확인합니다. case 문은 키를 나타내는 숫자와 함께 각 키에 대한 옵션을 제공합니다. break는 케이스를 종료합니다.

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; 
} 

}

에서 단어를 표시합니다