[gcompris: 32/111] intro_gravity: major rework of the activitiy code.
- From: Bruno Coudoin <bcoudoin src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gcompris: 32/111] intro_gravity: major rework of the activitiy code.
- Date: Wed, 3 Oct 2012 23:57:15 +0000 (UTC)
commit 891b887ac177ea11109da2bdc282ce54b22241d5
Author: Bruno Coudoin <bruno coudoin free fr>
Date: Tue Jun 19 01:38:06 2012 +0200
intro_gravity: major rework of the activitiy code.
Better scale bar
Better simulation
Removed useless graphic files.
src/intro_gravity-activity/intro_gravity.py | 451 ++++++++-----------
.../resources/intro_gravity/minus.png | Bin 1797 -> 0 bytes
.../resources/intro_gravity/neptune.png | Bin 66789 -> 22877 bytes
.../resources/intro_gravity/plus.png | Bin 1673 -> 0 bytes
.../resources/intro_gravity/saturn.png | Bin 24841 -> 17075 bytes
.../resources/intro_gravity/solar_system.svgz | Bin 496871 -> 0 bytes
.../resources/intro_gravity/tux_spaceship.png | Bin 21742 -> 6082 bytes
7 files changed, 190 insertions(+), 261 deletions(-)
---
diff --git a/src/intro_gravity-activity/intro_gravity.py b/src/intro_gravity-activity/intro_gravity.py
index 824f947..2e9b1f9 100644
--- a/src/intro_gravity-activity/intro_gravity.py
+++ b/src/intro_gravity-activity/intro_gravity.py
@@ -1,6 +1,6 @@
# gcompris - intro_gravity.py
#
-# Copyright (C) 2003, 2008 Bruno Coudoin
+# Copyright (C) 2012 Matilda Bernard and Bruno Coudoin
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -37,9 +37,9 @@ class Gcompris_intro_gravity:
# Save the gcomprisBoard, it defines everything we need
# to know from the core
self.gcomprisBoard = gcomprisBoard
- self.gcomprisBoard.level=1
- self.gcomprisBoard.sublevel=1
- self.gcomprisBoard.number_of_sublevel=1
+ self.gcomprisBoard.level = 1
+ self.gcomprisBoard.sublevel = 1
+ self.gcomprisBoard.number_of_sublevel = 1
self.gcomprisBoard.maxlevel = 4
# Needed to get key_press
@@ -50,51 +50,20 @@ class Gcompris_intro_gravity:
# Set the buttons we want in the bar
gcompris.bar_set(0)
-
-
- # Create our rootitem. We put each canvas item in it so at the end we
- # only have to kill it. The canvas deletes all the items it contains
- # automaticaly.
- self.rootitem = goocanvas.Group(parent =
- self.gcomprisBoard.canvas.get_root_item())
-
- #set initial background
- gcompris.set_background(self.gcomprisBoard.canvas.get_root_item(),"intro_gravity/solar_system.svgz")
-
-
- #Load the solar system image
- svghandle = gcompris.utils.load_svg("intro_gravity/solar_system.svgz")
- self.selection = goocanvas.Svg(
- parent = self.rootitem,
- svg_handle = svghandle,
- svg_id = "#selected"
- )
-
- #connect the selected label to the next screen
- self.selection.connect("button_press_event", self.set_level)
- gcompris.utils.item_focus_init(self.selection, None)
-
- self.text = goocanvas.Text(parent=self.rootitem,
- x = 400,
- y = 400,
- fill_color = "white",
- font = gcompris.skin.get_font("gcompris/title"),
- text = _("The Solar System"))
+ self.game()
def game(self):
- self.rootitem = goocanvas.Group(parent =
- self.gcomprisBoard.canvas.get_root_item())
+ self.game_completed = False
- gcompris.utils.item_focus_remove(self.selection, None)
- self.text.remove()
+ self.rootitem = goocanvas.Group(parent = self.gcomprisBoard.canvas.get_root_item())
goocanvas.Text(
parent = self.rootitem,
- x=400.0,
- y=100.0,
- text=_("Mass is directly proportional to gravitational force"),
+ x = gcompris.BOARD_WIDTH/2.0,
+ y = 50.0,
+ text = _("Mass is directly proportional to gravitational force"),
font = gcompris.skin.get_font("gcompris/subtitle"),
- fill_color="white",
+ fill_color = "white",
anchor = gtk.ANCHOR_CENTER,
alignment = pango.ALIGN_CENTER
)
@@ -103,31 +72,32 @@ class Gcompris_intro_gravity:
gcompris.set_background(self.gcomprisBoard.canvas.get_root_item(),
"intro_gravity/background.svg")
- #Load the tux_ship
- ship_instance = spaceship(self.rootitem,self.level,self.gcomprisBoard)
+ # Load planet on the left (saturn) and it's slider
+ planet_left = fixed_planet(self.rootitem,
+ 80, 200, "saturn.png")
+ slider(self.rootitem, 20, 200, planet_left)
- #Load planet on the left (saturn) and it's slider
- self.planet_left = fixed_planet(self.rootitem,ship_instance)
- self.planet_left.load_planet("saturn.png",45,160,1)
+ # Planet on right (neptune) and it's slider
+ planet_right = fixed_planet(self.rootitem,
+ 630, 200, "neptune.png")
+ slider(self.rootitem, 780, 200, planet_right)
-
- #Planet on right (neptune) and it's slider
- self.planet_right = fixed_planet(self.rootitem,ship_instance)
- self.planet_right.load_planet("neptune.png",660,165,2)
+ # Load the tux_ship
+ ship_instance = spaceship(self, self.rootitem,
+ gcompris.BOARD_WIDTH/2.0, 200,
+ self.gcomprisBoard.level,
+ planet_left,
+ planet_right)
def end(self):
# Remove the root item removes all the others inside it
self.rootitem.remove()
- self.set_level(1,2,3)
-
def ok(self):
- print("intro_gravity ok.")
-
+ pass
def repeat(self):
- print 'repeat'
-
+ pass
#mandatory but unused yet
def config_stop(self):
@@ -138,244 +108,203 @@ class Gcompris_intro_gravity:
print("intro_gravity config_start.")
def key_press(self, keyval, commit_str, preedit_str):
- utf8char = gtk.gdk.keyval_to_unicode(keyval)
- strn = u'%c' % utf8char
+ pass
def pause(self, pause):
# When the bonus is displayed, it call us first with pause(1) and then with pause(0)
# the game is won
- if pause == 0:
+ self.board_paused = pause
+ if pause == 0 and self.game_completed:
self.end()
+ self.game()
- def set_level(self,a,b,c):
- if self.gcomprisBoard.level == 1:
- self.level = 100
- elif self.gcomprisBoard.level == 2:
- self.level = 50
- elif self.gcomprisBoard.level == 3:
- self.level = 20
- elif self.gcomprisBoard.level == 4:
- self.level = 10
-
+ def set_level(self, level):
+ self.gcomprisBoard.level = level;
self.game()
def next_level(self):
- self.board_paused = 1
- gcompris.bonus.display(gcompris.bonus.WIN,gcompris.bonus.TUX)
- if self.gcomprisBoard.level > self.gcomprisBoard.maxlevel:
- self.gcomprisBoard.level = 1
- else:
- self.gcomprisBoard.level += 1
+ if self.gcomprisBoard.level <= self.gcomprisBoard.maxlevel:
+ self.gcomprisBoard.level += 1
def crash(self):
- self.board_paused = 1
- gcompris.bonus.display(gcompris.bonus.LOOSE,gcompris.bonus.TUX)
+ self.game_completed = True
+ gcompris.bonus.display(gcompris.bonus.LOOSE, gcompris.bonus.TUX)
+
+ def win(self):
+ self.game_completed = True
+ self.next_level()
+ gcompris.bonus.display(gcompris.bonus.WIN, gcompris.bonus.TUX)
class spaceship(Gcompris_intro_gravity):
- """Class for moving the spaceship"""
+ """Class representing the spaceship"""
- #load spaceship
- def __init__(self,rootitem,level,gcomprisBoard):
- self.gcomprisBoard = gcomprisBoard
+ # load spaceship
+ def __init__(self, game, rootitem, x, y, level,
+ planet_left, planet_right):
+ self.game = game
self.rootitem = rootitem
- pixbuf = gcompris.utils.load_pixmap("intro_gravity/tux_spaceship.png")
+ self.level = level
+
+ # This counts how much space travel the children did
+ # Let us determine a success case
+ self.trip_distance = 0
+
self.tux_spaceship = goocanvas.Image(
parent = self.rootitem,
- pixbuf = pixbuf,
- height = 45,
- width = 70,
- x = 375,
- y = 198)
-
- #declaring variables
- self.velocity = 0
- self.old_force = None
- self.count = 0
- self.planet_right_mass = self.planet_left_mass = 1000
- self.timer_on = False
- self.level = level
- self.true = 2
- self.initiate = 0
-
- def initiate_movement(self):
- if self.initiate == 0:
- self.force()
- self.initiate = 1
-
- #set the change in mass of planet on button press
- def get_mass(self,planet,planet_mass,click):
- if planet == 1:
- self.planet_left_mass = planet_mass
- else:
- self.planet_right_mass = planet_mass
-
- self.click = click
- self.timer() #initialize timer for game if not initialized
- self.initiate_movement()
-
- def move_spaceship(self,force,planet,planet_mass):
- x = self.tux_spaceship.get_bounds().x1
- position = x + self.velocity
- if position < 615 and position > 175:
- self.tux_spaceship.set_properties(x=position,y=198)
- self.check(force)
- else:
+ pixbuf = gcompris.utils.load_pixmap("intro_gravity/tux_spaceship.png"),
+ x = x,
+ y = y)
+ # Center it
+ bounds = self.tux_spaceship.get_bounds()
+ self.tux_spaceship.translate( (bounds.x2 - bounds.x1) / 2.0 * -1,
+ (bounds.y2 - bounds.y1) / 2.0 * -1)
+
+ self.planet_right = planet_right
+ self.planet_left = planet_left
+
+ # Set to true to stop the calculation
+ self.done = False
+ self.move = 0
+
+ gobject.timeout_add(30, self.calculate)
+
+ def calculate(self):
+ if self.done:
+ return False
+
+ (x, y) = self.rootitem.get_canvas().\
+ convert_from_item_space( self.tux_spaceship,
+ self.tux_spaceship.props.x,
+ self.tux_spaceship.props.y)
+ dist_planet_left = abs ( x - self.planet_left.x )
+ dist_planet_right = abs ( self.planet_right.x - x )
+ self.move += ( ( self.planet_right.scale / dist_planet_right**2 ) -
+ ( self.planet_left.scale / dist_planet_left**2 ) ) * 200.0
+ self.tux_spaceship.translate(self.move, 0)
+
+ # Manage the crash case
+ if x - self.planet_left.x < 10:
+ self.crash()
+ elif self.planet_right.x - x < 10:
self.crash()
- gobject.source_remove(self.t)
-
- def check(self,force):
- #incase of change in forces, change direction and velocity according to force
- if self.old_force != force:
- self.count = 0
- self.last_velocity = self.velocity
- if force == 'left':
- self.velocity = -1
- elif force == 'right':
- self.velocity = 1
- self.old_force = force
-
- #if forces from both planets are equal then velocity does not change
- elif force == 'equal':
- self.velocity = self.last_velocity
- self.old_force = 'equal'
-
- #if there is no change in force applied then increase velocity gradually
- elif self.old_force == force:
- self.true = 2
- self.count += 1
- if self.count == self.level or self.velocity == 0 or self.click == 1:
- self.true = 1
- self.count = 0
- self.click = 0
-
- gobject.timeout_add(30,self.force)
-
- #check force
- def force(self):
- if self.planet_right_mass == self.planet_left_mass:
- self.move_spaceship('equal',1,self.planet_left_mass)
-
- elif self.planet_right_mass > self.planet_left_mass:
- if self.true == 1:
- self.velocity +=1
- self.move_spaceship('right',2,self.planet_right_mass)
-
- else:
- if self.true == 1:
- self.velocity -=1
- self.move_spaceship('left',1,self.planet_left_mass)
-
- def timer(self):
- if self.timer_on == False:
- self.t = gobject.timeout_add(10000,self.next_level)
- self.timer_on = True
+ # Manage the success case
+ self.trip_distance += abs(self.move)
+ if self.trip_distance > 500 * self.level:
+ self.done = True
+ self.game.win()
+ return True
+
+ def crash(self):
+ self.done = True
+ print "Crash !!!"
+ self.game.crash()
class fixed_planet:
""" Fixed planets """
- def __init__(self,rootitem,ship_instance):
- self.ship_instance = ship_instance
+ def __init__(self, rootitem, x, y, planet_image):
self.rootitem = rootitem
-
- def load_planet(self,planet_image,x,y,planet):
- self.planet_ = planet
- image = "intro_gravity/"+planet_image
- pixbuf = gcompris.utils.load_pixmap(image)
+ self.scale = 0
+ self.x = x
+ self.y = y
self.planet = goocanvas.Image(
- parent = self.rootitem,
- pixbuf=pixbuf,
- height=120,
- width=120,
- x=x,
- y=y)
-
- if self.planet_ == 1:
- points_line = goocanvas.Points([(27,190),(27,270)])
- else:
- points_line = goocanvas.Points([(788,190),(788,270)])
-
- self.scale_slider= slider(self,points_line) #scale line
+ parent = rootitem,
+ pixbuf = gcompris.utils.load_pixmap("intro_gravity/"
+ + planet_image),
+ x = 0,
+ y = 0)
+
+ def set_scale(self, scale):
+ self.scale = scale
+ self.planet.set_transform(None)
+ # Center it
+ bounds = self.planet.get_bounds()
+ self.planet.scale(self.scale + 0.5, self.scale + 0.5)
+ (x, y) = self.rootitem.get_canvas().\
+ convert_to_item_space(\
+ self.planet,
+ self.x + ((bounds.x2 - bounds.x1) / 2.0 * -1) * self.scale + 0.5,
+ self.y + ((bounds.y2 - bounds.y1) / 2.0 * -1) * self.scale + 0.5)
+ self.planet.translate( x, y )
class slider:
""" class for scale slider"""
- #load the spaceship
- def __init__(self,planet_instance,points):
+ def __init__(self, rootitem, x, y, planet_instance):
self.planet_instance = planet_instance
+ self.height = 60
+ self.button_width = 20
+ self.x = x
+ self.y = y
+ self.rootitem = goocanvas.Group(parent = rootitem)
line = goocanvas.Polyline(
- parent = planet_instance.rootitem,
- points=points,
- stroke_color="grey",
- width=2.0)
- self.planet_mass = 1000
-
- #set points for sliding bar according to planet
- if planet_instance.planet_ == 1:
- points_bar = goocanvas.Points([(21,247),(33,247)])
- button_x = 9
- else:
- points_bar = goocanvas.Points([(782,247),(794,247)])
- button_x = 770
-
- self.sliding_bar(points_bar)
- self.decrease_button(button_x)
- self.increase_button(button_x)
-
- def increase_button(self,x):
- pixbuf = gcompris.utils.load_pixmap("/intro_gravity/plus.png")
- button = goocanvas.Image(
- parent = self.planet_instance.rootitem,
- pixbuf = pixbuf,
- x = x,
- y = 175
+ parent = self.rootitem,
+ points = goocanvas.Points( [(x, y + self.button_width / 2.0),
+ (x, y + self.button_width / 2.0 + self.height)] ),
+ stroke_color = "grey",
+ width = 2.0)
+
+ # This is the relative position of the scale from 0 to 1
+ # 0 is the bottom
+ self.scale_value = 0.5
+ slider_y = y + self.height / 2.0
+ self.sliding_bar( goocanvas.Points([(x - 5, slider_y),
+ (x + 5, slider_y)] ) )
+ self.button(self.x, self.y, self.button_width, '+', 0.1)
+ self.button(self.x, self.y + self.height, self.button_width, '-', -0.1)
+
+ self.planet_instance.set_scale( self.scale_value )
+
+ def button(self, x, y, size, text, move):
+ button = goocanvas.Rect(
+ parent = self.rootitem,
+ x = x - size / 2.0,
+ y = y - size / 2.0,
+ width = size,
+ height = size,
+ line_width = 1.0,
+ stroke_color_rgba= 0xCECECEFFL,
+ fill_color_rgba = 0x333333FFL,
+ radius_x = 15.0,
+ radius_y = 5.0,
)
+ gcompris.utils.item_focus_init(button, None)
- if self.planet_instance.planet_ == 1:
- translate_x = -8
- x_bar = 21
- else:
- translate_x = -63
- x_bar = 782
-
- button.connect("button_press_event",self.set_mass,1.1,translate_x,-20,500,1)
- button.connect("button_press_event",self.move_bar,x_bar,-8,1)
-
- def decrease_button(self,x):
- pixbuf = gcompris.utils.load_pixmap("intro_gravity/minus.png")
- button = goocanvas.Image(
- parent = self.planet_instance.rootitem,
- pixbuf = pixbuf,
+ text = goocanvas.Text(
+ parent = self.rootitem,
x = x,
- y = 250
+ y = y,
+ text = text,
+ font = gcompris.skin.get_font("gcompris/subtitle"),
+ fill_color = "white",
+ anchor = gtk.ANCHOR_CENTER,
+ alignment = pango.ALIGN_CENTER
)
- if self.planet_instance.planet_ == 1:
- translate_x = 10
- x_bar = 21
- else:
- translate_x = 78
- x_bar = 782
- button.connect("button_press_event",self.set_mass,0.9,translate_x,25,-500,2)
- button.connect("button_press_event",self.move_bar,x_bar,8,2)
-
- def sliding_bar(self,points):
+ gcompris.utils.item_focus_init(text, button)
+
+ button.connect("button_press_event", self.move_bar, move)
+ text.connect("button_press_event", self.move_bar, move)
+
+ def sliding_bar(self, points):
self.bar = goocanvas.Polyline(
- parent = self.planet_instance.rootitem,
- points=points,
- stroke_color="grey",
- line_width=5.0)
-
- def move_bar(self,a,b,c,x,y,button):
- y_old = self.bar.get_bounds().y1
- if (y_old > 207 and button ==1) or (y_old < 244 and button ==2):
- y_new = int(y_old + y)
- gcompris.utils.item_absolute_move(self.bar,x,y_new)
-
- def set_mass(self,a,b,c,scale,x,y,mass,button):
- if (self.planet_mass < 3500 and button ==1) or (self.planet_mass > 1000 and button ==2):
- self.planet_instance.planet.scale(scale,scale)
- self.planet_instance.planet.translate(x,y)
- self.planet_mass += mass
-
- self.planet_instance.ship_instance.get_mass(self.planet_instance.planet_,self.planet_mass,1)
+ parent = self.rootitem,
+ points = points,
+ stroke_color = "grey",
+ line_width = 5.0)
+
+ def move_bar(self, widget, target, event, move):
+ self.scale_value += move
+ # Take care not to bypass bounds
+ if self.scale_value > 1.0:
+ self.scale_value = 1.0
+ return
+ elif self.scale_value < 0.0:
+ self.scale_value = 0.0
+ return
+
+ self.bar.translate(0, move * -1 * self.height / 4.0);
+
+ # Change the planet mass
+ self.planet_instance.set_scale(self.scale_value)
diff --git a/src/intro_gravity-activity/resources/intro_gravity/neptune.png b/src/intro_gravity-activity/resources/intro_gravity/neptune.png
index 04413a1..cd9cab8 100644
Binary files a/src/intro_gravity-activity/resources/intro_gravity/neptune.png and b/src/intro_gravity-activity/resources/intro_gravity/neptune.png differ
diff --git a/src/intro_gravity-activity/resources/intro_gravity/saturn.png b/src/intro_gravity-activity/resources/intro_gravity/saturn.png
index 6606fdd..fb30819 100644
Binary files a/src/intro_gravity-activity/resources/intro_gravity/saturn.png and b/src/intro_gravity-activity/resources/intro_gravity/saturn.png differ
diff --git a/src/intro_gravity-activity/resources/intro_gravity/tux_spaceship.png b/src/intro_gravity-activity/resources/intro_gravity/tux_spaceship.png
index 1b27df1..fdd73db 100644
Binary files a/src/intro_gravity-activity/resources/intro_gravity/tux_spaceship.png and b/src/intro_gravity-activity/resources/intro_gravity/tux_spaceship.png differ
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]