SlideShare a Scribd company logo
Need help with questions 2-4. Write assembly code to find absolute values of a data word (2 byte
word) stored at address $0200 and write the absolute value at $0300. Two 16-bit signed values
are stored at $0A00 (they each take 2 bytes). Please write assembly code to sort them in
descending order (so that $0A02 has the smallest, and $0A00 has the largest). Could you sort the
same way for 50 such words? Write a piece of Assembly code to (a) allocate a string named
message to contain good day! (all the underlined characters) at location $0F00; (b) How many
bytes would it need?; (c) The rest of the code you write should compare the contents in register
A with each character in this message. If a match is found, put the NULL character in register A,
and get register B to contain the character G (ascii value). Write HCS12 assembly code to do the
following. Using ORG and DC.W directives declare and initialize a data array of 8 words (1
word = 1 integer in I ICS 12 - 2 bytes) starting at address S0200. Their initial values are to be
A367, F238,0012, 1972, 1132, AB88, 7399, and 1864. You can name the array EightInts (see
class notes or text examples). Now start your program code at $4000 (ORG directive).
Configure the direction of port A, port B, and port H to be inputs (i.e. set data directional
registers). We are going to consider port A as the high byte, and port B as low byte of data words
we want to read and compare against eighties using a loop. The idea is to see whether port A and
port B values taken as a 2 byte integer is equal to any of the values in eightins. Before starting to
compare values, the program waits until port H is all 1's then it reads port A, and port B before
comparing against eighties. if a match is found, your program branches to label found and stay at
that instruction. If no match, the program should branch to no luck label and stay there.
Solution
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.util.*;
//Primary class for the game
public class Asteroids extends Applet implements Runnable, KeyListener{
/**
*
*/
private static final long serialVersionUID = 1L;
//the main thread becomes the game loop
Thread gameloop;
//use this as a double buffer
BufferedImage backbuffer;
//the main drawing object for the back buffer
Graphics2D g2d;
//toggle for drawing bounding boxes
boolean showBounds = false;
//create the asteroid array
int ASTEROIDS = 20;
Asteroid[] ast = new Asteroid[ASTEROIDS];
//create the bullet array
int BULLETS = 10;
Bullet[] bullet = new Bullet[BULLETS];
int currentBullet = 0;
//the player's ship
Ship ship = new Ship();
//create the identity transform (0.0)
AffineTransform identity = new AffineTransform();
//create a random number generator
Random rand = new Random();
//applet init event
public void init(){
//create the back buffer for smooth graphics
backbuffer = new BufferedImage(640, 480,BufferedImage.TYPE_INT_RGB);
g2d = backbuffer.createGraphics();
//set up the ship
ship.setX(320);
ship.setY(240);
//set up the bullets
for (int n = 0; n < BULLETS; n++) {
bullet[n] = new Bullet();
}
//Create the asteroids
for (int n = 0; n < ASTEROIDS; n++) {
ast[n] = new Asteroid();
ast[n].setRotationVelocity(rand.nextInt(3)+1);
ast[n].setX((double)rand.nextInt(600)+20);
ast[n].setY((double)rand.nextInt(440)+20);
ast[n].setMoveAngle(rand.nextInt(360));
double ang = ast[n].getMoveAngle() - 90;
ast[n].setVelX(calcAngleMoveX(ang));
ast[n].setVelY(calcAngleMoveY(ang));
}
//start the user input listener
addKeyListener(this);
}
// applet update event to redraw the screen
public void udpate(Graphics g) {
//start off the transforms at identity
g2d.setTransform(identity);
//erase the background
g2d.setPaint(Color.BLACK);
g2d.fillRect(0, 0, getSize().width, getSize().height);
//print some status information
g2d.setColor(Color.WHITE);
g2d.drawString("Ship: "+ Math.round(ship.getX()) + "," + Math.round(ship.getY()), 5 ,
10);
g2d.drawString("Move angle: " + Math.round(ship.getMoveAngle()) + 90, 5, 25);
g2d.drawString("Face angle: " + Math.round(ship.getFaceAngle()),5 , 40);
//draw the game graphics
drawShip();
drawBullets();
drawAsteroids();
//repaint the applet window
paint(g);
}
//drawShip called by applet udpate event
public void drawShip() {
g2d.setTransform(identity);
g2d.translate(ship.getX(), ship.getY());
g2d.rotate(Math.toRadians(ship.getFaceAngle()));
g2d.setColor(Color.ORANGE);
g2d.fill(ship.getShape());
}
//drawbullets called by applet udpate event
public void drawBullets() {
//iterate through the array of bullets
for (int n = 0; n < BULLETS; n++){
//is this bullet currently in use?
if (bullet[n].isAlive()) {
//draw bullet
g2d.setTransform(identity);
g2d.translate(bullet[n].getX(), bullet[n].getY());
g2d.setColor(Color.MAGENTA);
g2d.draw(bullet[n].getShape());
}
}
}
//drawAsteroids called by applet update event
public void drawAsteroids() {
for (int n = 0; n < ASTEROIDS; n++) {
//is this asteroid being used?
if (ast[n].isAlive()){
//draw asteroid
g2d.setTransform(identity);
g2d.translate(ast[n].getX(), ast[n].getY());
g2d.rotate(Math.toRadians(ast[n].getMoveAngle()));
g2d.setColor(Color.DARK_GRAY);
g2d.fill(ast[n].getShape());
}
}
}
//applet window repaint event draw the back buffer
public void paint(Graphics g) {
//draw the back buffer onto the applet window
g.drawImage(backbuffer, 0, 0, this );
}
// thread start event - start the game loop running
public void start() {
//create the gameloop thread for real - time updates
gameloop = new Thread(this);
gameloop.start();
}
// thread run event (game loop)
public void run() {
//acquire the current thread
Thread t = Thread.currentThread();
//keep going as long as the thread is alive
while (t == gameloop) {
try {
//update gameloop
gameUpdate();
//target framerate is 50fps
Thread.sleep(20);
}
catch(InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}
//thread stop event
public void stop() {
//kill the gameloop thread
gameloop = null;
}
//move and animate the objects in the game
private void gameUpdate() {
updateShip();
updateBullets();
updateAsteroids();
checkCollisions();
}
//update the ship position based on velocity
public void updateShip() {
//update ships X position
ship.incX(ship.getVelX());
//warp around left/right
if (ship.getX() < -10)
ship.setX(getSize().width + 10);
else if (ship.getX() > getSize().width + 10)
ship.setX(-10);
//update ships Y position
ship.incY(ship.getVelY());
//wrap around top/bottom
if (ship.getY() < -10)
ship.setY(getSize().height + 10);
else if (ship.getY() > getSize().height + 10)
ship.setY(-10);
}
// update the bullets based on velocity
public void updateBullets() {
//move each of the bullets
for (int n = 0; n < BULLETS; n++) {
//is this bullet being used?
if (bullet[n].isAlive()) {
//update bullets x position
bullet[n].incX(bullet[n].getVelX());
//bullet disappears at left/right edge
if (bullet[n].getX() < 0 || bullet[n].getX() > getSize().width) {
bullet[n].setAlive(false);
}
//update bullets y position
bullet[n].incY(bullet[n].getVelY());
//bullet disappears at top/bottom edge
if (bullet[n].getY() < 0 || bullet[n].getY() > getSize().height) {
bullet[n].setAlive(false);
}
}
}
}
//update the asteroids based on velocity
public void updateAsteroids() {
//move and rotate the asteroids
for (int n = 0; n < ASTEROIDS; n++) {
//is this asteroid being used?
if (ast[n].isAlive()) {
//update asteroid X value
ast[n].incX(ast[n].getVelX());
//warp the asteroid at the screen edges
if (ast[n].getX() < -20)
ast[n].setX(getSize().width + 20);
else if (ast[n].getX() > getSize().width +20)
ast[n].setX(-20);
//update the asteroid Y value
ast[n].incY(ast[n].getVelY());
//warp around bottom and top of screen
if (ast[n].getY() < -20)
ast[n].setY(getSize().height + 20);
else if (ast[n].getY() > getSize().height +20)
ast[n].setY(-20);
//update the asteroids rotation
ast[n].incMoveAngle(ast[n].getRotationVelocity());
//keep the angle within 0-359 degrees
if (ast[n].getMoveAngle() < 0)
ast[n].setMoveAngle(360 - ast[n].getRotationVelocity());
else if (ast[n].getMoveAngle() > 360)
ast[n].setMoveAngle(ast[n].getRotationVelocity());
}
}
}
//test asteroids for collisions with ship or bullets
public void checkCollisions() {
//iterate through the asteroids array
for (int m = 0; m < ASTEROIDS; m++) {
// is this asteroid being used?
if (ast[m].isAlive()) {
//check for collision with bullet
for (int n = 0; n < BULLETS; n++) {
//is this bullet being used?
if (bullet[n].isAlive()) {
//perform the collision test
if (ast[m].getBounds().contains(bullet[n].getX(), bullet[n].getY())) {
bullet[n].setAlive(false);
ast[m].setAlive(false);
continue;
}
}
}
//check for collision with ship
if(ast[m].getBounds().intersects(ship.getBounds())) {
ast[m].setAlive(false);
ship.setX(320);
ship.setY(240);
ship.setFaceAngle(0);
ship.setVelX(0);
ship.setVelY(0);
continue;
}
}
}
}
//key listener events
public void keyReleased(KeyEvent k) {}
public void keyTyped(KeyEvent k) {}
public void keyPressed(KeyEvent k) {
int keyCode = k.getKeyCode();
switch (keyCode) {
case KeyEvent.VK_LEFT:
//left arrow rotates ship left 5 degrees
ship.incFaceAngle(-5);
if(ship.getFaceAngle() < 0) ship.setFaceAngle(360-5);
break;
case KeyEvent.VK_RIGHT:
//right arrow rotates ship right 5 degrees
ship.incFaceAngle(5);
if(ship.getFaceAngle() > 360) ship.setFaceAngle(5);
break;
case KeyEvent.VK_UP:
//up arrow thrust to ship (1/10 normal speed)
ship.setMoveAngle(ship.getFaceAngle() - 90);
ship.incVelX(calcAngleMoveX(ship.getMoveAngle()) * 0.1);
ship.incVelY(calcAngleMoveY(ship.getMoveAngle()) * 0.1);
break;
//CTRL ENTER OR SPACE used to fire weapon
case KeyEvent.VK_CONTROL:
case KeyEvent.VK_ENTER:
case KeyEvent.VK_SPACE:
//fire a bullet
currentBullet++;
if(currentBullet > BULLETS - 1) currentBullet = 0;
bullet[currentBullet].setAlive(true);
//point bullet in same direction as ship is facing
bullet[currentBullet].setX(ship.getX());
bullet[currentBullet].setY(ship.getY());
bullet[currentBullet].setMoveAngle(ship.getFaceAngle() - 90);
//fire bullet at angle of ship
double angle = bullet[currentBullet].getMoveAngle();
double svx = ship.getVelX();
double svy = ship.getVelY();
bullet[currentBullet].setVelX(svx + calcAngleMoveX(angle) * 2);
bullet[currentBullet].setVelY(svy + calcAngleMoveY(angle) * 2);
break;
}
}
//calculate X movement value based on direction angle
public double calcAngleMoveX(double angle) {
return (double) (Math.cos(angle * Math.PI / 180));
}
// calculate Y movement value based on direction angle
public double calcAngleMoveY (double angle) {
return (double) (Math.sin(angle * Math.PI / 180));
}
}

More Related Content

PDF
Using Java, please write the program for the following prompt in the.pdf
PPTX
The games factory 2 alien wars
PDF
i have a runable code below that works with just guessing where the .pdf
PDF
Penn Siggraph Games Development Game
DOCX
ontents · Introduction· Objectives·.docx
PDF
This is the Java code i have for a Battleship project i am working o.pdf
PDF
building_games_with_ruby_rubyconf
PDF
building_games_with_ruby_rubyconf
Using Java, please write the program for the following prompt in the.pdf
The games factory 2 alien wars
i have a runable code below that works with just guessing where the .pdf
Penn Siggraph Games Development Game
ontents · Introduction· Objectives·.docx
This is the Java code i have for a Battleship project i am working o.pdf
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf

Similar to Need help with questions 2-4. Write assembly code to find absolute v.pdf (20)

ODP
APCS Winter Project Presentation
PDF
Code level change propagation in virtual platform
PDF
i have a code that runs, but it only lets the player to guess where .pdf
PDF
IntroductionFor this program, you will implement an interface that.pdf
PDF
Create a C program that implements The Game of Life cellular auto.pdf
KEY
Introduction to Game Programming Tutorial
PDF
The following code, is a one player battleship game in JAVA. Im tryi.pdf
PDF
Game Lab
KEY
Intro to Game Programming
PDF
import java.util.Scanner;public class Main {    public static in.pdf
PDF
Game Physics Test
PDF
Game architecture is different
PDF
What's wrong with my code- I am coding a battleship game that uses a d (1).pdf
PDF
Laser Defender Game in Unity3D
PDF
3D Space Shooting Game
PDF
i need a taking turn method for a player vs computer battleship game.pdf
DOC
2d game printscreens
PDF
send EDITED code pleaseBattleship.javapackage part3;public cla.pdf
PDF
Atari 2600 VCS Programming
APCS Winter Project Presentation
Code level change propagation in virtual platform
i have a code that runs, but it only lets the player to guess where .pdf
IntroductionFor this program, you will implement an interface that.pdf
Create a C program that implements The Game of Life cellular auto.pdf
Introduction to Game Programming Tutorial
The following code, is a one player battleship game in JAVA. Im tryi.pdf
Game Lab
Intro to Game Programming
import java.util.Scanner;public class Main {    public static in.pdf
Game Physics Test
Game architecture is different
What's wrong with my code- I am coding a battleship game that uses a d (1).pdf
Laser Defender Game in Unity3D
3D Space Shooting Game
i need a taking turn method for a player vs computer battleship game.pdf
2d game printscreens
send EDITED code pleaseBattleship.javapackage part3;public cla.pdf
Atari 2600 VCS Programming
Ad

More from feelinggifts (20)

PDF
Chapter 22. Problem 3BCP0 Bookmark Show all steps ON Problem Eminent.pdf
PDF
D Question 11 1 pts A fundamental feature of money that BitCoin fulfi.pdf
PDF
connect instructions I helg dule 7 Connect seve & Exit ..pdf
PDF
COMPUTER ETHICSDiscuss the local and global impact of malware and .pdf
PDF
You’re helping a group of ethnographers analyze some oral history da.pdf
PDF
A man with type B blood type claims to be biological father of a typ.pdf
PDF
why should filtrate be used to transfer the residue when the desired.pdf
PDF
Winch of the following is NOT one of the reasons an IO Exception is t.pdf
PDF
Why is attending to the full scope of drivers critical in implementi.pdf
PDF
Which of the following is not a function of interest groups A. to i.pdf
PDF
When explaining civil law one would say that it is concemed with disp.pdf
PDF
What is the difference between a short and long branchSolution.pdf
PDF
What is the maximum file size in a FAT32 systemSolutionFirst .pdf
PDF
View transaction list Journal entry worksheet The company paid $510 c.pdf
PDF
The numeric data types in C++ can be broken into two general categori.pdf
PDF
The capillaries at the alveoli Form a respiratory membrane Are spe.pdf
PDF
Select the word or phrase which best matches the description of it..pdf
PDF
Robin Hood has hired you as his new Strategic Consultant to help him.pdf
PDF
Research indicates that online news seekers tend to access topics of.pdf
PDF
Read Case Study Room 406 and answer the following questions in 2.pdf
Chapter 22. Problem 3BCP0 Bookmark Show all steps ON Problem Eminent.pdf
D Question 11 1 pts A fundamental feature of money that BitCoin fulfi.pdf
connect instructions I helg dule 7 Connect seve & Exit ..pdf
COMPUTER ETHICSDiscuss the local and global impact of malware and .pdf
You’re helping a group of ethnographers analyze some oral history da.pdf
A man with type B blood type claims to be biological father of a typ.pdf
why should filtrate be used to transfer the residue when the desired.pdf
Winch of the following is NOT one of the reasons an IO Exception is t.pdf
Why is attending to the full scope of drivers critical in implementi.pdf
Which of the following is not a function of interest groups A. to i.pdf
When explaining civil law one would say that it is concemed with disp.pdf
What is the difference between a short and long branchSolution.pdf
What is the maximum file size in a FAT32 systemSolutionFirst .pdf
View transaction list Journal entry worksheet The company paid $510 c.pdf
The numeric data types in C++ can be broken into two general categori.pdf
The capillaries at the alveoli Form a respiratory membrane Are spe.pdf
Select the word or phrase which best matches the description of it..pdf
Robin Hood has hired you as his new Strategic Consultant to help him.pdf
Research indicates that online news seekers tend to access topics of.pdf
Read Case Study Room 406 and answer the following questions in 2.pdf
Ad

Recently uploaded (20)

PDF
O5-L3 Freight Transport Ops (International) V1.pdf
PDF
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
PPTX
Final Presentation General Medicine 03-08-2024.pptx
PPTX
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...
PPTX
master seminar digital applications in india
PPTX
Pharma ospi slides which help in ospi learning
PDF
Chinmaya Tiranga quiz Grand Finale.pdf
PDF
Module 4: Burden of Disease Tutorial Slides S2 2025
PDF
Computing-Curriculum for Schools in Ghana
PDF
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
PPTX
Presentation on HIE in infants and its manifestations
PPTX
PPT- ENG7_QUARTER1_LESSON1_WEEK1. IMAGERY -DESCRIPTIONS pptx.pptx
PDF
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
PDF
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
PPTX
Microbial diseases, their pathogenesis and prophylaxis
PDF
Complications of Minimal Access Surgery at WLH
PDF
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
PPTX
202450812 BayCHI UCSC-SV 20250812 v17.pptx
PDF
01-Introduction-to-Information-Management.pdf
PPTX
Institutional Correction lecture only . . .
O5-L3 Freight Transport Ops (International) V1.pdf
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
Final Presentation General Medicine 03-08-2024.pptx
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...
master seminar digital applications in india
Pharma ospi slides which help in ospi learning
Chinmaya Tiranga quiz Grand Finale.pdf
Module 4: Burden of Disease Tutorial Slides S2 2025
Computing-Curriculum for Schools in Ghana
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
Presentation on HIE in infants and its manifestations
PPT- ENG7_QUARTER1_LESSON1_WEEK1. IMAGERY -DESCRIPTIONS pptx.pptx
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
Microbial diseases, their pathogenesis and prophylaxis
Complications of Minimal Access Surgery at WLH
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
202450812 BayCHI UCSC-SV 20250812 v17.pptx
01-Introduction-to-Information-Management.pdf
Institutional Correction lecture only . . .

Need help with questions 2-4. Write assembly code to find absolute v.pdf

  • 1. Need help with questions 2-4. Write assembly code to find absolute values of a data word (2 byte word) stored at address $0200 and write the absolute value at $0300. Two 16-bit signed values are stored at $0A00 (they each take 2 bytes). Please write assembly code to sort them in descending order (so that $0A02 has the smallest, and $0A00 has the largest). Could you sort the same way for 50 such words? Write a piece of Assembly code to (a) allocate a string named message to contain good day! (all the underlined characters) at location $0F00; (b) How many bytes would it need?; (c) The rest of the code you write should compare the contents in register A with each character in this message. If a match is found, put the NULL character in register A, and get register B to contain the character G (ascii value). Write HCS12 assembly code to do the following. Using ORG and DC.W directives declare and initialize a data array of 8 words (1 word = 1 integer in I ICS 12 - 2 bytes) starting at address S0200. Their initial values are to be A367, F238,0012, 1972, 1132, AB88, 7399, and 1864. You can name the array EightInts (see class notes or text examples). Now start your program code at $4000 (ORG directive). Configure the direction of port A, port B, and port H to be inputs (i.e. set data directional registers). We are going to consider port A as the high byte, and port B as low byte of data words we want to read and compare against eighties using a loop. The idea is to see whether port A and port B values taken as a 2 byte integer is equal to any of the values in eightins. Before starting to compare values, the program waits until port H is all 1's then it reads port A, and port B before comparing against eighties. if a match is found, your program branches to label found and stay at that instruction. If no match, the program should branch to no luck label and stay there. Solution import java.applet.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.image.*; import java.util.*; //Primary class for the game public class Asteroids extends Applet implements Runnable, KeyListener{ /** * */ private static final long serialVersionUID = 1L;
  • 2. //the main thread becomes the game loop Thread gameloop; //use this as a double buffer BufferedImage backbuffer; //the main drawing object for the back buffer Graphics2D g2d; //toggle for drawing bounding boxes boolean showBounds = false; //create the asteroid array int ASTEROIDS = 20; Asteroid[] ast = new Asteroid[ASTEROIDS]; //create the bullet array int BULLETS = 10; Bullet[] bullet = new Bullet[BULLETS]; int currentBullet = 0; //the player's ship Ship ship = new Ship(); //create the identity transform (0.0) AffineTransform identity = new AffineTransform(); //create a random number generator Random rand = new Random(); //applet init event public void init(){ //create the back buffer for smooth graphics backbuffer = new BufferedImage(640, 480,BufferedImage.TYPE_INT_RGB); g2d = backbuffer.createGraphics();
  • 3. //set up the ship ship.setX(320); ship.setY(240); //set up the bullets for (int n = 0; n < BULLETS; n++) { bullet[n] = new Bullet(); } //Create the asteroids for (int n = 0; n < ASTEROIDS; n++) { ast[n] = new Asteroid(); ast[n].setRotationVelocity(rand.nextInt(3)+1); ast[n].setX((double)rand.nextInt(600)+20); ast[n].setY((double)rand.nextInt(440)+20); ast[n].setMoveAngle(rand.nextInt(360)); double ang = ast[n].getMoveAngle() - 90; ast[n].setVelX(calcAngleMoveX(ang)); ast[n].setVelY(calcAngleMoveY(ang)); } //start the user input listener addKeyListener(this); } // applet update event to redraw the screen public void udpate(Graphics g) { //start off the transforms at identity g2d.setTransform(identity); //erase the background g2d.setPaint(Color.BLACK); g2d.fillRect(0, 0, getSize().width, getSize().height); //print some status information
  • 4. g2d.setColor(Color.WHITE); g2d.drawString("Ship: "+ Math.round(ship.getX()) + "," + Math.round(ship.getY()), 5 , 10); g2d.drawString("Move angle: " + Math.round(ship.getMoveAngle()) + 90, 5, 25); g2d.drawString("Face angle: " + Math.round(ship.getFaceAngle()),5 , 40); //draw the game graphics drawShip(); drawBullets(); drawAsteroids(); //repaint the applet window paint(g); } //drawShip called by applet udpate event public void drawShip() { g2d.setTransform(identity); g2d.translate(ship.getX(), ship.getY()); g2d.rotate(Math.toRadians(ship.getFaceAngle())); g2d.setColor(Color.ORANGE); g2d.fill(ship.getShape()); } //drawbullets called by applet udpate event public void drawBullets() { //iterate through the array of bullets for (int n = 0; n < BULLETS; n++){ //is this bullet currently in use? if (bullet[n].isAlive()) { //draw bullet g2d.setTransform(identity); g2d.translate(bullet[n].getX(), bullet[n].getY()); g2d.setColor(Color.MAGENTA); g2d.draw(bullet[n].getShape());
  • 5. } } } //drawAsteroids called by applet update event public void drawAsteroids() { for (int n = 0; n < ASTEROIDS; n++) { //is this asteroid being used? if (ast[n].isAlive()){ //draw asteroid g2d.setTransform(identity); g2d.translate(ast[n].getX(), ast[n].getY()); g2d.rotate(Math.toRadians(ast[n].getMoveAngle())); g2d.setColor(Color.DARK_GRAY); g2d.fill(ast[n].getShape()); } } } //applet window repaint event draw the back buffer public void paint(Graphics g) { //draw the back buffer onto the applet window g.drawImage(backbuffer, 0, 0, this ); } // thread start event - start the game loop running public void start() { //create the gameloop thread for real - time updates gameloop = new Thread(this); gameloop.start(); } // thread run event (game loop)
  • 6. public void run() { //acquire the current thread Thread t = Thread.currentThread(); //keep going as long as the thread is alive while (t == gameloop) { try { //update gameloop gameUpdate(); //target framerate is 50fps Thread.sleep(20); } catch(InterruptedException e) { e.printStackTrace(); } repaint(); } } //thread stop event public void stop() { //kill the gameloop thread gameloop = null; } //move and animate the objects in the game private void gameUpdate() { updateShip(); updateBullets(); updateAsteroids(); checkCollisions(); }
  • 7. //update the ship position based on velocity public void updateShip() { //update ships X position ship.incX(ship.getVelX()); //warp around left/right if (ship.getX() < -10) ship.setX(getSize().width + 10); else if (ship.getX() > getSize().width + 10) ship.setX(-10); //update ships Y position ship.incY(ship.getVelY()); //wrap around top/bottom if (ship.getY() < -10) ship.setY(getSize().height + 10); else if (ship.getY() > getSize().height + 10) ship.setY(-10); } // update the bullets based on velocity public void updateBullets() { //move each of the bullets for (int n = 0; n < BULLETS; n++) { //is this bullet being used? if (bullet[n].isAlive()) { //update bullets x position bullet[n].incX(bullet[n].getVelX()); //bullet disappears at left/right edge if (bullet[n].getX() < 0 || bullet[n].getX() > getSize().width) { bullet[n].setAlive(false);
  • 8. } //update bullets y position bullet[n].incY(bullet[n].getVelY()); //bullet disappears at top/bottom edge if (bullet[n].getY() < 0 || bullet[n].getY() > getSize().height) { bullet[n].setAlive(false); } } } } //update the asteroids based on velocity public void updateAsteroids() { //move and rotate the asteroids for (int n = 0; n < ASTEROIDS; n++) { //is this asteroid being used? if (ast[n].isAlive()) { //update asteroid X value ast[n].incX(ast[n].getVelX()); //warp the asteroid at the screen edges if (ast[n].getX() < -20) ast[n].setX(getSize().width + 20); else if (ast[n].getX() > getSize().width +20) ast[n].setX(-20); //update the asteroid Y value ast[n].incY(ast[n].getVelY()); //warp around bottom and top of screen
  • 9. if (ast[n].getY() < -20) ast[n].setY(getSize().height + 20); else if (ast[n].getY() > getSize().height +20) ast[n].setY(-20); //update the asteroids rotation ast[n].incMoveAngle(ast[n].getRotationVelocity()); //keep the angle within 0-359 degrees if (ast[n].getMoveAngle() < 0) ast[n].setMoveAngle(360 - ast[n].getRotationVelocity()); else if (ast[n].getMoveAngle() > 360) ast[n].setMoveAngle(ast[n].getRotationVelocity()); } } } //test asteroids for collisions with ship or bullets public void checkCollisions() { //iterate through the asteroids array for (int m = 0; m < ASTEROIDS; m++) { // is this asteroid being used? if (ast[m].isAlive()) { //check for collision with bullet for (int n = 0; n < BULLETS; n++) { //is this bullet being used? if (bullet[n].isAlive()) { //perform the collision test if (ast[m].getBounds().contains(bullet[n].getX(), bullet[n].getY())) { bullet[n].setAlive(false); ast[m].setAlive(false); continue; }
  • 10. } } //check for collision with ship if(ast[m].getBounds().intersects(ship.getBounds())) { ast[m].setAlive(false); ship.setX(320); ship.setY(240); ship.setFaceAngle(0); ship.setVelX(0); ship.setVelY(0); continue; } } } } //key listener events public void keyReleased(KeyEvent k) {} public void keyTyped(KeyEvent k) {} public void keyPressed(KeyEvent k) { int keyCode = k.getKeyCode(); switch (keyCode) { case KeyEvent.VK_LEFT: //left arrow rotates ship left 5 degrees ship.incFaceAngle(-5); if(ship.getFaceAngle() < 0) ship.setFaceAngle(360-5); break; case KeyEvent.VK_RIGHT: //right arrow rotates ship right 5 degrees ship.incFaceAngle(5); if(ship.getFaceAngle() > 360) ship.setFaceAngle(5); break; case KeyEvent.VK_UP: //up arrow thrust to ship (1/10 normal speed) ship.setMoveAngle(ship.getFaceAngle() - 90);
  • 11. ship.incVelX(calcAngleMoveX(ship.getMoveAngle()) * 0.1); ship.incVelY(calcAngleMoveY(ship.getMoveAngle()) * 0.1); break; //CTRL ENTER OR SPACE used to fire weapon case KeyEvent.VK_CONTROL: case KeyEvent.VK_ENTER: case KeyEvent.VK_SPACE: //fire a bullet currentBullet++; if(currentBullet > BULLETS - 1) currentBullet = 0; bullet[currentBullet].setAlive(true); //point bullet in same direction as ship is facing bullet[currentBullet].setX(ship.getX()); bullet[currentBullet].setY(ship.getY()); bullet[currentBullet].setMoveAngle(ship.getFaceAngle() - 90); //fire bullet at angle of ship double angle = bullet[currentBullet].getMoveAngle(); double svx = ship.getVelX(); double svy = ship.getVelY(); bullet[currentBullet].setVelX(svx + calcAngleMoveX(angle) * 2); bullet[currentBullet].setVelY(svy + calcAngleMoveY(angle) * 2); break; } } //calculate X movement value based on direction angle public double calcAngleMoveX(double angle) { return (double) (Math.cos(angle * Math.PI / 180)); } // calculate Y movement value based on direction angle public double calcAngleMoveY (double angle) { return (double) (Math.sin(angle * Math.PI / 180)); }
  • 12. }