![]() |
![]() |
|
Standard instructions for all homeworks:
Complete the short fill-in-the-blank questions on the D2L quiz hw04a
.
Your answers should be valid racket expressions.
Do be sure to answer what the question is asking.
Familiarize yourself with the arcade game Asteroids. We will write our own version, starting with this homework (structs) and finishing with next homework (lists). In our simplified version: We will write a simplified version which only needs to deal with: the ship, asteroids, and bullets. It does not need to deal with: score, number-of-lives, having more than one level, or enemy-ships.
There are three types of things (objects) which our program will need to model: ships, asteroids, and bullets.
In addition to this datatype-definition, give at least two example ship objects/structs (the design recipe's #2, “examples of the data”), and the template (the design recipe's #3).
hint: Thoughts/advice on fields below.
Create (in both racket and Java),
a function glide-ship which
takes in a ship, and returns
a ship one tick
of time later,
ignoring
any exterior factors like
asteroids or bullets or acceleration/key-presses.
Do account for wrapping around the screen;
you can (should) have a couple of named-constants
for the screen's height and width (perhaps 800x600 or so).
The Java and racket versions should both work in the same way: returning a new object, rather than mutating any fields (Cf. how we did enbiggen in both racket and java).
Note: This method has nothing to do with a gui or drawing. Updating the ship's fields is about the model, not the view. (Later we will write draw-ship below, though in racket-only.)
The following functions only need to be done in Racket (not Java).
Note: We will not be using struct-inheritance, so these functions might be very similar to each other. In other games, there are sometime very-different movement rules for the player, enemies, and bullets.
notes:
- The background passed in might be any image. For example you can test with
, which is exported from videogame-helpers.rkt as house-with-flowers.
- The library function place-image can be helpful.
- If the ship is entirely off the background, then it's reasonable to say it wouldn't be shown in the result (which is what place-image does, since it crops the result to the background).
notes:
- Playing the demo above, we see there are only four key-presses that actually do anything in the game. And firing, while it changes the overall world (adds a bullet), doesn't actually change the ship, so this function won't care about firing; we'll handle that next week, when we create an entire “world” struct..
- You can compare two key-event?s with string=?, but key=? (from (require 2htdp/universe)) is more appropriate. Equal credit will be awarded, either way.
- You might want to review notions of distance vs. velocity vs. acceleration; one explanation is at physicsclassroom.com.
- Note that a key-event does not move the player. Only clock-events (ticks) actually move the player; the key-events are instantaneous in the game-model.
Note: You are free to use the provided helper-function overlap? in videogame-helpers.rkt. It takes in any two rectangles; your ship-overlap-asteroid? can be a thin wrapper around overlap?. Then do similarly for the other collision-detections you need I ignore asteroids colliding with other asteroids, as well as a ship colliding with bullets (since that's friendly fire). I needed a total of three collision functions.
We still don't have a running game yet. This will entail processing lists of asteroids and lists of bullets. We'll deal with lists on the next homework (as an application of union and structure-types working together, rather than any new concept or syntax!). We will also have functions for (say) drawing an entire list of asteroids or list of bullets, as well as an overarching “game” struct which holds the various pieces of the games (one ship and two other lists.
When declaring fields, give them good (and perhaps short) names. Do remember to indicate their units (if appropriate), along with any other non-obvious info.
Many fields have multiple possible representations. For example, for a ship's direction you might use an angle what units? what does angle 0 mean?, or a pair of coordinates, or even those two coordinates further wrapped inside single field of type coordinate-point (if I defined my own new struct for that). These all have their strengths and weaknesses.
One thing guiding our choice might be the libraries that we want to interact with. In this case, we'll be using the 2htdp/image and 2htdp/universe, so I'll point out the following:
This page licensed CC-BY 4.0 Ian Barland Page last generated | Please mail any suggestions (incl. typos, broken links) to ibarland ![]() |