📄 elevatorview.java
字号:
package com.Anance.elevator.view;import java.awt.*;import java.awt.event.*;import java.util.*;import java.applet.*;import javax.swing.*;import com.Anance.elevator.event.*;import com.Anance.elevator.ElevatorConstants;public class ElevatorView extends JPanel implements ActionListener, ElevatorModelListener, ElevatorConstants { private static final int VIEW_WIDTH = 800; private static final int VIEW_HEIGHT = 435; private static final int OFFSET = 10; private static final int ANIMATION_DELAY = 50; private static final int PERSON_TO_BUTTON_DISTANCE = 400; private static final int BUTTON_TO_ELEVATOR_DISTANCE = 50; private static final int PERSON_TO_ELEVATOR_DISTANCE = PERSON_TO_BUTTON_DISTANCE + BUTTON_TO_ELEVATOR_DISTANCE; private static final int TIME_TO_BUTTON = 3000; private static final int TIME_TO_ELEVATOR = 1000; private static final int ELEVATOR_TRAVEL_TIME = 5000; private static final String doorFrames[] = { "images/door1.png", "images/door2.png", "images/door3.png", "images/door4.png", "images/door5.png" }; private static final String personFrames[] = { "images/bug1.png", "images/bug2.png", "images/bug3.png", "images/bug4.png", "images/bug5.png", "images/bug6.png", "images/bug7.png", "images/bug8.png" }; private static final String lightFrames[] = { "images/lightOff.png", "images/lightOn.png" }; private static final String firstFloorLightFrames[] = { "images/firstFloorLightOff.png", "images/firstFloorLightOn.png" }; private static final String secondFloorLightFrames[] = { "images/secondFloorLightOff.png", "images/secondFloorLightOn.png", }; private static final String floorButtonFrames[] = { "images/floorButtonUnpressed.png", "images/floorButtonPressed.png", "images/floorButtonLit.png" }; private static final String elevatorButtonFrames[] = { "images/elevatorButtonUnpressed.png", "images/elevatorButtonPressed.png", "images/elevatorButtonLit.png" }; private static final String bellFrames[] = { "images/bell1.png", "images/bell2.png", "images/bell3.png" }; private static final String floorImage = "images/floor.png"; private static final String ceilingImage = "images/ceiling.png"; private static final String elevatorImage = "images/elevator.png"; private static final String wallImage = "images/wall.jpg"; private static final String elevatorShaftImage = "images/elevatorShaft.png"; private static final String bellSound = "bell.wav"; private static final String doorOpenSound = "doorOpen.wav"; private static final String doorCloseSound = "doorClose.wav"; private static final String elevatorSound = "elevator.au"; private static final String buttonSound = "button.wav"; private static final String walkingSound = "walk.wav"; private static final String midiFile = "sounds/liszt.mid"; private ImagePanel firstFloorPanel; private ImagePanel secondFloorPanel; private ImagePanel elevatorShaftPanel; private ImagePanel wallPanel; private ImagePanel ceilingPanel; private MovingPanel elevatorPanel; private AnimatedPanel firstFloorButtonPanel; private AnimatedPanel secondFloorButtonPanel; private AnimatedPanel elevatorButtonPanel; private AnimatedPanel bellPanel; private AnimatedPanel elevatorLightPanel; private AnimatedPanel firstFloorLightPanel; private AnimatedPanel secondFloorLightPanel; private AnimatedPanel doorPanel; private java.util.List personAnimatedPanels; private AudioClip bellClip; private AudioClip doorOpenClip; private AudioClip doorCloseClip; private AudioClip elevatorClip; private AudioClip buttonClip; private AudioClip walkClip; private ElevatorMusic elevatorMusic; private javax.swing.Timer animationTimer; private int firstFloorPosition; private int secondFloorPosition; private double elevatorVelocity; public ElevatorView() { super( null ); instantiatePanels(); placePanelsOnView(); initializeAudio(); double floorDistance = firstFloorPosition - secondFloorPosition; double time = ELEVATOR_TRAVEL_TIME / ANIMATION_DELAY; elevatorVelocity = ( floorDistance + OFFSET ) / time; startAnimation(); } private void instantiatePanels() { firstFloorPanel = new ImagePanel( 0, floorImage ); secondFloorPanel = new ImagePanel( 0, floorImage ); firstFloorPosition = VIEW_HEIGHT - firstFloorPanel.getHeight(); secondFloorPosition = ( int ) ( firstFloorPosition / 2 ) - OFFSET; firstFloorPanel.setPosition( 0, firstFloorPosition ); secondFloorPanel.setPosition( 0, secondFloorPosition ); wallPanel = new ImagePanel( 0, wallImage ); elevatorShaftPanel = new ImagePanel( 0, elevatorShaftImage ); double xPosition = PERSON_TO_ELEVATOR_DISTANCE + OFFSET; double yPosition = firstFloorPosition - elevatorShaftPanel.getHeight(); elevatorShaftPanel.setPosition( xPosition, yPosition ); ceilingPanel = new ImagePanel( 0, ceilingImage ); yPosition = elevatorShaftPanel.getPosition().getY() -ceilingPanel.getHeight(); ceilingPanel.setPosition( xPosition, yPosition ); elevatorPanel = new MovingPanel( 0, elevatorImage ); yPosition = firstFloorPosition - elevatorPanel.getHeight(); elevatorPanel.setPosition( xPosition, yPosition ); firstFloorButtonPanel =new AnimatedPanel( 0, floorButtonFrames ); xPosition = PERSON_TO_BUTTON_DISTANCE + 2 * OFFSET; yPosition = firstFloorPosition - 5 * OFFSET; firstFloorButtonPanel.setPosition( xPosition, yPosition ); int floorButtonPressedFrameOrder[] = { 0, 1, 2 }; firstFloorButtonPanel.addFrameSequence( floorButtonPressedFrameOrder ); secondFloorButtonPanel = new AnimatedPanel( 1, floorButtonFrames ); xPosition = PERSON_TO_BUTTON_DISTANCE + 2 * OFFSET; yPosition = secondFloorPosition - 5 * OFFSET; secondFloorButtonPanel.setPosition( xPosition, yPosition ); secondFloorButtonPanel.addFrameSequence( floorButtonPressedFrameOrder ); firstFloorLightPanel = new AnimatedPanel( 0, firstFloorLightFrames ); xPosition = elevatorPanel.getLocation().x - 4 * OFFSET; yPosition = firstFloorButtonPanel.getLocation().y - 10 * OFFSET; firstFloorLightPanel.setPosition( xPosition, yPosition ); secondFloorLightPanel = new AnimatedPanel( 1, secondFloorLightFrames ); yPosition = secondFloorButtonPanel.getLocation().y - 10 * OFFSET; secondFloorLightPanel.setPosition( xPosition, yPosition ); doorPanel = new AnimatedPanel( 0, doorFrames ); int doorOpenedFrameOrder[] = { 0, 1, 2, 3, 4 }; int doorClosedFrameOrder[] = { 4, 3, 2, 1, 0 }; doorPanel.addFrameSequence( doorOpenedFrameOrder ); doorPanel.addFrameSequence( doorClosedFrameOrder ); yPosition =elevatorPanel.getHeight() - doorPanel.getHeight(); doorPanel.setPosition( 0, yPosition ); elevatorLightPanel = new AnimatedPanel( 0, lightFrames ); elevatorLightPanel.setPosition( OFFSET, 5 * OFFSET ); bellPanel = new AnimatedPanel( 0, bellFrames ); yPosition = elevatorLightPanel.getPosition().getY() + elevatorLightPanel.getHeight() + OFFSET; bellPanel.setPosition( OFFSET, yPosition ); int bellRingAnimation[] = { 0, 1, 0, 2 }; bellPanel.addFrameSequence( bellRingAnimation ); elevatorButtonPanel = new AnimatedPanel( 0, elevatorButtonFrames ); yPosition = elevatorPanel.getHeight() - 6 * OFFSET; elevatorButtonPanel.setPosition( 10 * OFFSET, yPosition ); int buttonPressedFrameOrder[] = { 0, 1, 2 }; elevatorButtonPanel.addFrameSequence( buttonPressedFrameOrder ); personAnimatedPanels = new ArrayList(); } private void placePanelsOnView() { // add Panels to ElevatorView add( firstFloorPanel ); add( secondFloorPanel ); add( ceilingPanel ); add( elevatorPanel ); add( firstFloorButtonPanel ); add( secondFloorButtonPanel ); add( firstFloorLightPanel ); add( secondFloorLightPanel ); add( elevatorShaftPanel ); add( wallPanel ); // add Panels to Elevator's MovingPanel elevatorPanel.add( doorPanel ); elevatorPanel.add( elevatorLightPanel ); elevatorPanel.add( bellPanel ); elevatorPanel.add( elevatorButtonPanel ); } // end method placePanelsOnView // get sound effects and elevatorMusic private void initializeAudio() { // create AudioClip sound effects from audio files SoundEffects sounds = new SoundEffects(); sounds.setPathPrefix( "sounds/" ); bellClip = sounds.getAudioClip( bellSound ); doorOpenClip = sounds.getAudioClip( doorOpenSound ); doorCloseClip = sounds.getAudioClip( doorCloseSound ); elevatorClip = sounds.getAudioClip( elevatorSound ); buttonClip = sounds.getAudioClip( buttonSound ); walkClip = sounds.getAudioClip( walkingSound ); // create MIDI player using Java Media Framework elevatorMusic = new ElevatorMusic( midiFile ); elevatorMusic.open(); } // end method initializeAudio // starts animation by repeatedly drawing images to screen public void startAnimation() { if ( animationTimer == null ) { animationTimer = new javax.swing.Timer( ANIMATION_DELAY, this ); animationTimer.start(); } else if ( !animationTimer.isRunning() ) animationTimer.restart(); } // stop animation public void stopAnimation() { animationTimer.stop(); } // update AnimatedPanels animation in response to Timer public void actionPerformed( ActionEvent actionEvent ) { elevatorPanel.animate(); firstFloorButtonPanel.animate(); secondFloorButtonPanel.animate(); Iterator iterator = getPersonAnimatedPanelsIterator(); while ( iterator.hasNext() ) { // get Person's AnimatedPanel from Set AnimatedPanel personPanel = ( AnimatedPanel ) iterator.next(); personPanel.animate(); // update panel } repaint(); // paint all Components } // end method actionPerformed private Iterator getPersonAnimatedPanelsIterator() { // obtain iterator from List synchronized( personAnimatedPanels ) { return new ArrayList( personAnimatedPanels ).iterator(); } } // stop sound clip of Person walking private void stopWalkingSound() { // stop playing walking sound walkClip.stop(); Iterator iterator = getPersonAnimatedPanelsIterator(); // but if Person is still walking, then keep playing while ( iterator.hasNext() ) { AnimatedPanel panel = ( AnimatedPanel ) iterator.next(); if ( panel.getXVelocity() != 0 ) walkClip.loop(); } } // end method stopWalkingSound // returns Person AnimatedPanel with proper identifier private AnimatedPanel getPersonPanel( PersonMoveEvent event ) { Iterator iterator = getPersonAnimatedPanelsIterator(); while ( iterator.hasNext() ) { // get next AnimatedPanel AnimatedPanel personPanel = ( AnimatedPanel ) iterator.next(); // return AnimatedPanel with identifier that matches if ( personPanel.getID() == event.getID() ) return personPanel; } // return null if no match with correct identifier return null; } // end method getPersonPanel // invoked when Elevator has departed from Floor public void elevatorDeparted( ElevatorMoveEvent moveEvent ) { String location = moveEvent.getLocation().getLocationName(); // determine if Person is on Elevator Iterator iterator = getPersonAnimatedPanelsIterator(); while ( iterator.hasNext() ) { AnimatedPanel personPanel = ( AnimatedPanel ) iterator.next(); double yPosition = personPanel.getPosition().getY(); String panelLocation; // determine on which Floor the Person entered if ( yPosition > secondFloorPosition ) panelLocation = FIRST_FLOOR_NAME; else panelLocation = SECOND_FLOOR_NAME; int xPosition = ( int ) personPanel.getPosition().getX(); // if Person is inside Elevator if ( panelLocation.equals( location ) && xPosition > PERSON_TO_BUTTON_DISTANCE + OFFSET ) { // remove Person AnimatedPanel from ElevatorView remove( personPanel ); // add Person AnimatedPanel to Elevator elevatorPanel.add( personPanel, 1 ); personPanel.setLocation( 2 * OFFSET, 9 * OFFSET ); personPanel.setMoving( false ); personPanel.setAnimating( false ); personPanel.setVelocity( 0, 0 ); personPanel.setCurrentFrame( 1 ); } } // end while loop // determine Elevator velocity depending on Floor if ( location.equals( FIRST_FLOOR_NAME ) ) elevatorPanel.setVelocity( 0, -elevatorVelocity ); else if ( location.equals( SECOND_FLOOR_NAME ) ) elevatorPanel.setVelocity( 0, elevatorVelocity ); // begin moving Elevator and play Elevator music elevatorPanel.setMoving( true ); if ( elevatorClip != null ) elevatorClip.play(); elevatorMusic.play(); } // end method elevatorDeparted // invoked when Elevator has arrived at destination Floor public void elevatorArrived( ElevatorMoveEvent moveEvent ) { // stop Elevator and music elevatorPanel.setMoving( false ); elevatorMusic.getSequencer().stop(); double xPosition = elevatorPanel.getPosition().getX(); double yPosition;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -