Пример #1
0
class Bricka:
	def __init__(self, driver_type = driverType, width = 320, height = 240):
		self.use_cellular_paddle = False
		self.use_cellular_brick = False
		self.font_height = 20
		self.back_color = SColor(255, 80, 80, 80)
		self.white = SColor(255, 255, 255, 255)
		self.brick_color = SColor(255, 200, 200, 0)
		self.ball_vel_default = position2di(2, -2)
		self.texture_paddle = None
		self.texture_brick = None
		self.help_dialog = None
		self.video_driver = None
		self.scene_manager = None
		self.gui_environment = None
		self.font_text = None
		self.font_chess = None
		self.skin = None
		p = SIrrlichtCreationParameters()
		p.DriverType = driverType
		p.WindowSize = dimension2du(width, height)
		p.AntiAlias = True
		p.WithAlphaChannel = True
		self.device = createDeviceEx(p)
		if self.device:
			self.device.setResizable(True)
			self.device.setWindowCaption('bricka (a breakout clone by codeNtronix.com)')
			self.video_driver = self.device.getVideoDriver()
			self.scene_manager = self.device.getSceneManager()
			self.gui_environment = self.device.getGUIEnvironment()
			# icon
			if is_frozen():
				self.video_driver.SetIcon(101)
			else:
				self.video_driver.SetIcon()
			# skin
			self.skin = self.gui_environment.getSkin()
			for i in range(EGDC_COUNT):
				col = self.skin.getColor(i)
				col.setAlpha(200)
				self.skin.setColor(i, col)
				if (i + 2) > EGDC_COUNT:
					break
			# font
			self.font = CGUITTFont(self.gui_environment, os.environ['SYSTEMROOT']+'/Fonts/arial.ttf', self.font_height)
			if self.font:
				self.skin.setFont(self.font)
			# add 3d ball
			#~ self.ball3d = self.scene_manager.addSphereSceneNode(float(BALL_DIAMETER))
			# add camera for 3d view
			self.camera = self.scene_manager.addCameraSceneNode(position = vector3df(0,0,-400))
			#~ self.camera = self.scene_manager.addCameraSceneNodeMaya(distance = 400)
			# initialize first level
			self.init_game()

	def offset_x(self, rect, value):
		rect.UpperLeftCorner.X += value
		rect.LowerRightCorner.X += value

	def offset_y(self, rect, value):
		rect.UpperLeftCorner.Y += value
		rect.LowerRightCorner.Y += value

	def offset(self, rect, x, y):
		self.offset_x(rect, x)
		self.offset_y(rect, y)

	def set_ball_x(self, value):
		self.ball.UpperLeftCorner.X = value
		self.ball.LowerRightCorner.X = value + BALL_DIAMETER

	def set_ball_y(self, value):
		self.ball.UpperLeftCorner.Y = value
		self.ball.LowerRightCorner.Y = value + BALL_DIAMETER

	def set_paddle_x(self, value):
		self.paddle.UpperLeftCorner.X = value
		self.paddle.LowerRightCorner.X = value + self.paddle_width

	def set_paddle_y(self, value):
		self.paddle.UpperLeftCorner.Y = value
		self.paddle.LowerRightCorner.Y = value + self.paddle_height

	def init_game(self):
		screen_size = self.video_driver.getScreenSize()
		self.brick_width = abs(screen_size.X / 11)
		self.brick_height = abs(screen_size.X / 32)
		self.paddle_width = 60
		self.paddle_height = 12
		self.max_paddle_x = screen_size.X - self.paddle_width
		self.max_ball_x = screen_size.X - BALL_DIAMETER
		self.max_ball_y = screen_size.Y - BALL_DIAMETER
		# Paddle X,Y coordinate
		self.paddle_x = (screen_size.X - self.paddle_width) / 2
		self.paddle_y = screen_size.Y - self.paddle_height - 10
		# ball X,Y coordinate
		self.ball_x = self.paddle_x
		self.ball_y = self.paddle_y - BALL_DIAMETER
		self.lives = 3
		self.score = 0
		self.state = STATE_BALL_IN_PADDLE
		self.paddle = recti(self.paddle_x, self.paddle_y, self.paddle_x + self.paddle_width, self.paddle_y + self.paddle_height)
		self.ball = recti(self.ball_x, self.ball_y, self.ball_x + BALL_DIAMETER, self.ball_y + BALL_DIAMETER)
		self.ball_vel = self.ball_vel_default
		#~ self.ball3d.setPosition(vector3df(self.ball_x, self.ball_y, 0))
		# cellular texture generator
		self.cell_paddle = Cellular(self.video_driver, self.paddle_width, self.paddle_height, 128)
		self.cell_brick = Cellular(self.video_driver, self.brick_width, self.brick_height, 128)
		if not self.texture_paddle:
			self.texture_paddle = self.cell_paddle.get_texture()
		else:
			self.texture_paddle = self.cell_paddle.get_new_texture(cellSize = 8, density = 4.0, rand_range_count = 25)
		if not self.texture_brick:
			self.texture_brick = self.cell_brick.get_texture()
		else:
			self.texture_brick = self.cell_brick.get_new_texture(mFact = .5, lPower = .5)
		self.create_bricks()

	def show_stats(self):
		if self.font:
			text = 'SCORE: %d    LIVES: %d' % (self.score, self.lives)
			screen_size = self.video_driver.getScreenSize()
			text_dimension = self.font.getDimension(text)
			self.font.draw(text, recti((screen_size.X - text_dimension.Width) / 2, 5, text_dimension.Width, self.font_height), self.white)

	def show_message(self, message):
		if self.font:
			screen_size = self.video_driver.getScreenSize()
			delta_y = 0
			for text in message:
				text_dimension = self.font.getDimension(text)
				self.font.draw(text, recti((screen_size.X - text_dimension.Width) / 2, screen_size.Y / 2 + delta_y, text_dimension.Width, (screen_size.Y - text_dimension.Height) / 2 + delta_y), self.white)
				delta_y += text_dimension.Height

	def create_bricks(self):
		screen_size = self.video_driver.getScreenSize()
		x_delta = self.brick_width + 10
		count_rows = abs(screen_size.Y / 68)
		count_columns = abs(screen_size.X / x_delta - 1)
		x1 = (screen_size.X - x_delta * count_columns) / 2
		y_ofs = 35
		self.bricks = []
		for i in range(count_rows):
			x_ofs = x1
			for j in range(count_columns):
				self.bricks.append(recti(x_ofs, y_ofs, x_ofs + self.brick_width, y_ofs + self.brick_height))
				x_ofs += x_delta
			y_ofs += self.brick_height + 5

	def draw_bricks(self):
		for brick in self.bricks:
			if self.texture_brick and self.use_cellular_brick:
				self.video_driver.draw2DImage(self.texture_brick, brick.UpperLeftCorner)
			else:
				self.video_driver.draw2DRectangle(self.brick_color, brick)

	def move_ball(self):
		self.offset(self.ball, self.ball_vel.X, self.ball_vel.Y)
		if self.ball.UpperLeftCorner.X <= 0:
			self.set_ball_x(0)
			self.ball_vel.X = -self.ball_vel.X
		elif self.ball.UpperLeftCorner.X >= self.max_ball_x:
			self.set_ball_x(self.max_ball_x)
			self.ball_vel.X = -self.ball_vel.X
		if self.ball.UpperLeftCorner.Y < 0:
			self.set_ball_y(0)
			self.ball_vel.Y = -self.ball_vel.Y
		elif self.ball.UpperLeftCorner.Y >= self.max_ball_y:            
			self.set_ball_y(self.max_ball_y)
			self.ball_vel.Y = -self.ball_vel.Y

	def handle_collisions(self):
		result = None
		for brick in self.bricks:
			if self.ball.isRectCollided(brick):
				self.score += 3
				self.ball_vel.Y = -self.ball_vel.Y
				self.bricks.remove(brick)
				result = brick
				break
		if len(self.bricks) == 0:
			self.state = STATE_WON
		if self.ball.isRectCollided(self.paddle):
			self.set_ball_y(self.paddle_y - BALL_DIAMETER)
			self.ball_vel.Y = -self.ball_vel.Y
		elif self.ball.UpperLeftCorner.Y > self.paddle.UpperLeftCorner.Y:
			self.lives -= 1
			if self.lives > 0:
				self.state = STATE_BALL_IN_PADDLE
			else:
				self.state = STATE_GAME_OVER
		return result

	def run(self):
		destroyed_brick = None
		destroyed_color1 = SColor(255, 0, 255, 0)
		destroyed_color2 = SColor(255, 255, 255, 0)
		destroyed_color3 = SColor(255, 0, 0, 255)
		destroyed_color4 = SColor(255, 255, 0, 0)
		color_red = SColor(255, 200, 0, 0)
		color_yellow = SColor(255, 200, 200, 0)
		color_green = SColor(255, 0, 200, 0)
		color_blue = SColor(255, 0, 0, 200)
		i_event_receiver = event_receiver()
		i_event_receiver.game = self
		self.device.setEventReceiver(i_event_receiver)
		self.device.getTimer().setSpeed(10.0)
		while self.device.run():
			if self.device.isWindowActive():
				if i_event_receiver.stop:
					break
				if self.video_driver.beginScene(True, True, self.back_color):
					if self.state == STATE_PLAYING:
						if not self.help_dialog:
							if self.device.getTimer().getTime() > 100:
								self.move_ball()
								self.device.getTimer().setTime(0)
							pos = self.handle_collisions()
							if pos:
								destroyed_brick = pos
							if destroyed_brick:
								if self.use_cellular_brick:
									self.video_driver.draw2DRectangle(destroyed_color1, destroyed_brick)
								else:
									self.video_driver.draw2DRectangle(destroyed_brick, destroyed_color1, destroyed_color2, destroyed_color3, destroyed_color4)
									destroyed_color2.a = destroyed_color2.a - 25
									destroyed_color3.a = destroyed_color3.a - 25
									destroyed_color4.a = destroyed_color4.a - 25
								destroyed_color1.a = destroyed_color1.a - 25
								if destroyed_color1.a < 50:
									destroyed_brick = None
									destroyed_color1.a = 255
									if not self.use_cellular_brick:
										destroyed_color2.a = 255
										destroyed_color3.a = 255
										destroyed_color4.a = 255
					elif self.state == STATE_BALL_IN_PADDLE:
						self.set_ball_x(self.paddle.UpperLeftCorner.X + self.paddle.getWidth() / 2)
						self.set_ball_y(self.paddle.UpperLeftCorner.Y - self.ball.getHeight())
						self.show_message(('PRESS SPACE', 'TO LAUNCH THE BALL', 'F1 - help, ESC - exit'))
					elif self.state == STATE_GAME_OVER:
						self.show_message(('GAME OVER', 'PRESS ENTER TO PLAY AGAIN'))
					elif self.state == STATE_WON:
						self.show_message(('YOU WON!', 'PRESS ENTER TO PLAY AGAIN'))
					self.draw_bricks()
					# Draw paddle
					if self.texture_paddle and self.use_cellular_paddle:
						self.video_driver.draw2DImage(self.texture_paddle, self.paddle.UpperLeftCorner)
					else:
						self.video_driver.draw2DRectangle(self.paddle, color_yellow, color_red, color_green, color_blue)
					# Draw ball
					#~ self.video_driver.draw2DRectangle(self.white, self.ball)
					x1, y1 = self.ball.UpperLeftCorner.get_XY()
					x2, y2 = self.ball.LowerRightCorner.get_XY()
					self.video_driver.draw2DPolygon(recti(x1 + ball_delta, y1 + ball_delta, x2 + ball_delta, y2 + ball_delta), BALL_RADIUS, self.white)
					#~ ball_draw = self.ball + ball_delta
					#~ self.video_driver.draw2DPolygon(ball_draw, BALL_RADIUS, self.white)
					#~ self.ball3d.setPosition(vector3df(x1 + ball_delta, y1 + ball_delta, 0))
					#~ self.scene_manager.drawAll()
					self.show_stats()
					if self.help_dialog:
						self.gui_environment.drawAll()
					self.video_driver.endScene()
				self.device.sleep(1)
			else:
				self.device._yield()
		self.device.closeDevice()
		self.device.drop()
