我需要有关如何在Pong克隆中进行碰撞的建议

时间:2013-11-14 01:21:10

标签: ruby rubygame

您好我正在使用ruby和rubygame构建克隆pong程序。我目前的问题是左侧碰撞。碰撞发生在倒退。右边的效果非常好。我需要帮助。谁能解决这个问题? 继承我的代码

require 'rubygems'
require 'rubygame'
Rubygame::TTF.setup 

class Game 
    def initialize 
        @screen = Rubygame::Screen.new [640,480], 0, 
    [Rubygame::HWSURFACE, Rubygame::DOUBLEBUF]
        @screen.title = "Pong"

        @queue = Rubygame::EventQueue.new 
        @clock = Rubygame::Clock.new 
        @clock.target_framerate = 60 

        limit = @screen.height - 10 
        @player = Paddle.new 50, 10, Rubygame::K_W, Rubygame::K_S, 10, limit  
        @enemy = Paddle.new @screen.width-50-@player.width, 10, 
Rubygame::K_UP, Rubygame::K_DOWN, 10, limit 
        @player.center_y @screen.height 
        @enemy.center_y @screen.height
        @ball = Ball.new @screen.width/2, @screen.height/2 

        @background = Background.new @screen.width, @screen.height 
    end

    def run! 
        loop do 
            update 
            draw 
            @clock.tick 
        end 
    end  

    def update 
        @player.update 
        @enemy.update
        @ball.update @screen 

        @queue.each do |ev|
            @player.handle_event ev
            @enemy.handle_event ev
            case ev 
                when Rubygame::QuitEvent 
                    Rubygame.quit 
                    exit 
                when Rubygame::KeyDownEvent
                    if ev.key==Rubygame::K_ESCAPE
                        @queue.push Rubygame::QuitEvent.new
                    end 
            end   
        end
        if collision? @ball, @player 
            @ball.collision @player, @ball 
        elsif collision? @ball, @enemy 
            @ball.collision @enemy, @ball 
        end                 
    end   

    def draw 
        @screen.fill [0,0,0]

        @background.draw @screen 
        @player.draw @screen 
        @enemy.draw @screen
        @ball.draw @screen  

        @screen.flip
    end 

    def collision? obj1, obj2
            if obj1.y + obj1.height < obj2.y ; return false ; end 
            if obj1.y > obj2.y + obj2.height ; return false ; end 
            if obj1.x + obj1.width < obj2.x ; return false ; end 
            if obj1.x > obj2.x + obj2.width ; return false ; end 
            return true 
    end 
end 

class GameObject 
    attr_accessor :x, :y, :width, :height, :surface

    def initialize x, y, surface 
        @x = x
        @y = y
        @surface = surface
        @width = surface.width 
        @height = surface.height
    end

    def update 
    end 

    def draw screen 
        @surface.blit screen, [@x, @y]
    end 

    def handle_event event 
    end 
end 

class Paddle < GameObject
    def initialize x,y,up_key,down_key,top_limit,bottom_limit 
        surface = Rubygame::Surface.new [20, 100]
        surface.fill [255, 255, 255]
        @up_key = up_key 
        @down_key = down_key 
        @moving_up = false 
        @moving_down = false
        @top_limit = top_limit 
        @bottom_limit = bottom_limit 
        super x, y, surface
    end 

    def center_y h
        @y = h/2-@height/2
    end     

    def handle_event event 
        case event 
            when Rubygame::KeyDownEvent
                if event.key==@up_key 
                    @moving_up = true
                elsif event.key==@down_key 
                    @moving_down = true 
                end 
            when Rubygame::KeyUpEvent 
                if event.key==@up_key
                    @moving_up = false 
                elsif event.key==@down_key
                    @moving_down = false 
                end 
        end 
    end 

    def update 
        if @moving_up and @y > @top_limit
            @y -= 5
        end 
        if @moving_down and @y+@height < @bottom_limit 
            @y += 5
        end 
    end 
end  

class Background < GameObject
    def initialize width, height 
        surface = Rubygame::Surface.new [width, height]

        # Draw Background 
        white = [255, 255, 255]

        #Top
        surface.draw_box_s [0, 0], [surface.width, 10], white
        #Left 
        surface.draw_box_s [0, 0], [10, surface.height], white
        #Bottom 
        surface.draw_box_s [0, surface.height-10, 10], 
[surface.width, surface.height], white
        #Right 
        surface.draw_box_s [surface.width-10, 0], 
[surface.width, surface.height], white 
        #Middle Divide 
        surface.draw_box_s [surface.width/2-5, 0], 
[surface.width/2+5, surface.height], white

        super 0, 0, surface
    end 
end 


class Ball < GameObject
    def initialize x, y 
        surface = Rubygame::Surface.load('Ball.png')
        @vx = @vy = 5
        super x, y, surface 
    end 

    def update screen  
        @x += @vx
        @y += @vy 

        if @x <= 10 or @x+@width >= screen.width-10
            @vx *= -1 
        end 

        if @y <= 10 or @y+@height >= screen.height-10
            @vy *= -1 
        end 
    end

    def collision paddle, screen
        if paddle.x < screen.width/2 
            unless @x < paddle.x-5
                @x = paddle.x+paddle.width+1
                @vx *= -1 
            end 
        else 
            unless @x > paddle.x+5 
                @x = paddle.x-@width-1 
                @vx *= -1 
            end 
        end 
    end  
end

class Text < GameObject
    def initialize x=0, y=0, text="Hello, World!", size=40
        @font = Rubygame::TTF.new "font.ttf", size
        @text = textssssw
        super x, y, @font.render(@text, true, [255,255,255])
    end 
end 

g = Game.new 
g.run! `

0 个答案:

没有答案