Skip to content

Commit

Permalink
Major Bug fix (Scales and camera)
Browse files Browse the repository at this point in the history
Removed unnecessary scaling factors in calculations. To achieve the same visual scale, I changed the default star_img_scale to 5000 ,img_scale to 100000 and distance scale to 100.

Bug fix: the position of new object when camera pos != (0,0)  used to be wrong due to the aforementioned scaling factors. The problem is now fixed.
  • Loading branch information
alvinng4 committed Jan 17, 2024
1 parent ed10a27 commit 4d246b4
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 38 deletions.
16 changes: 8 additions & 8 deletions gravity_sim/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,16 +61,18 @@ def _check_events(self):
if event.button == 3: # right click
self.stats.start_holding_rclick()
self.new_obj_mouse_pos = mouse_pos
self.new_obj_camera_pos_x = self.camera.pos_x
self.new_obj_camera_pos_y = self.camera.pos_y
elif self.menu.menu_active == True:
if event.button == 1: # left click
self.menu.check_button(self, mouse_pos)
case pygame.MOUSEBUTTONUP:
if self.stats.is_holding_rclick == True:
if event.button == 3:
self.stats.end_holding_rclick()
Grav_obj.create_star(self, self.new_obj_mouse_pos)
Grav_obj.create_star(self, self.new_obj_mouse_pos, self.new_obj_camera_pos_x, self.new_obj_camera_pos_y)
case pygame.MOUSEWHEEL:
self.settings.distance_scale += 0.1 * event.y
self.settings.distance_scale += 10 * event.y
case pygame.QUIT:
sys.exit()

Expand Down Expand Up @@ -142,7 +144,7 @@ def _read_command_line_arg(self):
"--img_scale",
"-i",
nargs=2,
default=[20, 400],
default=[5000, 100000],
type=float,
help="Usage: --img_scale <solar image scale>, <obj image scale>",
)
Expand All @@ -163,14 +165,12 @@ def _new_obj_draw_line_circle(self):
R = Grav_obj.SOLAR_RADIUS * (m ** (1.0 / 3.0))
img_R = (
R
* 0.25
* (699.0 / 894.0) # Sun size in the img with size (894 x 894)
* self.settings.star_img_scale
* self.settings.screen_height
* 699.0
/ 894.0
)
new_obj_circle_pos = [self.new_obj_mouse_pos[0] + self.new_obj_camera_pos_x - self.camera.pos_x, self.new_obj_mouse_pos[1] + self.new_obj_camera_pos_y - self.camera.pos_y]
pygame.draw.circle(
self.screen, "orange", self.new_obj_mouse_pos, img_R, width=1
self.screen, "orange", new_obj_circle_pos, img_R, width=1
)


Expand Down
26 changes: 5 additions & 21 deletions gravity_sim/grav_obj.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,12 @@ def __init__(
if name == "Sun":
self.img_diameter = (
self.diameter
* 0.25
* self.settings.star_img_scale
* self.settings.screen_height
)
else:
self.img_diameter = (
self.diameter
* 0.25
* self.settings.img_scale
* self.settings.screen_height
)

# Note: apparent_scale = real_scale * img_scale
Expand All @@ -64,21 +60,17 @@ def update(self):
"""Update the apparent position of all grav_objs with camera"""
self.rect.center = (
self.params["r1"]
* 0.25
* self.settings.distance_scale
* self.settings.screen_height
+ self.screen_rect.centerx
- self.camera.pos_x,
-self.params["r2"]
* 0.25
* self.settings.distance_scale
* self.settings.screen_height
+ self.screen_rect.centery
- self.camera.pos_y,
)

@classmethod
def create_star(self, grav_sim, mouse_pos):
def create_star(self, grav_sim, mouse_pos, camera_pos_x, camera_pos_y):
main_dir_path = os.path.dirname(__file__)
path_sun = os.path.join(main_dir_path, "images/sun.png")
m = 1 * 0.5 * grav_sim.stats.holding_rclick_time
Expand All @@ -89,23 +81,15 @@ def create_star(self, grav_sim, mouse_pos):
"r1": (
mouse_pos[0]
- grav_sim.screen.get_rect().centerx
- grav_sim.camera.pos_x
+ camera_pos_x
)
/ (
grav_sim.settings.distance_scale
* 0.25
* grav_sim.settings.screen_height
),
/ grav_sim.settings.distance_scale,
"r2": -(
mouse_pos[1]
- grav_sim.screen.get_rect().centery
- grav_sim.camera.pos_y
+ camera_pos_y
)
/ (
grav_sim.settings.distance_scale
* 0.25
* grav_sim.settings.screen_height
),
/ grav_sim.settings.distance_scale,
"r3": 0.0,
"v1": 0.0,
"v2": 0.0,
Expand Down
18 changes: 9 additions & 9 deletions gravity_sim/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ def __init__(
screen_height,
star_img_scale,
img_scale,
time_speed: int = 1000,
dt: float = 0.01,
time_speed: int = 1,
dt: float = 0.1,
):
# To change the default settings of screen_width, screen_height, star_img_scale, img_scale, go to _read_command_line_arg function in __main__.py
self.screen_width = screen_width
Expand All @@ -19,7 +19,7 @@ def __init__(
self.grav_obj_color = (255, 255, 255)
self.star_img_scale = star_img_scale
self.img_scale = img_scale
self.distance_scale = 1
self.distance_scale = 100
self.time_speed = time_speed
self.dt = dt

Expand Down Expand Up @@ -68,8 +68,8 @@ def screen_height(self, value):
# Img may corrupt if the scale is too large.
@star_img_scale.setter
def star_img_scale(self, value):
if value > 100:
self._star_img_scale = 100
if value > 500000:
self._star_img_scale = 500000
elif value < 0:
self._star_img_scale = 0
else:
Expand All @@ -78,8 +78,8 @@ def star_img_scale(self, value):
# Img may corrupt if the scale is too large.
@img_scale.setter
def img_scale(self, value):
if value > 1000:
self._img_scale = 1000
if value > 5000000:
self._img_scale = 5000000
elif value < 0:
self._img_scale = 0
else:
Expand All @@ -89,8 +89,8 @@ def img_scale(self, value):
def distance_scale(self, value):
if value > 1000:
self._distance_scale = 1000
elif value <= 0.1:
self._distance_scale = 0.1
elif value <= 0:
self._distance_scale = 0
else:
self._distance_scale = value

Expand Down

0 comments on commit 4d246b4

Please sign in to comment.