Пример #2
0
class Bricka:
    def __init__(self, driver_type=driverType, width=320, height=240):
        self.use_cellular_paddle = False
        self.use_cellular_brick = False
        self.font_height = 20
        self.back_color = SColor(255, 80, 80, 80)
        self.white = SColor(255, 255, 255, 255)
        self.brick_color = SColor(255, 200, 200, 0)
        self.ball_vel_default = position2di(2, -2)
        self.texture_paddle = None
        self.texture_brick = None
        self.help_dialog = None
        self.video_driver = None
        self.scene_manager = None
        self.gui_environment = None
        self.font_text = None
        self.font_chess = None
        self.skin = None
        p = SIrrlichtCreationParameters()
        p.DriverType = driverType
        p.WindowSize = dimension2du(width, height)
        p.AntiAlias = True
        p.WithAlphaChannel = True
        self.device = createDeviceEx(p)
        if self.device:
            self.device.setResizable(True)
            self.device.setWindowCaption(
                'bricka (a breakout clone by codeNtronix.com)')
            self.video_driver = self.device.getVideoDriver()
            self.scene_manager = self.device.getSceneManager()
            self.gui_environment = self.device.getGUIEnvironment()
            # icon
            if is_frozen():
                self.video_driver.SetIcon(101)
            else:
                self.video_driver.SetIcon()
            # skin
            self.skin = self.gui_environment.getSkin()
            for i in range(EGDC_COUNT):
                col = self.skin.getColor(i)
                col.setAlpha(200)
                self.skin.setColor(i, col)
                if (i + 2) > EGDC_COUNT:
                    break
            # font
            self.font = CGUITTFont(
                self.gui_environment,
                os.environ['SYSTEMROOT'] + '/Fonts/arial.ttf',
                self.font_height)
            if self.font:
                self.skin.setFont(self.font)
            # add 3d ball
            #~ self.ball3d = self.scene_manager.addSphereSceneNode(float(BALL_DIAMETER))
            # add camera for 3d view
            self.camera = self.scene_manager.addCameraSceneNode(
                position=vector3df(0, 0, -400))
            #~ self.camera = self.scene_manager.addCameraSceneNodeMaya(distance = 400)
            # initialize first level
            self.init_game()

    def offset_x(self, rect, value):
        rect.UpperLeftCorner.X += value
        rect.LowerRightCorner.X += value

    def offset_y(self, rect, value):
        rect.UpperLeftCorner.Y += value
        rect.LowerRightCorner.Y += value

    def offset(self, rect, x, y):
        self.offset_x(rect, x)
        self.offset_y(rect, y)

    def set_ball_x(self, value):
        self.ball.UpperLeftCorner.X = value
        self.ball.LowerRightCorner.X = value + BALL_DIAMETER

    def set_ball_y(self, value):
        self.ball.UpperLeftCorner.Y = value
        self.ball.LowerRightCorner.Y = value + BALL_DIAMETER

    def set_paddle_x(self, value):
        self.paddle.UpperLeftCorner.X = value
        self.paddle.LowerRightCorner.X = value + self.paddle_width

    def set_paddle_y(self, value):
        self.paddle.UpperLeftCorner.Y = value
        self.paddle.LowerRightCorner.Y = value + self.paddle_height

    def init_game(self):
        screen_size = self.video_driver.getScreenSize()
        self.brick_width = abs(screen_size.X / 11)
        self.brick_height = abs(screen_size.X / 32)
        self.paddle_width = 60
        self.paddle_height = 12
        self.max_paddle_x = screen_size.X - self.paddle_width
        self.max_ball_x = screen_size.X - BALL_DIAMETER
        self.max_ball_y = screen_size.Y - BALL_DIAMETER
        # Paddle X,Y coordinate
        self.paddle_x = (screen_size.X - self.paddle_width) / 2
        self.paddle_y = screen_size.Y - self.paddle_height - 10
        # ball X,Y coordinate
        self.ball_x = self.paddle_x
        self.ball_y = self.paddle_y - BALL_DIAMETER
        self.lives = 3
        self.score = 0
        self.state = STATE_BALL_IN_PADDLE
        self.paddle = recti(self.paddle_x, self.paddle_y,
                            self.paddle_x + self.paddle_width,
                            self.paddle_y + self.paddle_height)
        self.ball = recti(self.ball_x, self.ball_y,
                          self.ball_x + BALL_DIAMETER,
                          self.ball_y + BALL_DIAMETER)
        self.ball_vel = self.ball_vel_default
        #~ self.ball3d.setPosition(vector3df(self.ball_x, self.ball_y, 0))
        # cellular texture generator
        self.cell_paddle = Cellular(self.video_driver, self.paddle_width,
                                    self.paddle_height, 128)
        self.cell_brick = Cellular(self.video_driver, self.brick_width,
                                   self.brick_height, 128)
        if not self.texture_paddle:
            self.texture_paddle = self.cell_paddle.get_texture()
        else:
            self.texture_paddle = self.cell_paddle.get_new_texture(
                cellSize=8, density=4.0, rand_range_count=25)
        if not self.texture_brick:
            self.texture_brick = self.cell_brick.get_texture()
        else:
            self.texture_brick = self.cell_brick.get_new_texture(mFact=.5,
                                                                 lPower=.5)
        self.create_bricks()

    def show_stats(self):
        if self.font:
            text = 'SCORE: %d    LIVES: %d' % (self.score, self.lives)
            screen_size = self.video_driver.getScreenSize()
            text_dimension = self.font.getDimension(text)
            self.font.draw(
                text,
                recti((screen_size.X - text_dimension.Width) / 2, 5,
                      text_dimension.Width, self.font_height), self.white)

    def show_message(self, message):
        if self.font:
            screen_size = self.video_driver.getScreenSize()
            delta_y = 0
            for text in message:
                text_dimension = self.font.getDimension(text)
                self.font.draw(
                    text,
                    recti(
                        (screen_size.X - text_dimension.Width) / 2,
                        screen_size.Y / 2 + delta_y, text_dimension.Width,
                        (screen_size.Y - text_dimension.Height) / 2 + delta_y),
                    self.white)
                delta_y += text_dimension.Height

    def create_bricks(self):
        screen_size = self.video_driver.getScreenSize()
        x_delta = self.brick_width + 10
        count_rows = abs(screen_size.Y / 68)
        count_columns = abs(screen_size.X / x_delta - 1)
        x1 = (screen_size.X - x_delta * count_columns) / 2
        y_ofs = 35
        self.bricks = []
        for i in range(count_rows):
            x_ofs = x1
            for j in range(count_columns):
                self.bricks.append(
                    recti(x_ofs, y_ofs, x_ofs + self.brick_width,
                          y_ofs + self.brick_height))
                x_ofs += x_delta
            y_ofs += self.brick_height + 5

    def draw_bricks(self):
        for brick in self.bricks:
            if self.texture_brick and self.use_cellular_brick:
                self.video_driver.draw2DImage(self.texture_brick,
                                              brick.UpperLeftCorner)
            else:
                self.video_driver.draw2DRectangle(self.brick_color, brick)

    def move_ball(self):
        self.offset(self.ball, self.ball_vel.X, self.ball_vel.Y)
        if self.ball.UpperLeftCorner.X <= 0:
            self.set_ball_x(0)
            self.ball_vel.X = -self.ball_vel.X
        elif self.ball.UpperLeftCorner.X >= self.max_ball_x:
            self.set_ball_x(self.max_ball_x)
            self.ball_vel.X = -self.ball_vel.X
        if self.ball.UpperLeftCorner.Y < 0:
            self.set_ball_y(0)
            self.ball_vel.Y = -self.ball_vel.Y
        elif self.ball.UpperLeftCorner.Y >= self.max_ball_y:
            self.set_ball_y(self.max_ball_y)
            self.ball_vel.Y = -self.ball_vel.Y

    def handle_collisions(self):
        result = None
        for brick in self.bricks:
            if self.ball.isRectCollided(brick):
                self.score += 3
                self.ball_vel.Y = -self.ball_vel.Y
                self.bricks.remove(brick)
                result = brick
                break
        if len(self.bricks) == 0:
            self.state = STATE_WON
        if self.ball.isRectCollided(self.paddle):
            self.set_ball_y(self.paddle_y - BALL_DIAMETER)
            self.ball_vel.Y = -self.ball_vel.Y
        elif self.ball.UpperLeftCorner.Y > self.paddle.UpperLeftCorner.Y:
            self.lives -= 1
            if self.lives > 0:
                self.state = STATE_BALL_IN_PADDLE
            else:
                self.state = STATE_GAME_OVER
        return result

    def run(self):
        destroyed_brick = None
        destroyed_color1 = SColor(255, 0, 255, 0)
        destroyed_color2 = SColor(255, 255, 255, 0)
        destroyed_color3 = SColor(255, 0, 0, 255)
        destroyed_color4 = SColor(255, 255, 0, 0)
        color_red = SColor(255, 200, 0, 0)
        color_yellow = SColor(255, 200, 200, 0)
        color_green = SColor(255, 0, 200, 0)
        color_blue = SColor(255, 0, 0, 200)
        i_event_receiver = event_receiver()
        i_event_receiver.game = self
        self.device.setEventReceiver(i_event_receiver)
        self.device.getTimer().setSpeed(10.0)
        while self.device.run():
            if self.device.isWindowActive():
                if i_event_receiver.stop:
                    break
                if self.video_driver.beginScene(True, True, self.back_color):
                    if self.state == STATE_PLAYING:
                        if not self.help_dialog:
                            if self.device.getTimer().getTime() > 100:
                                self.move_ball()
                                self.device.getTimer().setTime(0)
                            pos = self.handle_collisions()
                            if pos:
                                destroyed_brick = pos
                            if destroyed_brick:
                                if self.use_cellular_brick:
                                    self.video_driver.draw2DRectangle(
                                        destroyed_color1, destroyed_brick)
                                else:
                                    self.video_driver.draw2DRectangle(
                                        destroyed_brick, destroyed_color1,
                                        destroyed_color2, destroyed_color3,
                                        destroyed_color4)
                                    destroyed_color2.a = destroyed_color2.a - 25
                                    destroyed_color3.a = destroyed_color3.a - 25
                                    destroyed_color4.a = destroyed_color4.a - 25
                                destroyed_color1.a = destroyed_color1.a - 25
                                if destroyed_color1.a < 50:
                                    destroyed_brick = None
                                    destroyed_color1.a = 255
                                    if not self.use_cellular_brick:
                                        destroyed_color2.a = 255
                                        destroyed_color3.a = 255
                                        destroyed_color4.a = 255
                    elif self.state == STATE_BALL_IN_PADDLE:
                        self.set_ball_x(self.paddle.UpperLeftCorner.X +
                                        self.paddle.getWidth() / 2)
                        self.set_ball_y(self.paddle.UpperLeftCorner.Y -
                                        self.ball.getHeight())
                        self.show_message(('PRESS SPACE', 'TO LAUNCH THE BALL',
                                           'F1 - help, ESC - exit'))
                    elif self.state == STATE_GAME_OVER:
                        self.show_message(
                            ('GAME OVER', 'PRESS ENTER TO PLAY AGAIN'))
                    elif self.state == STATE_WON:
                        self.show_message(
                            ('YOU WON!', 'PRESS ENTER TO PLAY AGAIN'))
                    self.draw_bricks()
                    # Draw paddle
                    if self.texture_paddle and self.use_cellular_paddle:
                        self.video_driver.draw2DImage(
                            self.texture_paddle, self.paddle.UpperLeftCorner)
                    else:
                        self.video_driver.draw2DRectangle(
                            self.paddle, color_yellow, color_red, color_green,
                            color_blue)
                    # Draw ball
                    #~ self.video_driver.draw2DRectangle(self.white, self.ball)
                    x1, y1 = self.ball.UpperLeftCorner.get_XY()
                    x2, y2 = self.ball.LowerRightCorner.get_XY()
                    self.video_driver.draw2DPolygon(
                        recti(x1 + ball_delta, y1 + ball_delta,
                              x2 + ball_delta, y2 + ball_delta), BALL_RADIUS,
                        self.white)
                    #~ ball_draw = self.ball + ball_delta
                    #~ self.video_driver.draw2DPolygon(ball_draw, BALL_RADIUS, self.white)
                    #~ self.ball3d.setPosition(vector3df(x1 + ball_delta, y1 + ball_delta, 0))
                    #~ self.scene_manager.drawAll()
                    self.show_stats()
                    if self.help_dialog:
                        self.gui_environment.drawAll()
                    self.video_driver.endScene()
                self.device.sleep(1)
            else:
                self.device._yield()
        self.device.closeDevice()
        self.device.drop()